Nginx配置入门与反向代理

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的匹配优先级(从高到低):

  1. = 精确匹配:location = /api/health
  2. ^~ 前缀匹配(不再检查正则):location ^~ /static/
  3. ~ 正则匹配(区分大小写):location ~ \.php$
  4. ~* 正则匹配(不区分大小写):location ~* \.(jpg|png|gif)$
  5. 普通前缀匹配: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扩展等,等有需要的时候再深入也不迟。