Nginx是目前最流行的Web服务器和反向代理服务器,性能好、配置灵活。这篇文章整理一下Nginx的核心配置概念,以及反向代理和负载均衡的基本配置方法。
安装
Ubuntu/Debian:
sudo apt update
sudo apt install nginx
sudo systemctl start nginx
sudo systemctl enable nginx
CentOS:
sudo yum install epel-release
sudo yum install nginx
sudo systemctl start nginx
安装完成后访问服务器IP,能看到Nginx默认欢迎页就说明OK了。
配置文件结构
Nginx的主配置文件是/etc/nginx/nginx.conf,整体结构如下:
# 全局块
worker_processes auto;
error_log /var/log/nginx/error.log;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# 可以包含其他配置文件
include /etc/nginx/conf.d/*.conf;
}
实际项目中,一般不直接改nginx.conf,而是在/etc/nginx/conf.d/目录下新建.conf文件,每个站点一个文件。
server块:虚拟主机
一个server块就是一个虚拟主机:
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example;
index index.html;
location / {
try_files $uri $uri/ =404;
}
location /images/ {
alias /data/images/;
expires 30d;
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
}
几个关键指令:
listen:监听端口server_name:域名匹配,支持通配符和正则root:网站根目录location:URL路径匹配规则
location匹配规则
location的匹配优先级(从高到低):
=精确匹配:location = /api/health^~前缀匹配(不再检查正则):location ^~ /static/~正则匹配(区分大小写):location ~ \.php$~*正则匹配(不区分大小写):location ~* \.(jpg|png|gif)$- 普通前缀匹配:
location /api/
理解优先级很重要,配置错了请求就会走到意料之外的location里。
反向代理
反向代理是Nginx最常用的功能,把请求转发到后端应用服务器:
server {
listen 80;
server_name api.example.com;
location / {
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_set_header X-Forwarded-Proto $scheme;
}
}
proxy_set_header这几行很重要——不加的话,后端拿到的Host和客户端IP都是错的。
WebSocket代理
如果后端有WebSocket,还需要额外配置:
location /ws/ {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
负载均衡
Nginx支持多种负载均衡策略:
upstream backend {
# 默认轮询
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://backend;
}
}
常用策略:
- 轮询(默认):依次分发
- 权重:
server 192.168.1.10:8080 weight=3;权重越高分配越多 - ip_hash:同一IP固定到同一后端,解决session问题
- least_conn:分配给当前连接数最少的后端
HTTPS配置
现在HTTPS基本是标配了,配合Let's Encrypt免费证书:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
# HTTP自动跳转HTTPS
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
常用运维命令
# 测试配置语法
nginx -t
# 重新加载配置(不中断服务)
nginx -s reload
# 查看连接状态(需要开启stub_status模块)
curl http://localhost/nginx_status
小结
Nginx的核心其实就是server块、location匹配、proxy_pass这几个概念。掌握了这些,日常的静态文件服务、反向代理、负载均衡都能搞定。更高级的限流、缓存、Lua扩展等,等有需要的时候再深入也不迟。