Nginx(发音为"engine x")自2004年由俄罗斯工程师Igor Sysoev发布以来,已经成为全球最受欢迎的Web服务器之一。根据最新统计,全球活跃网站中约有33%使用Nginx,远超Apache的24%。这得益于其独特的事件驱动架构,相比传统的多线程/多进程模型,Nginx在同等硬件条件下可以轻松处理数万并发连接。
我在2013年第一次接触Nginx时就被它的性能所震撼。当时我们有个日均百万PV的新闻站点,从Apache切换到Nginx后,服务器负载直接从5.8降到了1.2,而且内存占用减少了60%。这种提升在流量暴增时尤为明显 - 在突发流量来临时,Nginx能保持稳定响应,而Apache经常出现503错误。
Nginx采用master-worker多进程架构。master进程负责读取配置、管理工作进程,实际请求由worker进程处理。每个worker使用非阻塞的事件驱动模型,通过epoll(Linux)/kqueue(FreeBSD)等系统调用高效处理海量连接。
这种设计带来几个关键优势:
Nginx的配置文件通常位于/etc/nginx/nginx.conf,采用模块化的指令块结构:
nginx复制# 全局块 - 影响整体运行的配置
user nginx;
worker_processes auto;
# events块 - 连接处理相关
events {
worker_connections 1024;
use epoll;
}
# http块 - HTTP服务相关
http {
include /etc/nginx/mime.types;
server {
listen 80;
server_name example.com;
location / {
root /var/www/html;
}
}
}
重要提示:修改配置后务必执行
nginx -t测试语法,再nginx -s reload平滑重启
虽然各Linux发行版都提供Nginx包,但生产环境我推荐源码编译安装:
bash复制# 安装依赖
sudo apt install build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev
# 下载稳定版(以1.25.3为例)
wget https://nginx.org/download/nginx-1.25.3.tar.gz
tar zxvf nginx-1.25.3.tar.gz
cd nginx-1.25.3
# 编译配置
./configure \
--prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-threads \
--with-file-aio
# 编译安装
make -j$(nproc)
sudo make install
关键编译参数说明:
--with-http_ssl_module:启用HTTPS支持--with-threads:启用线程池处理异步IO--with-file-aio:启用异步文件IO提升性能假设我们要部署一个静态网站到/var/www/mysite:
nginx复制server {
listen 80;
server_name mysite.com www.mysite.com;
# 日志配置
access_log /var/log/nginx/mysite.access.log;
error_log /var/log/nginx/mysite.error.log;
# 静态文件服务
location / {
root /var/www/mysite;
index index.html;
# 启用高效文件传输
sendfile on;
tcp_nopush on;
# 启用gzip压缩
gzip on;
gzip_types text/plain text/css application/json;
}
# 禁止访问.git目录
location ~ /\.git {
deny all;
return 403;
}
}
在/etc/nginx/nginx.conf的全局块添加:
nginx复制worker_processes auto; # 自动设置为CPU核心数
worker_rlimit_nofile 65535; # 每个worker能打开的文件描述符数
events {
worker_connections 8192; # 每个worker的最大连接数
multi_accept on; # 一次接受所有新连接
use epoll; # Linux下使用epoll事件模型
}
http {
# 关闭不必要的日志
access_log off;
# 启用高效传输
sendfile on;
tcp_nopush on;
tcp_nodelay on;
# 连接超时设置
keepalive_timeout 65;
keepalive_requests 1000;
# 重置超时设置
client_body_timeout 12;
client_header_timeout 12;
send_timeout 10;
}
在server块中添加缓存配置:
nginx复制location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 365d;
add_header Cache-Control "public, no-transform";
# 开启文件缓存
open_file_cache max=1000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
}
nginx复制server {
# 隐藏Nginx版本号
server_tokens off;
# 防止点击劫持
add_header X-Frame-Options "SAMEORIGIN";
# 启用XSS防护
add_header X-XSS-Protection "1; mode=block";
# 禁用内容类型嗅探
add_header X-Content-Type-Options "nosniff";
# CSP策略(根据实际需求调整)
add_header Content-Security-Policy "default-src 'self'";
# 限制HTTP方法
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 405;
}
}
使用Let's Encrypt免费证书:
bash复制sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d example.com -d www.example.com
Nginx配置示例:
nginx复制server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# 启用TLS 1.3
ssl_protocols TLSv1.2 TLSv1.3;
# 优化加密套件
ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:ECDHE-ECDSA-AES128-GCM-SHA256';
ssl_prefer_server_ciphers on;
# 启用OCSP装订
ssl_stapling on;
ssl_stapling_verify on;
# HSTS策略(谨慎启用)
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;
}
可能原因及解决方案:
后端服务不可用
systemctl status your_servicecurl -v http://localhost:8080权限问题
bash复制chown -R nginx:nginx /var/lib/nginx
setsebool -P httpd_can_network_connect 1 # SELinux环境下
资源不足
journalctl -xe使用Nginx内置状态模块:
nginx复制location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
然后通过curl http://127.0.0.1/nginx_status获取关键指标:
Nginx支持多种负载均衡算法:
nginx复制upstream backend {
# 加权轮询
server 192.168.1.101:8080 weight=3;
server 192.168.1.102:8080;
server 192.168.1.103:8080 backup; # 备用服务器
# 最少连接算法
least_conn;
# 保持会话一致性
hash $remote_addr consistent;
}
server {
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
从Nginx 1.9.11开始支持动态模块:
bash复制# 查看已编译模块
nginx -V
# 动态加载模块(以echo模块为例)
load_module modules/ngx_http_echo_module.so;
常用动态模块推荐:
建议监控以下Nginx指标:
Prometheus监控配置示例:
nginx复制location /metrics {
stub_status on;
access_log off;
allow 192.168.1.0/24;
deny all;
}
使用GoAccess进行实时日志分析:
bash复制goaccess /var/log/nginx/access.log \
--log-format=COMBINED \
--real-time-html \
--output=/var/www/report.html
关键日志字段分析:
$remote_addr:客户端IP$request_time:请求处理时间$upstream_response_time:后端响应时间$status:HTTP状态码$http_referer:来源页面官方Nginx镜像优化配置:
dockerfile复制FROM nginx:1.25-alpine
# 移除默认配置
RUN rm -rf /etc/nginx/conf.d/*
# 添加自定义配置
COPY nginx.conf /etc/nginx/nginx.conf
COPY conf.d/ /etc/nginx/conf.d/
# 静态文件
COPY static/ /var/www/html/
# 设置非root用户运行
RUN chown -R nginx:nginx /var/cache/nginx && \
chown -R nginx:nginx /var/www/html
USER nginx
# 健康检查
HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost/ || exit 1
Nginx Ingress Controller配置示例:
yaml复制apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: mysite.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
nginx -t:测试配置文件语法nginx -T:打印完整配置(包括include文件)nginx -V:查看编译参数和版本信息使用wrk进行压力测试:
bash复制wrk -t4 -c1000 -d30s --latency http://example.com
参数说明:
DigitalOcean的Nginx配置生成器:
https://do.co/nginx-config
Certbot自动配置工具:
bash复制sudo certbot --nginx --expand -d example.com -d www.example.com