Nginx(发音"engine x")是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。它由俄罗斯的Igor Sysoev开发,第一个公开版本发布于2004年。

Nginx以高性能、高并发、低资源消耗著称,它采用事件驱动的异步非阻塞架构,能在有限的硬件资源下支持大量的并发连接。相比传统的Apache(每个连接一个进程/线程),Nginx在高并发场景下性能优势明显,内存和CPU消耗也更低。

现在,Nginx已经成为最流行的Web服务器之一。根据Netcraft的统计,全球有超过30%的网站使用Nginx。国内的互联网公司,如百度、阿里、腾讯、京东、新浪等,都在大量使用Nginx。

Nginx的主要用途:

  1. Web服务器:托管静态网站、PHP/Python/Node.js等动态网站
  2. 反向代理:把请求转发给后端的应用服务器
  3. 负载均衡:把请求分发到多台后端服务器,提高并发和可用性
  4. 缓存:缓存静态文件和动态页面,减轻后端压力
  5. 安全防护:限流、防DDoS、HTTPS加密、访问控制

今天分享Nginx的实战配置,重点讲反向代理和负载均衡,以及其他常用配置。

安装Nginx

Nginx的安装很简单。

Ubuntu/Debian:

sudo apt-get update
sudo apt-get install nginx

CentOS/RHEL:

sudo yum install epel-release
sudo yum install nginx

编译安装(推荐生产环境):

wget http://nginx.org/download/nginx-1.8.0.tar.gz
tar zxf nginx-1.8.0.tar.gz
cd nginx-1.8.0
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_gzip_static_module --with-http_stub_status_module
make && sudo make install

编译安装可以选择需要的模块,更灵活,性能也更好。推荐生产环境用编译安装。

安装完成后,启动Nginx:

sudo /usr/local/nginx/sbin/nginx

常用命令:

nginx -s reload  # 重新加载配置
nginx -s stop    # 快速停止
nginx -s quit    # 优雅停止
nginx -t         # 测试配置文件
nginx -v         # 查看版本
nginx -V         # 查看版本和编译参数

基本配置

Nginx的配置文件是nginx.conf,通常在安装目录的conf目录下。一个基本的配置:

user  www www;
worker_processes  auto;
error_log  logs/error.log;
pid        logs/nginx.pid;

events {
    worker_connections  1024;
    use epoll;
    multi_accept on;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  logs/access.log  main;

    sendfile        on;
    tcp_nopush      on;
    tcp_nodelay     on;
    keepalive_timeout  65;
    client_max_body_size 20m;

    gzip  on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_comp_level 6;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    gzip_vary on;

    server {
        listen       80;
        server_name  example.com www.example.com;
        root   /var/www/example.com;
        index  index.html index.htm index.php;

        location / {
            try_files $uri $uri/ /index.php?$query_string;
        }

        location ~ \.php$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }

        location ~ /\.ht {
            deny  all;
        }
    }
}

关键配置说明:

  • worker_processes:工作进程数,建议设为CPU核心数(auto自动检测)
  • worker_connections:每个工作进程的最大连接数
  • use epoll:使用epoll事件模型(Linux下高效)
  • sendfile:开启高效文件传输
  • keepalive_timeout:长连接超时时间
  • clientmaxbody_size:客户端请求体最大大小(影响文件上传)
  • gzip:开启Gzip压缩

反向代理

反向代理是Nginx最常用的功能之一。反向代理的意思是:Nginx接收客户端的请求,然后把请求转发给后端的应用服务器(如Tomcat、Node.js、PHP-FPM等),后端服务器处理完请求后,把响应返回给Nginx,Nginx再返回给客户端。

反向代理的好处:

  1. 隐藏后端服务器,提高安全性
  2. 统一入口,方便做负载均衡、缓存、限流等
  3. 处理静态文件,减轻后端压力
  4. 支持HTTPS加密,后端不需要处理SSL

基本反向代理配置:

server {
    listen 80;
    server_name app.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_connect_timeout 30s;
        proxy_read_timeout 60s;
        proxy_send_timeout 60s;
        proxy_buffering on;
        proxy_buffer_size 4k;
        proxy_buffers 8 4k;
    }
}

关键配置说明:

  • proxy_pass:后端服务器地址
  • proxysetheader:设置转发给后端的请求头

