nginx本质上是一台高性能的HTTP服务器加反向代理:静态资源托管、反向代理、负载均衡、缓存加速、HTTPS卸载、限流防护这几件事它都能干,而且多数业务场景下用开源免费版就够。
很多人第一次接触nginx,是照着教程装完、改个root路径、重启服务,然后就没再深究,实际上它在整套架构里承担的角色远比”放个网页”要多,尤其是在流量上来之后,nginx往往是那个最先要动手调的地方。
nginx到底在服务器里承担什么角色
一个进程模型撑起高并发
nginx用master-worker多进程模型:master负责读配置、管进程,worker真正处理连接,每个worker是单线程事件驱动,Linux下走epoll处理非阻塞IO,不需要为每个连接开线程,这就是它在C10K问题上名声在外的原因。
配置里能看到两个关键参数:
worker_processes auto;
events {
worker_connections 10240;
}
auto让它跟着CPU核数走,worker_connections决定单个worker的连接上限,文件句柄数也要同步放开,否则系统层先卡住:
ulimit -n 65535
它最常被放在架构的哪个位置
- 静态资源服务器:图片、CSS、JS、下载包直接由nginx吐出去,不经过后端
- 统一入口网关:域名解析到nginx,再按路径或子域名转发给不同后端
- 负载均衡器:后端多台应用服务器前面挡一层
- HTTPS终止点:证书只装在nginx上,后端走内网HTTP
- 缓存与限流层:挡住突发流量和爬虫
行业共识认为,nginx在中小型站点里通常同时扮演三到四个角色,而不是只做其中一件。
nginx反向代理和负载均衡有什么区别
这是搜索量很高的一类疑问,两者经常写在同一个配置文件里,但解决的问题完全不同。
反向代理解决的是”替身”问题
客户端以为自己在跟nginx对话,实际上请求被转给了后端,好处是后端端口不用暴露、跨域问题统一在网关处理、变更后端机器时前端不用动。
location /api/ {
proxy_pass http://127.0.0.1:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
注意proxy_pass结尾带不带斜杠,路径拼接结果完全不同,这个细节踩过坑的人最多。
负载均衡解决的是”分流”问题
后端有多台,nginx按策略挑一台转发,常见策略对比如下:
| 策略 | 写法 | 适用场景 |
|---|---|---|
| 轮询 | 默认 | 后端配置一致、无状态服务 |
| 加权轮询 | server 10.0.0.2 weight=3; |
机器性能不均 |
| IP哈希 | ip_hash; |
需要会话粘滞的传统应用 |
| 最少连接 | least_conn; |
请求耗时差异大 |
| 一致性哈希 | hash $request_uri; |
缓存命中率敏感 |
一段可直接用的配置:
upstream backend {
least_conn;
server 10.0.0.2:8080 max_fails=3 fail_timeout=10s;
server 10.0.0.3:8080;
keepalive 32;
}
验证流程很固定:nginx -t检查语法,systemctl reload nginx生效,然后curl -I连续请求几次,看响应头和实际落到哪台机器。
nginx做静态资源服务器怎么配置
三个指令决定成败
root、alias和try_files是静态服务的核心。root是把URI直接拼在路径后面,alias是替换掉匹配到的那一段,两者混用是404的高发原因。
server {
listen 80;
server_name static.example.com;
location /assets/ {
alias /data/www/assets/;
expires 30d;
add_header Cache-Control "public";
}
location / {
root /data/www/site;
try_files $uri $uri/ /index.html;
}
}
打开传输优化
sendfile on; tcp_nopush on; gzip on; gzip_types text/css application/javascript image/svg+xml; gzip_min_length 1k;
sendfile让文件从内核直接送到socket,省掉用户态拷贝,但要注意它和gzip同时开时对大文件不一定划算,视频、压缩包这类内容通常跳过压缩。
常见的坑
- 静态文件明明在磁盘上却返回403:目录执行权限或
user指令配置的账户没有读权限 - 图片能访问、视频卡顿:
sendfile配合aio或调整output_buffers - 中文文件名下载乱码:补
charset utf-8;并检查后端返回头
HTTPS、限流与访问控制,安全功能别漏掉
证书与协议配置
listen 443 ssl http2; ssl_certificate /etc/nginx/cert/fullchain.pem; ssl_certificate_key /etc/nginx/cert/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_session_cache shared:SSL:10m;
现在续签基本交给certbot或云厂商托管,改完证书只需要reload,不用重启。ssl_protocols里老版本协议直接关掉,是成本最低的安全加固。
限流和防盗链
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
location /api/ {
limit_req zone=api burst=20 nodelay;
}
location ~ \.(jpg|png|mp4)$ {
valid_referers none blocked example.com;
if ($invalid_referer) { return 403; }
}
rate管平均速率,burst允许瞬时突发,这两个值设得太紧会误伤正常用户,通常结合访问日志里的$request_time和状态码分布来定。
nginx和apache哪个性能好
架构差异决定了适用场景
业内专家指出,两者的根本区别在并发模型:Apache传统prefork模式每个连接占一个进程,连接数上去后内存吃紧;nginx事件驱动,连接数和内存不是线性关系,高并发静态内容、大量长连接场景,nginx优势明显。
选型对照参考
| 维度 | nginx | Apache |
|---|---|---|
| 静态高并发 | 表现突出 | 一般 |
| 动态PHP | 配合PHP-FPM | 内置模块,配置简单 |
| .htaccess | 不支持 | 原生支持 |
| 模块生态 | 需重新编译 | 动态加载方便 |
| 反向代理 | 原生强项 | 需mod_proxy |
不少团队的做法是nginx在前接流量,Apache或应用服务器在后处理动态请求,各取所长,如果站点跑在虚拟主机上、依赖.htaccess,硬换nginx反而增加维护成本。
nginx plus收费吗?开源版和企业版怎么选
开源版nginx遵循类BSD许可,免费使用、可商用,功能已经覆盖绝大多数场景,NGINX Plus是F5的商业订阅产品,按实例年费计价,价格随实例规格和服务等级浮动,国内一般通过代理商询价,没有统一公开价目。
企业版多出来的部分主要在运维便利性上:动态调整上游节点不用reload、主动健康检查、实时监控面板、JWT认证、会话保持、官方技术支持,判断标准很简单如果团队需要7×24的厂商兜底、或者上游节点变更非常频繁,订阅才有意义;普通业务站点用开源版加keepalived和自建监控,成本低得多。
国内服务器nginx配置的几个现实约束
- 云主机默认软件源里的版本偏旧,想用HTTP/2、TLSv1.3等新特性建议加官方源安装:
apt install nginx前先配置nginx.org源 - 80和443端口对外开放前要完成ICP备案,未备案域名解析过来会被拦截
- 云厂商的负载均衡SLB和nginx功能有重叠,通常是SLB接最外层做四层转发,nginx在内层做七层路由
- 容器环境下
worker_processes仍设auto,但要注意CPU配额限制,不是看宿主机核数
开篇提到的那些功能,真正落地时往往不需要全部打开,先想清楚流量入口在哪、后端是什么形态、瓶颈是连接数还是带宽,再决定配哪几块,比照着模板全抄一遍靠谱。
Q&A:nginx服务器功能常见疑问
问:nginx能直接跑PHP或Java吗?
不能,nginx本身不解析业务代码,它把请求转发给后端的PHP-FPM、Tomcat、Node这类进程,自己只负责连接管理和内容分发,这也是它性能稳定的原因之一。
问:单台nginx能扛多少并发?
没有固定数字,取决于机器规格、响应体大小、后端延迟和开启了哪些模块,静态小文件场景下,2核4G的机器在调优后处理上万并发连接并不罕见,但真正的瓶颈通常在后端或带宽上,压测比看参数表有用。
问:nginx配置改完必须重启吗?
不需要。nginx -t确认语法无误后执行nginx -s reload或systemctl reload nginx,master会拉起新worker、平滑退出旧worker,已有连接不中断,只有改动监听端口或编译进新模块时才需要重启服务。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/771193.html


