Nginx 是一个Web服务器和反向代理服务器,用于Http、Https、SMTP、POP3 和 IMAP协议
特性包括:反向代理/L7负载均衡器、切入式Perl解释器、动态二进制升级、可用于重新编写URL,具有非常好的PCRE支持
1)轻量级,同样起web 服务,比apache 占用更少的内存及资源
2)抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能
3)高度模块化的设计,编写模块相对简单
4)最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程
一个主进程,多个工作进程,每个工作进程可以处理多个请求,每进来一个request,会有一个worker进程去处理。但不是全程处理,处理到可能发生阻塞的地方,比如向上游(后端)服务器转发request,并等待请求返回。那么,这个处理的worker继续处理其他请求,而一旦上游服务器返回了,就会触发这个事件,worker才会来接手,这个request才会接着往下走。由于web server 的工作性质决定了每个request的大部分生命都在网络传输中,实际上花费在server机器上的时间片不多,这是几个进程就解决高并发的秘密所在,即webserver刚好属于网络io密集型应用,不算计算密集型
Nginx使用反应器模式,主事件循环等待操作系统发出准备事件的信号,这样数据就可以从套接字读取,在该实例中读取到缓冲区并进行处理,单个线程可以提供数万个并发连接
反向代理服务器可以隐藏源服务器的存在和特征。它充当互联网云和web服务器之间的中间层。
server {
listen 80;
server_name "";
return 4444;
}
这里服务器名被保留为一个空字符串,它将在没有“主机”头字段的情况下匹配请求,而一个特殊的Nginx的非标准代码444被返回,从而终止连接
- 用来配置虚拟主机
#基于域名的虚拟主机
server {
listen 80; #监听端口
server_name a.com; #监听域名
location / {
root /var/www/a.com; #根目录定位
index index.html;
}
}
#基于端口的虚拟主机配置 访问 192.xxx.xx.xxx:8080
server {
listen 8080; #监听8080端口
server_name 192.xxx.xx.xxx; #服务器IP地址
location / {
root /var/www/html8080;
index index.html;
}
}- 日志管理配置
#不同的server可以使用不同的log
#此处定义了日志格式,最好定位在顶层,方便其他server公用
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
$remote_addr 用户ip
$remote_user [$time_local] 用户访问时间
$request 请求类型 get,post...
$status 请求状态 200 304...
$body_bytes_sent 请求的内容有多少字节
$http_referer 上一个页面来自哪里(从哪里跳转过来)
$http_user_agent 用户代理(用了什么浏览器访问)
#这说明 该server, 它的访问日志的文件,使用的格式main格式.
access_log logs/host.access.log main;另外可以写一个sh脚本,每天半夜切分log日志,避免log每天累积造成文件过大
#!/bin/bash
base_path='/usr/local/nginx/logs'
log_path=$(date -d yesterday +"%Y%m")
day=$(date -d yesterday +"%d")
mkdir -p $base_path/$log_path
mv $base_path/access.log $base_path/$log_path/access_$day.log
#echo $base_path/$log_path/access_$day.log
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
#Crontab 编辑定时任务
01 00 * * * /xxx/path/b.sh 每天0时1分(建议在02-04点之间,系统负载小)
- 配置定位
#location 的语法
location [=|~|~*|^~] patt {
...
}
#中括号可以不写任何参数,此时称为一般匹配
#也可以写参数
#因此,大类型可以分为3种
#首先看有没有精准匹配,如果有,则停止匹配过程,若没有向下匹配到最符合的location
location = patt {} #[精准匹配]
location patt{} #[一般匹配]
location ~ patt{} #[正则匹配]- 配置反向代理和负载均衡
http {
...
#负载均衡服务器池
upstream xxx {
server 127.xx.xx.xx1;
server 127.xx.xx.xx2;
}
server {
liseten 80;
server_name localhost;
location / {
#用户真实IP
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://xxx #upstream 对应自定义名称
include proxy.conf;
}
}
}