Nginx在Ubuntu下访问慢通常与配置不合理、系统资源未优化、网络传输效率低等因素相关。以下是针对性的解决步骤,覆盖配置调整、缓存优化、系统调优及监控等环节:
Nginx的性能基础在于合理的工作进程(Worker)和连接数设置,需充分利用Ubuntu服务器的多核CPU资源。
worker_processes设为auto(自动匹配CPU核心数),或手动指定为CPU核心数(如worker_processes 4,可通过lscpu命令查看核心数)。events块中,设置worker_connections 1024(每个工作进程的最大并发连接数,可根据服务器内存调整,如16GB内存可设为4096);启用multi_accept on(允许一个工作进程一次接受多个新连接);使用use epoll(Linux下的高效事件模型,提升并发处理能力)。worker_processes auto; events { worker_connections 1024; multi_accept on; use epoll; } 减少传输数据量是提升访问速度的关键,可通过Gzip压缩和零拷贝技术实现。
http块中配置Gzip,压缩文本类内容(如HTML、CSS、JS),降低传输体积。建议设置:gzip on、gzip_types text/plain text/css application/json application/javascript、gzip_comp_level 5(压缩级别,1-9,平衡压缩率与CPU消耗)、gzip_min_length 256(仅压缩大于256字节的响应)。sendfile on指令,让数据直接从磁盘传输到网卡,减少CPU拷贝次数,提升文件传输效率。http { gzip on; gzip_types text/plain text/css application/json application/javascript; gzip_comp_level 5; gzip_min_length 256; sendfile on; } 缓存是提升响应速度的有效手段,需针对静态资源和动态内容分别配置。
expires指令设置浏览器缓存过期时间(如expires 30d),并添加Cache-Control头,让浏览器缓存静态文件(如图片、CSS、JS),减少对服务器的请求。proxy_cache模块缓存响应,减少后端服务器压力。配置proxy_cache_path定义缓存路径(如/var/cache/nginx),并在location块中启用缓存(如proxy_cache my_cache)。# 静态资源缓存 location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { expires 30d; add_header Cache-Control "public, no-transform"; } # 代理缓存 proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off; server { location / { proxy_cache my_cache; proxy_pass http://backend; proxy_cache_valid 200 302 10m; # 200/302状态码缓存10分钟 proxy_cache_valid 404 1m; # 404状态码缓存1分钟 } } Ubuntu系统的内核参数需调整以适应高并发场景,主要涉及网络连接和文件描述符。
/etc/sysctl.conf文件,添加以下配置:net.core.somaxconn = 65535 # 最大待处理连接数 net.ipv4.ip_local_port_range = 1024 65535 # 临时端口范围 net.ipv4.tcp_tw_reuse = 1 # 快速回收TIME-WAIT连接 net.core.netdev_max_backlog = 65535 # 网络设备接收队列长度 fs.file-max = 2097152 # 最大文件描述符数 执行sudo sysctl -p使配置生效。/etc/security/limits.conf,添加:* soft nofile 65535 * hard nofile 65535 重启服务器或重新登录生效。若使用HTTPS,需优化SSL/TLS设置及启用HTTP/2,减少协议开销。
server块中添加listen 443 ssl http2;,利用HTTP/2的多路复用特性,提升并发请求效率。ssl_protocols TLSv1.2 TLSv1.3)、高性能加密套件(ssl_ciphers HIGH:!aNULL:!MD5),并启用会话复用(ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m),减少SSL握手时间。server { listen 443 ssl http2; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; # 其他SSL证书配置... } 若单台服务器无法应对高流量,可通过负载均衡将请求分发到多台服务器,提升整体处理能力。
http块中定义upstream,列出后端服务器(如backend1.example.com、backend2.example.com),并设置权重(weight)分配流量。server块的location中,使用proxy_pass将请求转发到上游服务器组。upstream backend { server backend1.example.com weight=3; # 权重3,承担3/4流量 server backend2.example.com; # 权重1,承担1/4流量 } server { listen 80; location / { proxy_pass http://backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } 持续监控Nginx性能,及时发现并解决瓶颈问题。
nginx.conf中添加stub_status模块,查看Nginx的连接数、请求数等状态:location /nginx_status { stub_status on; allow 127.0.0.1; # 仅允许本地访问 deny all; } 访问http://服务器IP/nginx_status查看状态。log_format记录请求耗时($request_time),使用GoAccess、ELK Stack等工具分析日志,找出慢请求(如响应时间超过1秒的请求)。http { log_format timed '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $request_time'; access_log /var/log/nginx/access.log timed; } 通过以上步骤,可显著提升Ubuntu下Nginx的访问速度。需根据实际服务器配置(如CPU、内存、流量)调整参数,定期监控性能并及时优化。