1 、nginx
配置文件构成
一个nginx
配置文件通常包含三个模块:
- 全局块:比如进程数,定义日志路径;
events
块:设置处理轮询事件模型,每个工作进程最大连接数以及http
层的keep-alive
超时时间http
块:路由匹配,静态文件服务器,反向代理,负载均衡等
式例配置
# 全局块
user www-data;
worker_processes 2; ## 默认1,一般建议设成CPU核数1-2倍
error_log logs/error.log; ## 错误日志路径
pid logs/nginx.pid; ## 进程id
# Events块
events {
# 使用epoll的I/O 模型处理轮询事件。
# 可以不设置,nginx会根据操作系统选择合适的模型
use epoll;
# 工作进程的最大连接数量, 默认1024个
worker_connections 2048;
# http层面的keep-alive超时时间
keepalive_timeout 60;
# 客户端请求头部的缓冲区大小
client_header_buffer_size 2k;
}
# http块
http {
include mime.types; # 导入文件扩展名与文件类型映射表
default_type application/octet-stream; # 默认文件类型
# 日志格式及access日志路径
log_format main '$remote_addr - $remote_user [$time_local] $status '
'"$request" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
# 允许sendfile方式传输文件,默认为off。
sendfile on;
tcp_nopush on; # sendfile开启时才开启。
# http server块
# 简单反向代理
server {
listen 80;
server_name host.com www.host.com;
access_log logs/host.access.log main;
# 转发动态请求到web应用服务器
location / {
proxy_pass http://127.0.0.1:8000;
deny 192.24.40.8; # 拒绝的ip
allow 192.24.40.6; # 允许的ip
}
# 错误页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
# 负载均衡
upstream backend_server {
server 192.168.0.1:8000 weight=5; # weight越高,权重越大
server 192.168.0.2:8000 weight=1;
server 192.168.0.3:8000;
server 192.168.0.4:8001 backup; # 热备
}
server {
listen 80;
server_name big.server.com;
access_log logs/big.server.access.log main;
charset utf-8;
client_max_body_size 10M; # 限制用户上传文件大小,默认1M
location / {
# 使用proxy_pass转发请求到通过upstream定义的一组应用服务器
proxy_pass http://backend_server;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
2、全局模块
全局模块比较简单,参数如下:
###### user
启动nginx
的用户,一般配置成www
,不需要root权限,否则存在安全隐患
worker_processes
工作进程数量,nginx
的模式是master-worker
模式,master
进程负责接受和分配任务,worker进程负责处理master分配的任务,一般worker
进程数为当前cpu
核心数,如果设置过多,操作系统的进程调度切换中有损耗
error_log
错误日志路径logs/error.log
pid
进程id,存放进程id的文件目录logs/nginx.pid
3、events
模块
events模块中包含了nginx
所有处理连接的设置,常用配置如下
events {
use epoll;
accept_mutex on;
multi_accept on;
worker_connections 20000;
client_header_buffer_size 4k;
open_file_cache max=2000 inactive=60s;
open_file_cache_valid 60s;
open_file_cache_min_uses 1;
}
详解如下
###### use
`use`指令用来指定使用连接的处理方法,通常不需要指定,`nginx`会默认使用最有效的方式,常用的有`epoll`,`poll`,`select`等
accept_mutex
设置网络连接序列化,防止惊群现象发生,默认开启
multi_accept
设置是否允许同时接受多个网络连接
worker_connections
设置工作进程的最大连接数,理论上nginx
服务器的最大连接数=worker_connections
* worker_processes
client_header_buffer_size
客户端请求头部的缓冲区大小,这个可以根据你的系统分页来设置,一般请求头的大小不会超过1K
4、http
模块
http
模块分为三个内容
http
模块:配置http
的相关参数,包含多个server
模块- server模块:一个虚拟主机,需配置域名和端口,处理对应主机域名的
http
请求,可包含多个location模块 - location模块:处理对应的具体路径请求
http
常见http
配置
http{
include mime.types;
default_type application/octet-stream;
keepalive_timeout: 65;
}
include
:用来包含另一个文件,mime.types
是default_type
:默认的文件类型keepalive_timeout
:指定每个tcp
连接最多可以保持多长时间,默认是75秒,客户端发送多个请求,每个请求都要建立独立的连接传输数据,http
的keepalive
模式,告诉服务器,处理完一个请求后保持这个tcp
的打开状态,若收到客户端的其他请求,服务端就会利用这个未被关闭的连接
server
配置一个虚拟主机,常见配置为
server {
listen 80;
server_name localhost;
charset koi8-r;
access_log logs/host.access.log main;
# 配置请求地址
location / {
#...
}
# 配置请求地址
location /status/ {
#...
}
error_page 500 502 503 504 /50x.html;
}
- listen:监听端口
- server_name:域名配置
- access_log:日志文件
- location:处理适配的请求
location
用来匹配不同的url
请求,进而对请求做不同的处理和响应
location [= | ~ | ~* | ^~ | /]{
proxy_pass http://127.0.0.1:8080
}
- =:用于精准匹配,请求的字符串与其精准匹配,成功立即处理
~:区分大小写的正则匹配,比如 `location ^~/test$
- /test:匹配成功
- /Test:匹配失败
- /test/:匹配失败
~*:表示不区分大小写的正则匹配,例如
location ~* ^/test$
- /test:匹配成功
- /Test:匹配成功
- /test/:匹配失败
- /a:普通前缀匹配优先级
- /:没有任何匹配成功的都会匹配到这里处理
proxy_pass代理转发,如果proxy_pass后面的url
加了/,表示绝对根路径,如果proxy_pass
后面的url
没有/表示相对路径;
请求示例:http://127.0.0.1/proxy/code.html
location /proxy/{ proxy_pass:http://127.0.0.1:8080/; # 代理到http://127.0.0.1:8080/code.html }
location /proxy/{ proxy_pass:http://127.0.0.1:8080/; # 代理到http://127.0.0.1:8080/proxy/code.html }
location /proxy/{ proxy_pass:http://127.0.0.1:8080/a/; # 代理到proxy_pass:http://127.0.0.1:8080/a/code.html }
location /proxy/{ proxy_pass:http://127.0.0.1:8080/a; #代理到proxy_pass:http://127.0.0.1:8080/aproxy/code.html }
upstream
定义一组服务器,做负载均衡
upstream backend_server {
server 192.168.0.1:8000 weight=5; # weight越高,权重越大
server 192.168.0.2:8000 weight=1;
server 192.168.0.3:8000;
server 192.168.0.4:8001 backup; # 热备
}
默认情况下,nginx
是按照加权轮询的方式,将请求分发到各个服务器,weight越大,承担任务越多
upstream backend_server {
ip_hash;
server 192.168.0.1:8000;
server 192.168.0.2:8000;
}
根据ip
的hash
结果分配,这个每个访客固定访问一个后端服务器,可以解决session的问题
# URL Hash
upstream backend_server {
hash $request_uri;
server 192.168.0.1:8000;
server 192.168.0.2:8000;
}
按照访问的url
的hash
结果来分配请求,使得每个url
定向到同一个后端,后端服务器缓存时比较有效
# Fair
upstream backend_server {
server 192.168.0.1:8000;
server 192.168.0.2:8000;
fair;
}
按照后端服务器的响应时间来分配请求,响应时间短的优先分配,需要编译upstram-fair
这个库