在高并发场景下,Nginx 的优化配置对于提高性能和稳定性至关重要。以下是一些优化 Nginx 配置的建议:
1. 系统层面优化
- 调整系统文件描述符限制:增大
ulimit
的文件描述符限制,例如ulimit -n 65535
。 - 网络栈优化:调整
tcp_max_syn_backlog
、tcp_fin_timeout
、tcp_tw_reuse
等参数。
2. Nginx 配置文件优化
以下是一些关键的 Nginx 配置参数:
nginx
/etc/nginx/nginx.conf 或其他配置文件
worker进程数,通常设置为CPU核心数
worker_processes auto;
worker连接数
events {
worker_connections 65535; # 或者更高,取决于系统资源
multi_accept on; # 允许一个worker同时接受多个新连接
}
http {
# 开启高效文件传输模式
sendfile on;
tcp_nopush on;
tcp_nodelay on;
# 减少日志写入次数,提高性能
access_log off; # 或者使用buffer和flush参数
error_log /var/log/nginx/error.log warn;
# 开启gzip压缩
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss;
# 开启缓存
proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
# 限制请求体大小
client_max_body_size 10m;
# 优化keepalive连接
keepalive_timeout 65;
keepalive_requests 100;
# 限制每个客户端的并发连接数
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn perip 10;
# 限制请求速率
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
limit_req zone=one burst=5;
# upstream配置
upstream myapp1 {
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
# 负载均衡策略
least_conn;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
# 服务器名称
server_name example.com;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
proxy_pass http://myapp1;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_cache my_cache;
proxy_cache_valid 200 302 60m;
proxy_cache_valid 404 1m;
}
# 其他location块...
}
# 其他server块...
}
3. SSL/TLS 优化
如果使用了 HTTPS,还需要优化 SSL/TLS:
- 使用最新的 TLS 版本。
- 启用 OCSP stapling。
- 使用 ECC 证书(如果客户端支持)。
- 使用
ssl_session_cache
来缓存会话。 - 调整
ssl_session_timeout
。
4. 性能测试
- 使用工具如
ab
(ApacheBench)、wrk
或vegeta
进行压力测试。 - 分析 Nginx 日志和系统性能指标来识别瓶颈。
5. 安全配置
- 限制不必要的请求方法(如只允许 GET、POST)。
- 使用
add_header
添加安全相关的 HTTP 头。 - 防止点击劫持和 SQL 注入等攻击。
记住,优化是一个持续的过程,需要根据实际的使用情况和性能测试结果不断调整配置。同时,确保在每次更改配置后都进行彻底的测试,以避免引入新的问题。