Nginx是一款高性能的HTTP和反向代理服务器,以其高并发处理能力、低内存消耗和模块化设计而广受欢迎。本文将从核心配置出发,结合多个实战场景,深入解析Nginx的应用技巧。
Nginx的核心作用
Nginx主要扮演三个关键角色:
- Web静态服务器:可用于发布静态网页、图片等资源。
- 反向代理与负载均衡器:通过监听80/443端口接收请求,并代理分发至后端多台应用服务器,是实现高可用架构的关键中间件。
- 邮件代理服务器:尽管此功能在实际生产中使用较少。
其模块化设计(如 location、upstream 模块)是其灵活性的基础。
全局配置优化
全局配置位于 nginx.conf 的 main 上下文,直接影响Nginx实例的性能基础。
worker_processes
此指令定义了Nginx启动的工作进程数量,通常设置为与CPU核心数相等或为其倍数,以充分利用多核性能。
worker_processes auto; # 自动检测CPU核心数
# 或显式指定
worker_processes 2;
worker_rlimit_nofile
设置每个工作进程可打开的最大文件描述符数量。不设置时,将继承系统全局限制。
worker_rlimit_nofile 65535;
你可以使用 ulimit -n 命令查看当前会话的限制,并使用 ulimit -n [数量] 进行临时修改(重启后失效)。
worker_connections 与并发数
worker_connections 定义每个工作进程能够同时处理的最大连接数。它位于 events 块中。
events {
worker_connections 1024;
}
重要概念:Nginx支持的最大并发连接数理论值为 worker_processes * worker_connections。worker_rlimit_nofile 是进程级别的文件打开数限制,与 worker_connections 是独立的两套配置。
一个经过优化的配置示例如下:
worker_processes auto;
worker_rlimit_nofile 65535;
events {
worker_connections 16384;
}
Location 块实战精讲
location 指令是Nginx配置的灵魂,用于匹配URI并定义处理逻辑。
实现域名首页跳转
希望用户访问网站根域名时,直接跳转至登录页。
location / {
return 301 http://www.yourdomain.com/login$request_uri;
}
路径重定向到指定地址
将特定路径的请求重写并永久重定向到另一个地址。
location /crm/sso/login {
rewrite ^/(.*)$ http://192.168.0.1/crm/sso/login?usercode=$1 permanent;
}
$1 捕获了正则表达式 (.*) 匹配到的内容。
permanent 返回301永久重定向状态码。
基于多域名的服务代理
当同一服务路径(如/user)部署在多台机器时,可通过配置多个server块,并绑定不同域名来实现定向代理。
server {
listen 80;
server_name user1.domain.com;
location / {
proxy_pass http://10.192.168.1:9999/user/;
}
}
server {
listen 80;
server_name user2.domain.com;
location / {
proxy_pass http://10.192.168.2:9999/user/;
}
}

拓展:
- 一个Nginx可以配置多个
server块,常用于区分内外网访问策略或托管多个网站。
- 一个
server块也可以配置多个server_name,用于同时响应多个域名的请求。
Server块与负载均衡配置
搭建简易负载均衡
使用 upstream 模块定义后端服务器组,并通过 proxy_pass 引用,实现请求的负载分发。
upstream backend_cluster {
server 10.0.0.1:8080;
server 10.0.0.2:8080;
# 可配置权重(weight)、健康检查等参数
}
server {
listen 80;
server_name app.domain.com;
location / {
proxy_pass http://backend_cluster;
proxy_set_header Host $host:$server_port;
# 其他代理头设置...
}
}

注意:默认的轮询策略下,前列服务器会略微多接收一些请求。通常建议将配置更高的节点置于前方。
其他常用Server级指令
autoindex on;:开启目录浏览功能。
listen 80 default_server;:将此服务器块设置为80端口的默认主机。当请求的Host头不匹配任何server_name时,由此块处理。
client_max_body_size 128M;:设置客户端请求体最大大小,常用于限制上传文件体积。
include /etc/nginx/conf.d/*.conf;:用于引入其他配置文件,是保持主配置简洁的运维最佳实践。
安全与访问控制配置
IP访问限制
限制特定接口仅允许内网IP段访问。
location = /api/secure/interface {
# 判断远端IP是否不在指定的内网网段
if ($remote_addr !~* ^10\.(12|192|191)\..*$) {
return 403;
}
proxy_pass http://backend_service;
}
关键点:此处应使用 $remote_addr(直接与Nginx建立连接的客户端IP),而非 $http_origin。
获取与传递真实客户端IP
在多层代理环境中,需要使用 X-Forwarded-For 头来传递原始客户端IP。
location / {
proxy_pass http://backend;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
在后端服务或下一级Nginx中,$proxy_add_x_forwarded_for 变量将包含以逗号分隔的整个代理链IP列表。为记录真实IP,可自定义日志格式:
log_format main '$remote_addr - $http_x_forwarded_for - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" "$http_user_agent"';
access_log /var/log/nginx/access.log main;
常见问题排查
-
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
此错误表示80端口已被其他进程(如Apache、另一个Nginx实例)占用。使用 sudo lsof -i:80 或 sudo netstat -tlnp | grep :80 查找并终止占用进程。
-
访问服务器IP显示Centos/Apache默认页而非Nginx页面
这通常意味着Nginx未成功启动,或者80端口仍由其他Web服务器监听。请检查Nginx状态并确保其监听80端口。
-
Connection refused 错误
当Nginx无法连接到配置的 upstream 或 proxy_pass 后端地址时,会出现此错误。请检查:
- 后端服务是否正在运行。
- 防火墙是否放行了Nginx服务器到后端端口的连接。
upstream 中的服务器地址和端口是否正确。
Nginx与F5的简要对比
| 特性维度 |
Nginx |
F5 BIG-IP |
| 定位 |
开源软件,轻量级反向代理/Web服务器 |
商业硬件/虚拟化应用交付控制器(ADC) |
| 高并发 |
优秀,适用于大多数Web场景 |
极强,专为超大流量和复杂场景设计 |
| 安全性 |
需自行配置安全模块和规则 |
提供硬件级安全防护及丰富的内置安全策略 |
| 成本 |
开源免费 |
商业授权,成本高昂 |
| 复杂度 |
配置相对简单,社区活跃 |
功能全面且复杂,需专业学习 |
简而言之,Nginx是灵活、高效的开源解决方案,而F5则提供了企业级、一体化的高级应用交付与安全服务。
官方文档是学习Nginx最权威的资源:https://nginx.org/en/docs/