ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

nginx(二) -- nginx配置文件

nginx(二) -- nginx配置文件 位置/usr/local/nginx/conf/nginx.conf1. 下载后原版nginx.conf注意看到配置文件的第一件事就是备份#user nobody;worker_processes1;#error_log logs/error.log;#error_log logs/error.log notice;#error_log logs/error.log info;#pid logs/nginx.pid;events{worker_connections1024;}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 on;#tcp_nopush on;#keepalive_timeout 0;keepalive_timeout65;#gzip on;server{listen80;server_name localhost;#charset koi8-r;#access_log logs/host.access.log main;location /{root html;index index.html index.htm;}#error_page 404 /404.html;# redirect server error pages to the static page /50x.html#error_page500502503504/50x.html;location/50x.html{root html;}# proxy the PHP scripts to Apache listening on 127.0.0.1:80##location ~ \.php$ {# proxy_pass http://127.0.0.1;#}# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000##location ~ \.php$ {# root html;# fastcgi_pass 127.0.0.1:9000;# fastcgi_index index.php;# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;# include fastcgi_params;#}# deny access to .htaccess files, if Apaches document root# concurs with nginxs one##location ~ /\.ht {# deny all;#}}# another virtual host using mix of IP-, name-, and port-based configuration##server {# listen 8000;# listen somename:8080;# server_name somename alias another.alias;# location / {# root html;# index index.html index.htm;# }#}# HTTPS server##server {# listen 443 ssl;# server_name localhost;# ssl_certificate cert.pem;# ssl_certificate_key cert.key;# ssl_session_cache shared:SSL:1m;# ssl_session_timeout 5m;# ssl_ciphers HIGH:!aNULL:!MD5;# ssl_prefer_server_ciphers on;# location / {# root html;# index index.html index.htm;# }#}}1.1 配置文件总共分为三个部分全局块events块http块2. 全局块从配置文件开始到 events 块之间的内容主要会设置一些影响 nginx 服务器整体运行的配置指令主要包括配置运行 Nginx 服务器的用户组、允许生成的 worker process 数进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等#user nobody;# Nginx 服务器并发处理服务的关键配置worker_processes 值越大# 可以支持的并发处理量也越多但是会受到硬件、软件等设备的制约worker_processes1;#error_log logs/error.log;#error_log logs/error.log notice;#error_log logs/error.log info;#pid logs/nginx.pid;3. events块events 块涉及的指令主要影响Nginx 服务器与用户的网络连接常用的设置包括是否开启对多 work process 下的网络连接进行序列化是否允许同时接收多个网络连接选取哪种事件驱动模型来处理连接请求每个 word process 可以同时支持的最大连接数等events{# 表示每个 work process 支持的最大连接数为 1024worker_connections1024;}4. http块这算是 Nginx 服务器配置中最频繁的部分代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。需要注意的是http 块也可以包括 http 全局块、server 块4.1 http 全局块http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。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 on;#tcp_nopush on;#keepalive_timeout 0;keepalive_timeout65;#gzip on;server{...}}4.2 server 块这块和虚拟主机有密切关系虚拟主机从用户角度看和一台独立的硬件主机是完全一样的该技术的产生是为了节省互联网服务器硬件成本。每个 http 块可以包括多个 server 块而每个 server 块就相当于一个虚拟主机。而每个 server 块也分为全局 server 块以及可以同时包含多个 locaton 块server{listen80;# 监听端口号server_name localhost;# 服务名称#charset koi8-r;#access_log logs/host.access.log main;location /{root html;index index.html index.htm;}#error_page 404 /404.html;# redirect server error pages to the static page /50x.html#error_page500502503504/50x.html;location/50x.html{root html;}# proxy the PHP scripts to Apache listening on 127.0.0.1:80##location ~ \.php$ {# proxy_pass http://127.0.0.1;#}# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000##location ~ \.php$ {# root html;# fastcgi_pass 127.0.0.1:9000;# fastcgi_index index.php;# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;# include fastcgi_params;#}# deny access to .htaccess files, if Apaches document root# concurs with nginxs one##location ~ /\.ht {# deny all;#}}5. 线上常用的一些配置下面按生产场景分类整理 Nginx 线上真正会高频用到的配置适合直接拿来写 nginx.conf 或拆分到 conf.d/5.1 全局性能基础配置线上一般会先把进程、连接、事件模型调好保证 Nginx 本身能扛住并发。worker_processes auto;worker_rlimit_nofile 65535;events{use epoll;worker_connections 10240;multi_accept on;}重点5.2 反向代理通用参数线上反向代理几乎都会配这些主要是为了把真实客户端信息传给后端并控制超时。proxy_http_version 1.1;proxy_set_header Connection;proxy_set_header Host$host;proxy_set_header X-Real-IP$remote_addr;proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto$scheme;proxy_connect_timeout 5s;proxy_send_timeout 60s;proxy_read_timeout 60s;重点X-Real-IP、X-Forwarded-For后端获取真实客户端 IPX-Forwarded-Proto后端判断原始请求是 HTTP 还是 HTTPSproxy_http_version 1.1 Connection “”配合 upstream 长连接减少频繁建连超时不能全部设太大否则一个慢后端可能拖垮 Nginx5.3 负载均衡 upstream 配置线上后端通常不止一个实例会用 upstream 做负载均衡。upstream backend{least_conn;server 10.0.0.11:8080 max_fails3 fail_timeout30s;server 10.0.0.12:8080 max_fails3 fail_timeout30s;server 10.0.0.13:8080 backup;keepalive 32;keepalive_requests 1000;keepalive_timeout 60s;}常用策略max_fails 和 fail_timeout 属于被动健康检查连续失败达到次数后一段时间内不再转发到该节点。5.4 server 和 location 路由配置线上常见结构是静态资源直接由 Nginx 处理接口请求转发到后端。server{listen 80;server_name www.example.com;location/static/{root/data/www;expires 30d;add_header Cache-Controlpublic;}location/api/{proxy_pass http://backend;}}注意root 是拼接路径alias 是替换路径proxy_pass 末尾有没有 /会影响路径转发规则线上容易踩坑5.5 动静分离配置前端静态资源一般不让后端处理直接交给 Nginx。location ~*\.(js|css|png|jpg|jpeg|gif|svg|ico|woff2)${root/var/www/site/static;expires 30d;add_header Cache-Controlpublic;access_log off;}线上价值降低后端压力提高静态资源响应速度减少带宽消耗浏览器缓存命中后请求根本不会到后端5.6 Gzip 压缩配置文本类资源适合开启 Gzip接口响应、JS、CSS、JSON 都能受益。gzip on;gzip_min_length 1k;gzip_comp_level 4;gzip_vary on;gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xmlrss text/javascript;注意图片、视频、压缩包通常已经压缩过不建议重复 Gzipgzip_comp_level 不建议设太高CPU 消耗会增加一般 3~6 比较合适gzip_min_length 太小的文件压缩收益不大5.7 限流防刷配置线上接口、登录、短信、支付前校验等场景通常都会做限流。limit_req_zone$binary_remote_addrzoneapi_limit:10m rate20r/s;limit_conn_zone$binary_remote_addrzoneconn_limit:10m;server{location/api/{limit_req zoneapi_limit burst40 nodelay;limit_conn conn_limit 20;proxy_pass http://backend;}}重点rate20r/s每个 IP 每秒允许 20 个请求burst40允许突发排队nodelay突发请求不延迟处理limit_conn限制单个 IP 并发连接数线上要注意不能卡得太死否则正常用户也会被拦截。5.8 代理缓存配置如果某些接口内容短时间内不会变化可以让 Nginx 缓存后端响应。proxy_cache_path/tmp/nginx_cache levels1:2 keys_zoneapi_cache:10m max_size1g inactive10m use_temp_pathoff;server{location/api/public/{proxy_cache api_cache;proxy_cache_valid 200 10m;proxy_cache_key$scheme$host$request_uri;proxy_pass http://backend;}}线上要注意带用户登录态、个性化数据的接口不要随便缓存缓存 key 要设计合理避免不同用户拿到同一份缓存适合公开数据、列表数据、不频繁变化的查询接口5.9 HTTPS / SSL 配置线上对外服务基本都会上 HTTPS。server{listen 443 ssl http2;server_name www.example.com;ssl_certificate/etc/nginx/ssl/example.com.pem;ssl_certificate_key/etc/nginx/ssl/example.com.key;ssl_session_cache shared:SSL:10m;ssl_session_timeout 10m;ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers HIGH:!aNULL:!MD5;location/{proxy_pass http://backend;}}重点不要开 TLSv1、TLSv1.1ssl_session_cache 可以减少 SSL 握手开销如果有 HTTP 跳转 HTTPS通常再加一个 80 端口 server 做 301 跳转5.10 安全加固配置线上 Nginx 不能只考虑转发还要考虑暴露面。server_tokens off;client_max_body_size 10m;location ~*/\.(git|svn|env|DS_Store)${deny all;}location/admin{allow 10.0.0.0/8;allow 172.16.0.0/12;deny all;proxy_pass http://backend;}常见加固项5.11 日志配置线上排查问题离不开日志建议自定义访问日志格式。log_format main$remote_addr - $remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for $request_time $upstream_response_time;access_log/var/log/nginx/access.log main;error_log/var/log/nginx/error.log warn;建议记录客户端真实 IP请求路径和状态码User-AgentX-Forwarded-Forrequest_timeNginx 处理总耗时upstream_response_time后端响应耗时这两个时间字段线上排查慢接口非常有用。5.12 高可用 Keepalived VIP单台 Nginx 存在单点风险线上通常会做主备。# 不是 nginx.conf而是 keepalived 配置vrrp_instance VI_1{state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 virtual_ipaddress{192.168.1.100}}思路两台 Nginx一主一备Keepalived 管理一个 VIP主节点挂了VIP 漂到备节点客户端始终访问 VIP注意两台机器要在同一个二层网络否则 VIP 漂移可能异常。5.13 灰度发布配置线上发版时常会先放一小部分流量到新版本。split_clients${remote_addr}${request_uri}$upstream_pool{10% backend_v2;*backend_v1;}upstream backend_v1{server 10.0.0.11:8080;}upstream backend_v2{server 10.0.0.12:8080;}server{location/{proxy_pass http://$upstream_pool;}}效果约 10% 流量进入 backend_v2其余流量进入 backend_v1观察稳定后再逐步调大比例5.14 线上配置更新流程线上改 Nginx 配置不能直接 reload标准流程是nginx-t语法检查通过后再nginx-s reload或者systemctl reload nginx好处是不会直接中断现有连接新 worker 使用新配置旧 worker 处理完已有请求后退出5.15 线上配置分层建议生产环境不建议把所有配置都塞进一个 nginx.conf可以这样拆/opt/app/nginx/conf/├── nginx.conf └── conf.d/ ├── proxy_params.conf ├── upstream.conf ├── web.conf ├── api.conf └── ssl.conf主配置里引入http{include conf.d/proxy_params.conf;include conf.d/upstream.conf;include conf.d/*.conf;}这样更清晰也方便按业务、环境、域名维护。5.16 线上常用配置速查掌握这些配置后线上 Nginx 基本就能覆盖反向代理、负载均衡、动静分离、HTTPS、限流、缓存、日志、安全加固、灰度、高可用这些核心场景。TODO消化https://blog.csdn.net/weixin_42167759/article/details/85049546https://www.cnblogs.com/xuey/p/7631690.html自己项目中的配置
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进