nginx.conf 详解
结构
- main (全局配置)
- event (配置工作模式以及连接数)
- http (http模块相关配置)
- server (虚拟主机配置,可以配置多个虚拟主机)
- location (路由规则)
- upstream (集群,内网服务器)
- server (虚拟主机配置,可以配置多个虚拟主机)
参数
# 设置worker进程的用户,指的linux中的用户,涉及到nginx操作目录或文件的一权限,默认为 nobody
#user nobody;
# worker进程工作数设置,CPU有几个,就可以设置几个,或者设置为N-1也行
worker_processes 1;
# 错误日志级别 debug | info | notice | warn | error | crit | alert | emerg ,错误级别从左到右越来越大
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
# 默认使用epoll多路复用IO模型
use epoll;
# 每个workder允许连接的客户端最大连接数
worker_connections 10240;
}
http {
# include 导入外部mime.types(请求类型)文件
include mime.types;
# 配置默认type类型
default_type application/octet-stream;
# $remote_addr 客户端ip
# $remote_user 远程客户端用户名,一般为:’-’
# $time_local 时间和时区
# $request 请求的url以及method
# $status 响应状态码
# $body_bytes_send 响应客户端内容字节数
# $http_referer 记录用户从哪个链接跳转过来的
# $http_user_agent 用户所使用的代理,一般来时都是浏览器
# $http_x_forwarded_for 通过代理服务器来记录客户端的ip
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
# 使用高效文件传输,提升传输性能。启用后才能使用 tcp_nopush ,是指当数据表累积一定大小后才发送,提高了效率
sendfile on;
# tcp_nopush on;
# 设置客户端与服务端请求的超时时间,保证客户端多次请求的时候不会重复建立新的连接,节约资源损耗
# keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
# 虚拟主机配置
server {
# 监听端口号
listen 80;
# 虚拟主机名称
# 如果同时匹配多个,按下列1,2,3,4顺序规则确定主机。和server顺序无关
# 1.精确名称
# 2.以星号开头最长的通配符名称,例如*.example.org”
# 3.以星号结尾的最长通配符名称,例如mail.*
# 4.第一个匹配的正则表达式(按配置文件中配置的顺序)
server_name localhost;
#允许跨域请求的域,*代表所有
add_header 'Access-Control-Allow-Origin' *;
#允许带上cookie请求
add_header 'Access-Control-Allow-Credentials' 'true';
#允许请求的方法,比如 GET/POST/PUT/DELETE
add_header 'Access-Control-Allow-Methods' *;
#允许请求的header
add_header 'Access-Control-Allow-Headers' *;
#对源站点验证
valid_referers *.wangjialun.top;
#非法引入会进入下方判断
if ($invalid_referer) {
return 404;
}
# 路由
location / {
root html;
index index.html index.htm;
# expires 浏览器缓存
expires 10s;
}
# 错误页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
# 配置上游服务器 默认轮询
upstream tomcats {
server 192.168.31.96:8088;
server 192.168.31.226:8088;
server 192.168.31.23:8088;
}
server {
listen 80;
server_name www.shop.com;
location / {
proxy_pass http://tomcats;
}
}
}
备注
-
路由 root 与 alias 区别
假如服务器路径为:/home/resource/files/img/face.png root
- 路径完全匹配访问 配置的时候为:
location /resource { root /home }
用户访问的时候请求为: url:port/resource/files/img/face.png
-
alias 可以为你的路径做一个别名,对用户透明 配置的时候为:
location /hello { alias /home/resource }
用户访问的时候请求为: url:port/hello/files/img/face.png ,如此相当于为目录 resource 做一个自定义的别名。
- 路径完全匹配访问 配置的时候为:
-
Gzip压缩
开启gzip压缩功能,目的:提高传输效率,节约带宽
gzip on; # 限制最小压缩,小于1字节文件不会压缩 gzip_min_length 1; # 定义压缩级别(压缩比,文件越大,压缩越多,cpu使用率也会提高) gzip_comp_level 3; # 定义压缩文件的类型 gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
-
location 的匹配规则
-
空格
:默认匹配,普通匹配location / { root /home; }
-
=
:精确匹配location = /resource/img/face1.png { root /home; }
-
~*
:匹配正则表达式,不区分大小写#符合图片的显示 location ~* \.(GIF|jpg|png|jpeg) { root /home; }
-
~
:匹配正则表达式,区分大小写#GIF必须大写才能匹配到 location ~ \.(GIF|jpg|png|jpeg) { root /home; }
-
^~
:以某个字符路径开头location ^~ /resource/img { root /home; }
-
-
跨域支持
#允许跨域请求的域,*代表所有 add_header 'Access-Control-Allow-Origin' *; #允许带上cookie请求 add_header 'Access-Control-Allow-Credentials' 'true'; #允许请求的方法,比如 GET/POST/PUT/DELETE add_header 'Access-Control-Allow-Methods' *; #允许请求的header add_header 'Access-Control-Allow-Headers' *;
-
防盗链配置支持
#对源站点验证 valid_referers *.wangjialun.top; #非法引入会进入下方判断 if ($invalid_referer) { return 404; }
-
upstream 集群配置
#配置上游服务器 upstream tomcats { server 192.168.31.96:8088 down; server 192.168.31.226:8088; server 192.168.31.23:8088; } server { listen 80; server_name www.shop.com; location / { proxy_pass http://tomcats; } }
常用指令
指令 介绍 weight 默认是1,数值越小,权重越小 down 用于标记服务节点不可用 backup 表示当前服务器节点是备用机,只有在其他的服务器都宕机以后,自己才会加入到集群中,被用户访问。不能在 hash 和 random load balancing 中使用。 max_conns 最大连接数 max_fails 表示失败几次,则标记server已宕机,剔出上游服务。 fail_timeout 表示失败的重试时间, 配合max_fails 使用 slow_start 设置服务器权重从0恢复到标准值的时间 -
配置keepalived提供吞吐量
-
keepalived : 设置长连接处理的数量
-
proxy_http_version :设置长连接http版本为1.1
-
proxy_set_header :清除connection header 信息
upstream tomcats { server 192.168.31.96:8088; server 192.168.31.226:8088; server 192.168.31.23:8088; # 设置长连接处理的数量 keepalive 32; } server { listen 80; server_name www.shop.com; location / { proxy_pass http://tomcats; # 设置长连接http版本为1.1 proxy_http_version 1.1; # 清除connection header 信息 proxy_set_header Connection ""; } } }
-
-
ip_hash
通过客户端请求ip的前三段进行hash求模,再通过hash值选择后端server。
当需要某ip一直请求同一台服务器时候,例如分片上传文件场景。
注意: 当需要删除某台服务器时候,使用down,不可以直接删除。
直接删除hash会重新计算,会导致用户会话,缓存失效等很多问题。upstream tomcats { ip_hash; server 192.168.31.96:8088; server 192.168.31.226:8088; server 192.168.31.23:8088; }
-
url_hash 和 least_conn
根据每次请求的url地址,hash后访问到固定的服务器节点
upstream tomcats { # url_hash hash $request_uri; # 最少连接数 # least_conn server 192.168.31.96:8088; server 192.168.31.226:8088; server 192.168.31.23:8088; }
-
一致性hash
当某台务器宕机后,hash也会重新计算,导致很多问题。可以配置一致性hash算法
理解成一个hash闭环,用户和服务器都hash后落在环上。访问通过顺时针命中最近的服务器,当某台服务器宕机,访问落在下一台上面。不会整个重新hash取模对其他区域造成影响。- server_id_ 字段,如果配置id字段,则使用id字段作为server标识,否则使用server ip和端口作为server标识,
- 使用id字段可以手动设置server的标识,比如一台机器的ip或者端口变化,id仍然可以表示这台机器。使用id字段
- 可以减低增减服务器时hash的波动。
- server weight 字段,作为server权重,对应虚拟节点数目
- 具体算法,将每个server虚拟成n个节点,均匀分布到hash环上,每次请求,根据配置的参数计算出一个hash值,在hash环
- 上查找离这个hash最近的虚拟节点,对应的server作为该次请求的后端机器。
- 该模块可以根据配置参数采取不同的方式将请求均匀映射到后端机器,比如:
consistent_hash $remote_addr
:可以根据客户端ip映射consistent_hash $request_uri
: 根据客户端请求的uri映射consistent_hash $args
:根据客户端携带的参数进行映射
安装 ngx_http_upstream_consistent_hash 第三方模块:
- 下载解压 https://github.com/replay/ngx_http_consistent_hash
- 添加模块
./configure --add-module=/{目录}/ngx_http_consistent_hash-master
- make
- make install
upstream test { consistent_hash $request_uri; server 192.168.31.96:8088 id=1001 weight=3; server 192.168.31.226:8088 id=1002 weight=10; server 192.168.31.23:8088 id=1003 weight=20; }
- server_id_ 字段,如果配置id字段,则使用id字段作为server标识,否则使用server ip和端口作为server标识,
-
反向代理缓存
主要缓存上游的资源文件到nginx中
# 配置上游服务器 upstream tomcats { server 192.168.31.96:8088; server 192.168.31.226:8088; server 192.168.31.23:8088; } # proxy_cache_path 设置缓存保存的目录 # keys_zone 设置共享内存以及占用空间大小 # max_size 设置缓存大小 # inactive 超过此时间则缓存自动清理 # use_temp_path 临时目录,使用后会影响nginx性能 proxy_cache_path /usr/local/nginx/upstream_cache keys_zone=myNginxCache:5m max_size=1g inactive=30s use_temp_path=off; server { listen 80; server_name www.shop.com; # 开启并使用myNginxCache缓存 proxy_cache myNginxCache; # 针对200 304 状态码的缓存设置过期时间 proxy_cache_valid 200 304 8h; location / { proxy_pass http://tomcats; } }
-
配置HTTPS域名证书
- 安装SSL模块(通过nginx -V 检查下有没有安装过,安装过则省略)
- 新增ssl模块(原来的那些模块需要保留)
./configure \ --prefix=/usr/local/nginx \ --pid-path=/var/run/nginx/nginx.pid \ --lock-path=/var/lock/nginx.lock \ --error-log-path=/var/log/nginx/error.log \ --http-log-path=/var/log/nginx/access.log \ --with-http_gzip_static_module \ --http-client-body-temp-path=/var/temp/nginx/client \ --http-proxy-temp-path=/var/temp/nginx/proxy \ --http-fastcgi-temp-path=/var/temp/nginx/fastcgi \ --http-uwsgi-temp-path=/var/temp/nginx/uwsgi \ --http-scgi-temp-path=/var/temp/nginx/scgi \ --with-http_ssl_module
- 编译和安装
make
make install
- 域名证书下载后,解压上传
*.crt
和 私钥*.key
到 /usr/local/nginx/conf 目录中 - 新加一个server监听443的端口
server { listen 443; server_name www.wangjialun.top; # 开启ssl ssl on; # 配置ssl证书 同级目录,直接填写相对路径就行 ssl_certificate 1_www.wangjialun.top_bundle.crt; # 配置证书秘钥 ssl_certificate_key 2_www.wangjialun.top.key; # ssl会话cache ssl_session_cache shared:SSL:1m; # ssl会话超时时间 ssl_session_timeout 5m; # 配置加密套件,写法遵循 openssl 标准 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; ssl_prefer_server_ciphers on; location / { proxy_pass http://tomcats/; index index.html; } }
- 安装SSL模块(通过nginx -V 检查下有没有安装过,安装过则省略)