Nginx 作为一个高性能的 Web 服务器和反向代理服务器,性能优化是我们日常运维和开发中不可避免的一个话题。
许多开发者安装完 Nginx 后就直接使用,但如果不进行针对性的优化,可能会在高并发、大流量的情况下遇到性能瓶颈。今天我们就来聊聊几个 Nginx 性能优化的关键点。
首先,在 Nginx 配置层面,我们可以从进程管理、连接数、协议优化等方面入手。Nginx 的 worker_processes
参数默认是 auto
,这个值通常应该设置为 CPU 核心数,以便充分利用多核处理能力。
而 worker_connections
控制每个 worker 进程能同时处理的最大连接数,这个值应根据服务器的资源进行合理调整。
worker_processes auto;
events {
worker_connections 10240;
}
此外,Nginx 近年来已经完全支持 HTTP/2,开启后可以带来多路复用、头部压缩等优势,提高网页加载速度。
server {
listen 443 ssl http2;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
}
然后,缓存的使用可以极大降低后端服务器的负载。Nginx 提供了 proxy_cache
来缓存后端服务器的响应,合理配置缓存策略能够减少重复请求,提高性能。
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
server {
location / {
proxy_cache my_cache;
proxy_pass http://backend;
}
}
文件缓存的层级和大小要根据具体的业务需求来配置,防止缓存命中率过低或者磁盘空间占用过大。
在传输优化方面,Nginx 内置了 Gzip 和 Brotli(需要额外模块)两种压缩方式,可以显著减少响应体大小,提高传输速度。
gzip on;
gzip_types text/plain application/xml application/json application/javascript text/css;
gzip_comp_level 6;
gzip_min_length 256;
不同的 gzip_comp_level
值影响 CPU 占用和压缩比,通常 5-6 之间可以取得较好的平衡。
安全性优化也是我们必须要考虑的一部分。Nginx 默认会在错误页面和 HTTP 头信息中显示版本号,这可能会带来潜在的安全风险,可以通过 server_tokens off;
进行隐藏。
server_tokens off;
如果想要更彻底地隐藏版本信息,甚至可以修改 Nginx 源码并重新编译,但一般来说,通过配置文件隐藏已经足够。
日志和监控也是 Nginx 运行过程中需要重点关注的部分。Nginx 的 access.log
和 error.log
记录了服务器的请求情况和错误信息,结合 ELK(Elasticsearch + Logstash + Kibana)或 Prometheus + Grafana,可以实时分析和监控流量、错误率等关键指标。
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
在系统层面,我们也可以做一些优化。例如,提高文件描述符的最大数量,防止 Nginx 在高并发时因为文件句柄数受限而崩溃。
echo "fs.file-max = 65535" >> /etc/sysctl.conf
sysctl -p
另外,在高并发场景下,优化 TCP 连接队列大小,可以减少连接超时问题。
echo "net.core.somaxconn = 1024" >> /etc/sysctl.conf
sysctl -p
Nginx 还可以通过负载均衡策略来分担服务器压力,例如 least_conn
(最少连接)策略,能让请求尽可能均衡地分布在后端服务器上。
upstream backend {
least_conn;
server backend1.example.com;
server backend2.example.com;
}
server {
location / {
proxy_pass http://backend;
}
}
对于健康检查,我们可以使用 nginx_upstream_check_module
,定期探测后端服务器的健康状况,避免将流量分发给不可用的服务器。
upstream backend {
server backend1.example.com check;
server backend2.example.com check;
}
以上就是 Nginx 优化的一些常见方法,包括配置优化、缓存策略、压缩策略、安全性优化、系统优化和负载均衡。
对于 Java 开发者来说,Nginx 通常和 Spring Boot、Spring Cloud 等框架一起使用,合理的 Nginx 优化能够极大提高服务的稳定性和性能。