Nginx配置文件详解
1. 模型
master进程: 主进程。监控worker进程。
worker进程: 工作进程。相互独立。与客户端交互,每个client有个accept_mutex锁,worker们去抢占锁,然后处理。
通信机制: 异步非阻塞epoll。多路复用。
2. nginx.conf
# nginx进程的用户
#user nobody;
# worker的数量
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文件位置
#pid logs/nginx.pid;
events {
# 默认使用
# use epoll;
# 默认为1024,每个worker允许连接的最大连接数, 与cpu、内存有关,酌情设置。
worker_connections 10240;
}
http {
include mime.types;
default_type application/octet-stream;
#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;
# 一般配合使用,sendfile代表高效文件传输开启。tcp_nopush代表积累到一定大小才发送,减少交互提升效率。
sendfile on;
#tcp_nopush on;
# 请求超时时间,在此时间内如果重复请求,则不会建立新的链接。节省资源。
#keepalive_timeout 0;
keepalive_timeout 65;
gzip on;
# 限制最小压缩,小于一个字节的文件就不会被压缩
gzip_min_length 1;
# 定义压缩级别,压缩比。文件越大,压缩越多,但是cpu使用越多。
gzip_comp_level 3;
# 定义压缩文件类型
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png application/json;
server {
# 监听端口
listen 80;
# 服务器域名或者IP
server_name localhost;
#charset koi8-r;
# HTTP请求的日志
#access_log logs/host.access.log main;
location / {
# 这里是相对路径,也就是nginx文件的路径。
root html;
# 指定主页
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
include static_resource.conf;
}
其中,日志输出格式:
$remote_addr 客户端ip
$remote_user 远程客户端用户名,一般为:’-’
$time_local 时间和时区
$request 请求的url以及method
$status 响应状态码
$body_bytes_send 响应客户端内容字节数
$http_referer 记录用户从哪个链接跳转过来的
$http_user_agent 用户所使用的代理,一般来时都是浏览器
$http_x_forwarded_for 通过代理服务器来记录客户端的ip
location匹配规则:
location 的匹配规则
空格:默认匹配,普通匹配
location / {
root /home;
}
=:精确匹配
location = /qzh/img/face1.png {
root /home;
}
~*:匹配正则表达式,不区分大小写
#符合图片的显示
location ~* \.(GIF|jpg|png|jpeg) {
root /home;
}
~:匹配正则表达式,区分大小写
#GIF必须大写才能匹配到
location ~ \.(GIF|jpg|png|jpeg) {
root /home;
}
^~:以某个字符路径开头
location ^~ /qzh/img {
root /home;
}
解决跨域问题:1.JSONP 2.Spingboot的CorsFilter 3.Nginx方式
#允许跨域请求的域,*代表所有
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' *;
图片资源防盗链: 防止其他站点去访问你的图片等资源。这样的话,就只能在*.qzh.com的域名下访问该资源。
#对源站点验证
valid_referers *.qzh.com;
#非法引入会进入下方判断
if ($invalid_referer) {
return 404;
}
3. upstream详解
配置服务器集群:我们通过访问 www.tomcats.com就可以访问集群了
upstream tomcats {
server 192.168.1.121:8080;
server 192.168.1.122:8080;
server 192.168.1.123:8080;
}
server {
# 监听端口
listen 80;
# 服务器域名或者IP
server_name www.tomcats.com;
location / {
proxy_pass http://tomcats;
}
}
负载均衡:默认-轮询方式,一个个平均分给服务器
加权轮询 weight默认为1:
upstream tomcats {
server 192.168.1.121:8080 weight=1;
server 192.168.1.122:8080 weight=2;
server 192.168.1.123:8080 weight=5;
}
server {
# 监听端口
listen 80;
# 服务器域名或者IP
server_name www.tomcats.com;
location / {
proxy_pass http://tomcats;
}
}
max_conns参数:如果处理并发过多,就会报502Gateway错误,可用于限流保护服务器。
# worker的数量
worker_processes 1;
upstream tomcats {
server 192.168.1.121:8080 max_conns=2;
server 192.168.1.122:8080 max_conns=2;
server 192.168.1.123:8080 max_conns=2;
}
slow_start参数:控制流量从少到多,weight从0慢慢升到n (商业版本)
该参数不能使用在hash和random load balancing中。
如果在 upstream 中只有一台 server,则该参数失效。
# worker的数量
worker_processes 1;
upstream tomcats {
server 192.168.1.121:8080 weight=6 slow_start=60s;
server 192.168.1.122:8080 weight=2;
server 192.168.1.123:8080 weight=2;
}
down参数:表示该服务器用不了,nginx就不会去分发给他。
upstream tomcats {
server 192.168.1.121:8080 down;
server 192.168.1.122:8080 weight=1;
server 192.168.1.123:8080 weight=1;
}
backup参数:备用机的意思,一开始不会被用户访问到。除非一台挂掉以后,才能访问。
upstream tomcats {
server 192.168.1.121:8080 backup;
server 192.168.1.122:8080 weight=1;
server 192.168.1.123:8080 weight=1;
}
max_fails参数:默认1 。最大失败次数,到达了就认为当前server宕机,nginx就会把这台剔除。其他请求就不会访问到该server。
fail_timeout参数:默认10秒。配合max_fails参数使用,在上述那台server宕机后,fail_timeout秒内,如果有新的请求,是不会发到那台server上的,过了这段时间,会尝试再请求那台server,如果还是不行,就继续重复步骤。
upstream tomcats {
server 192.168.1.121:8080 max_fails=2 fail_time out=1s;
server 192.168.1.122:8080 weight=1;
server 192.168.1.123:8080 weight=1;
}
keepalive提高吞吐量:
upstream tomcats {
server 192.168.1.121:8080 max_fails=2 fail_time out=1s;
server 192.168.1.122:8080 weight=1;
server 192.168.1.123:8080 weight=1;
# 长连接处理的数量
keepalive 32;
}
server {
# 监听端口
listen 80;
# 服务器域名或者IP
server_name www.tomcats.com;
location / {
proxy_pass http://tomcats;
# 1.1代表长链接的http版本号
proxy_http_version 1.1;
# 清除Connection里面的信息
proxy_set_header Connection "";
}
}
4. 负载均衡ip_hash详解
取模方式请求server,注意:拿到ip前三段。有可能会造成流量涌入同一台,如果临时移除服务器,请使用down标记,不要直接删除,如果直接删除配置代码,会导致会话、hash重新计算。
参考:
http://nginx.org/en/docs/http/ngx_http_upstream_module.html#ip_hash
hash(ip) % node_counts = index
upstream tomcats {
ip_hash;
server 192.168.1.121:8080;
server 192.168.1.122:8080;
server 192.168.1.123:8080;
}
url_hash: 根据uri进行路由到服务器
upstream tomcats {
hash $request_uri;
server 192.168.1.121:8080;
server 192.168.1.122:8080;
server 192.168.1.123:8080;
}
least_conn: 分配到请求数最少的那台
upstream tomcats {
least_conn;
server 192.168.1.121:8080;
server 192.168.1.122:8080;
server 192.168.1.123:8080;
}
5. nginx缓存: 浏览器再次访问时,会变为304。
location /static {
alias /home/qzhstatic;
expires 10s;
}
expires指令:
代表晚上22点30分失效
expires @22h30m
代表1小时之前就失效了。
expires -1h;
代表不使用缓存。
expires epoch;
代表默认。无Cache-Control
expires off;
代表max-age为2037年,非常的长。
expires max;
6. Nginx的反向代理缓存
# proxy_cache_path 设置缓存目录
# keys_zone 设置共享内存以及占用空间大小
# max_size 设置缓存大小
# inactive 超过此时间则被清理
# use_temp_path 临时目录,使用后会影响nginx性能
proxy_cache_path /usr/local/nginx/upstream_cache keys_zone=mycache:5m max_size=1g inactive=1m use_temp_path=off;
location / {
proxy_pass http://tomcats;
# 启用缓存,和keys_zone一致
proxy_cache mycache;
# 针对200和304状态码缓存时间为8小时
proxy_cache_valid 200 304 8h;
}