- Host:原始域名(后端需要知道原始域名) - X-Real-IP:客户端真实IP - X-Forwarded-For:代理链路 - X-Forwarded-Proto:原始协议(http/https)

  • proxyconnecttimeout:连接后端超时
  • proxyreadtimeout:读取后端响应超时
  • proxysendtimeout:发送请求到后端超时
  • proxy_buffering:开启响应缓冲

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";
    proxy_read_timeout 86400;
}

负载均衡

当单台后端服务器无法满足并发需求时,可以用Nginx做负载均衡,把请求分发到多台后端服务器,提高并发处理能力和可用性。

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;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

负载均衡策略:

  1. 轮询(默认):按顺序把请求分发到每台后端服务器,适合后端服务器性能相近的场景。
upstream backend {
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
}
  1. 加权轮询:根据服务器性能设置权重,性能好的服务器分配更多请求。
upstream backend {
    server 192.168.1.10:8080 weight=3;
    server 192.168.1.11:8080 weight=1;
}
  1. ip_hash:根据客户端IP的hash结果分配,同一个IP的请求总是分到同一台后端服务器,适合需要会话保持的场景。
upstream backend {
    ip_hash;
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
}
  1. least_conn:把请求分给当前连接数最少的后端服务器,适合请求处理时间差异大的场景。
upstream backend {
    least_conn;
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
}
  1. fair(第三方模块):根据后端服务器的响应时间分配,响应快的优先。需要安装nginx-upstream-fair模块。
upstream backend {
    fair;
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
}

健康检查:

Nginx内置了被动健康检查,如果某台后端服务器失败次数达到阈值,会暂时把它标记为不可用,不再分发请求。

upstream backend {
    server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
    server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
    server 192.168.1.12:8080 backup;
}
  • max_fails:最大失败次数,达到后标记为不可用
  • fail_timeout:不可用持续时间,过后重新尝试
  • backup:备用服务器,只有其他服务器都不可用时才使用

主动健康检查需要安装nginxupstreamcheck_module模块。

静态文件缓存

Nginx处理静态文件的性能非常好,可以配置缓存,减轻后端压力。

# 静态文件缓存
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff|woff2|ttf|eot|svg)$ {
    expires 30d;
    add_header Cache-Control "public, immutable";
    access_log off;
}

# 不缓存的文件
location ~* \.(html|htm)$ {
    add_header Cache-Control "no-cache, no-store, must-revalidate";
}
  • expires:设置缓存过期时间
  • Cache-Control:缓存控制头
  • access_log off:关闭静态文件的访问日志,减少IO

HTTPS配置

现在HTTPS已经是标配,Nginx配置HTTPS很简单:

server {
    listen 443 ssl;
    server_name example.com www.example.com;

    ssl_certificate     /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    # HSTS
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";

    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 https;
    }
}

# HTTP跳转到HTTPS
server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}

免费的SSL证书可以用Let's Encrypt,通过certbot工具自动申请和续期。

安全加固

Nginx的安全加固配置:

# 隐藏Nginx版本号
server_tokens off;

# 限制请求体大小
client_max_body_size 10m;

# 限流
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;

server {
    # 应用限流
    location / {
        limit_req zone=one burst=20 nodelay;
    }

    # 禁止访问敏感文件
    location ~ /\.(ht|git|svn) {
        deny all;
    }

    # 禁止访问配置文件
    location ~* \.(env|ini|conf|log|sh)$ {
        deny all;
    }

    # 防盗链
    location ~* \.(jpg|jpeg|png|gif|ico)$ {
        valid_referers none blocked example.com *.example.com;
        if ($invalid_referer) {
            return 403;
        }
    }
}

总结

Nginx是一个强大的Web服务器和反向代理服务器,掌握它的配置,能帮你搭建高性能、高可用的Web服务。

重点掌握:

  1. 基本配置:worker进程、连接数、Gzip、超时
  2. 反向代理:proxy_pass、请求头设置、超时配置
  3. 负载均衡:upstream、轮询/加权/iphash/leastconn、健康检查
  4. 静态缓存:expires、Cache-Control
  5. HTTPS:SSL证书配置、HSTS、HTTP跳转
  6. 安全加固:隐藏版本号、限流、禁止敏感文件、防盗链

Nginx的配置很灵活,功能也很强大,需要在实践中不断学习和积累。希望这篇文章能帮你入门Nginx的实战配置。