1 Nginx 概述
为什么选择 Nginx
- 高性能 & 高并发:采用事件驱动(epoll)和异步非阻塞架构,单机可轻松支撑数万并发连接,远优于传统的多进程/多线程模型。
- 反向代理:隐藏后端真实服务,提供统一的请求入口,同时可配合缓存、压缩、安全过滤等增强能力。
- 负载均衡:支持多种分发策略(轮询、权重、IP哈希、最少连接等),有效分摊后端压力,提升系统整体吞吐量。
- 静态内容处理 :对静态文件(HTML、CSS、JS、图片等)的处理效率极高,且支持
sendfile零拷贝技术,大幅降低CPU和内存开销。 - 高可靠性 & 热部署:进程模型采用Master-Worker架构,支持平滑升级和配置热加载,无需中断服务。
2 虚拟主机配置
虚拟主机允许在同一台服务器上运行多个不同域名或端口的站点。
基础示例:
nginx
server {
listen 80; # 监听端口
server_name localhost; # 域名或IP,支持通配符 *.example.com
location / {
root html; # 静态资源根目录
index index.html index.htm; # 默认首页顺序
}
}
多虚拟主机配置(基于域名区分):
nginx
server {
listen 80;
server_name www.site1.com;
root /var/www/site1;
}
server {
listen 80;
server_name www.site2.com;
root /var/www/site2;
}
小技巧 :生产环境建议将每个
server块独立成.conf文件,通过include引入,便于管理和维护。
3 location 匹配规则
语法结构
location [修饰符] /uri/ { ... }
修饰符详解:
| 修饰符 | 含义 | 优先级 |
|---|---|---|
= |
精确匹配,完全一致才命中 | 最高 |
^~ |
路径前缀匹配,命中后不再检查正则 | 次高 |
~ |
区分大小写的正则匹配 | 第三 |
~* |
不区分大小写的正则匹配 | 第三 |
| 无修饰符 | 普通前缀匹配(最长匹配原则) | 最低 |
!~ / !~* |
正则不匹配(少用,通常用于排除) | --- |
匹配优先级总结 :
精确匹配(=) > ^~ > 正则(~, ~*) > 普通前缀(最长匹配) > 默认/
配置示例及说明:
nginx
# 1. 精确匹配首页,访问 / 时走此规则
location = / {
root /usr/local/nginx/html;
}
# 2. 前缀匹配,访问 /static/ 下的任何路径都走这里
location ^~ /static/ {
root /usr/local/nginx/html8088;
}
# 3. 正则匹配静态资源扩展名(不区分大小写)
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
root /usr/local/nginx/html8088;
expires 30d; # 开启浏览器缓存30天
}
# 4. 排除某些URL(不匹配 .do 结尾的请求)
location !~ \.do$ {
try_files $uri $uri/ =404;
}
注意 :
root和alias的区别------root会将location中的URI追加到路径后,而alias会替换掉匹配的部分,使用时容易混淆,建议优先用root。
4 反向代理配置
反向代理将客户端请求转发给内部后端服务,并返回响应。
基本用法:
nginx
location / {
proxy_pass http://localhost:8090/;
}
常用代理参数(推荐配置):
nginx
location / {
proxy_pass http://backend_server;
proxy_set_header Host $host; # 传递原始Host
proxy_set_header X-Real-IP $remote_addr; # 传递真实客户端IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
proxy_buffering on; # 开启缓冲,提升性能
proxy_http_version 1.1; # 支持长连接
proxy_set_header Connection "";
}
代理WebSocket(如需支持长连接):
nginx
location /ws/ {
proxy_pass http://websocket_backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
5 负载均衡配置
upstream 定义后端集群:
nginx
upstream myapp {
# 轮询(默认)
server 192.168.122.133:8080 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.122.134:8080 weight=1 max_fails=2 fail_timeout=30s;
# 可选:备用服务器(其他服务器都挂时启用)
server 192.168.122.135:8080 backup;
}
常用负载均衡策略:
| 策略 | 关键字 | 说明 |
|---|---|---|
| 轮询 | 默认 | 按顺序轮流分配 |
| 权重轮询 | weight |
权重越高分配比例越大 |
| IP哈希 | ip_hash; |
同一客户端IP固定访问同一台后端,用于会话保持 |
| 最少连接 | least_conn; |
转发给当前连接数最少的服务器 |
| 一致性哈希 | hash $request_uri consistent; |
按URL哈希,适合缓存场景 |
完整配置示例:
nginx
upstream backend {
ip_hash; # 保持会话一致性
server 192.168.122.133:8080 weight=3;
server 192.168.122.134:8080 weight=2;
server 192.168.122.135:8080 weight=1 max_fails=3 fail_timeout=20s;
}
server {
listen 80;
location / {
proxy_pass http://backend;
include /etc/nginx/proxy_params; # 统一代理参数文件
}
}
健康检查 :Nginx社区版通过
max_fails和fail_timeout实现被动健康检查;如需主动健康检查,可考虑使用Nginx Plus或引入第三方模块(如nginx-upstream-check)。
6 补充:性能优化与安全加固(新增)
性能优化建议:
- 调整
worker_processes为CPU核心数(auto)。 - 设置
worker_connections为1024~65535之间,提高并发能力。 - 开启
sendfile和tcp_nopush,提升静态文件传输效率。 - 启用Gzip压缩,减少传输数据量。
nginx
worker_processes auto;
events {
worker_connections 10240;
use epoll;
}
http {
sendfile on;
tcp_nopush on;
gzip on;
gzip_types text/plain text/css application/json application/javascript;
}
安全加固建议:
- 隐藏Nginx版本号:
server_tokens off; - 限制请求方法:
if ($request_method !~ ^(GET|HEAD|POST)$) { return 405; } - 设置安全Header:
add_header X-Frame-Options "SAMEORIGIN" always; - 限制IP访问或请求频率(使用
limit_req_zone模块)。