Nginx 详解

基本介绍

Nginx(发音为"engine x")是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。它由俄罗斯程序员Igor Sysoev开发,以轻量级、高性能和稳定性著称。

主要特点

  1. 高性能:采用事件驱动架构,能够处理高并发连接(官方测试可达5万并发)
  2. 低资源消耗:内存占用少,CPU使用率低
  3. 模块化设计:核心功能精简,通过模块扩展功能
  4. 热部署:支持不停止服务的情况下升级和配置变更
  5. 反向代理:出色的负载均衡能力

核心功能

HTTP服务器功能

  • 处理静态内容(HTML、CSS、JS、图片等)
  • 虚拟主机支持(基于域名/IP的虚拟服务器)
  • URL重写和重定向
  • Gzip压缩
  • 访问控制

反向代理功能

  • 负载均衡(支持轮询、权重、IP哈希等多种算法)
  • 缓存加速
  • SSL终端
  • 请求转发

邮件代理功能

  • IMAP/POP3代理
  • SMTP代理
  • SSL/TLS支持

配置文件结构

Nginx配置文件通常位于/etc/nginx/nginx.conf,主要包含以下几个部分:

  1. 全局块:配置影响nginx全局的指令

    user  nginx;
    worker_processes  auto;
    error_log  /var/log/nginx/error.log warn;
    pid        /var/run/nginx.pid;
    

  2. events块:配置影响nginx服务器与用户的网络连接

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

  3. http块:配置代理、缓存、日志等大多数功能

    http {
        include       /etc/nginx/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  /var/log/nginx/access.log  main;
        
        sendfile        on;
        tcp_nopush     on;
        tcp_nodelay    on;
        
        keepalive_timeout  65;
        
        include /etc/nginx/conf.d/*.conf;
    }
    

  4. server块:配置虚拟主机的相关参数

    server {
        listen       80;
        server_name  example.com;
        
        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
        }
        
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }
    

常见应用场景

1. 静态资源服务器

Nginx处理静态文件效率极高,适合作为静态资源服务器:

server {
    listen 80;
    server_name static.example.com;
    
    location / {
        root /data/static;
        expires 30d;
        access_log off;
    }
}

2. 负载均衡

配置Nginx作为负载均衡器:

upstream backend {
    server 10.0.0.1:8080 weight=3;
    server 10.0.0.2:8080;
    server 10.0.0.3:8080 backup;
}

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

3. 反向代理

将请求代理到后端应用服务器:

server {
    listen 80;
    server_name api.example.com;
    
    location / {
        proxy_pass http://127.0.0.1:8000;
        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. 调整worker_processes:通常设置为CPU核心数
  2. 优化worker_connections:根据服务器内存调整
  3. 启用sendfile:减少文件传输时的上下文切换
  4. 启用gzip压缩:减小传输数据量
  5. 配置缓存:对静态资源设置适当的缓存时间
  6. 限制请求大小:防止大文件上传耗尽资源
  7. 启用keepalive:减少TCP连接建立的开销

常用命令

  • 启动Nginx:nginxsystemctl start nginx
  • 停止Nginx:nginx -s stopsystemctl stop nginx
  • 重新加载配置:nginx -s reloadsystemctl reload nginx
  • 测试配置文件:nginx -t
  • 查看版本:nginx -v(简单版本)或 nginx -V(详细版本及编译参数)

proxy_pass基本概念

proxy_pass是nginx中用于反向代理的核心指令,它允许nginx将客户端的请求转发到后端服务器,并将响应返回给客户端。这个功能在现代web架构中非常常见,常用于负载均衡、应用服务器代理等场景。

基本语法

proxy_pass指令的基本语法如下:

proxy_pass URL;

其中URL可以是:

  • 完整的URL(包含协议、主机名和端口)
  • 不完整的URL(只包含协议和主机名)
  • 仅包含主机名和端口的URI
  • Unix域套接字路径

常见用法

1. 基本代理配置

location / {
    proxy_pass http://backend_server:8080;
}

这种配置会将所有匹配该location的请求转发到backend_server:8080服务器。

2. 路径保留与替换

location /api/ {
    proxy_pass http://backend_server:8080/api/;
}

在这个例子中,请求/api/users会被转发到http://backend_server:8080/api/users,保持了原始路径。

3. 路径修改

location /service/ {
    proxy_pass http://backend_server:8080/;
}

这种情况下,请求/service/users会被转发到http://backend_server:8080/users,location部分(/service/)被去除。

重要参数

proxy_pass通常与以下常用参数配合使用:

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 60s;
proxy_read_timeout 60s;
proxy_send_timeout 60s;

proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 16k;
proxy_busy_buffers_size 24k;
proxy_max_temp_file_size 1024m;

特殊场景处理

1. 处理重定向

proxy_redirect http://backend_server:8080/ http://$host/;

这个配置会将后端服务器的重定向地址中的http://backend_server:8080/替换为http://$host/,确保重定向到正确的域名。

2. WebSocket代理

location /ws/ {
    proxy_pass http://ws_backend;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

这种配置专门用于代理WebSocket连接,需要升级HTTP协议版本并设置特定的header。

常见问题

  1. 斜杠问题:proxy_pass指令中URL末尾的斜杠会影响路径的转发方式
  2. 变量使用:proxy_pass中可以使用nginx变量,但要注意解析时机
  3. DNS解析:如果使用域名,nginx会缓存DNS解析结果直到重启或配置重载

高级用法

1. 负载均衡

upstream backend {
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
}

location / {
    proxy_pass http://backend;
}

这种配置实现了简单的轮询负载均衡,将请求分发到多个后端服务器。

2. 条件代理

location / {
    if ($http_user_agent ~* "Mobile") {
        proxy_pass http://mobile_backend;
    }
    proxy_pass http://desktop_backend;
}

这个例子根据User-Agent将移动设备请求转发到不同的后端服务器。

最佳实践

  1. 始终设置Host头部,确保后端服务器能识别原始请求的域名
  2. 为关键业务设置合理的超时时间
  3. 对敏感应用启用SSL/TLS加密代理连接
  4. 监控代理连接的性能和错误率
  5. 考虑使用keepalive连接减少TCP握手开销

nginx 之 proxy_pass 应用场景

基本概念

proxy_pass 是 nginx 中用于实现请求转发的指令,它可以将客户端的请求转发到后端服务器处理。这是 nginx 作为反向代理服务器的核心功能之一。

主要应用场景

1. 负载均衡

使用 proxy_pass 配合 upstream 模块实现多台服务器的负载均衡:

upstream backend {
    server 192.168.1.101:8080;
    server 192.168.1.102:8080;
    server 192.168.1.103:8080;
}

server {
    listen 80;
    location / {
        proxy_pass http://backend;
    }
}

2. 应用解耦

将前端和后端服务分离,前端通过 nginx 访问后端 API:

server {
    listen 80;
    server_name example.com;
    
    location /api/ {
        proxy_pass http://api-server:8080/;
        proxy_set_header Host $host;
    }
    
    location / {
        root /var/www/html;
    }
}

3. 协议转换

将 HTTP 请求转发到 HTTPS 后端服务:

server {
    listen 80;
    location / {
        proxy_pass https://secure-backend;
        proxy_ssl_verify off;
    }
}

4. 路径重写

修改请求路径后再转发:

location /old-path/ {
    proxy_pass http://backend/new-path/;
}

5. 多服务代理

根据不同的 URL 路径代理到不同的后端服务:

server {
    listen 80;
    
    location /app1/ {
        proxy_pass http://app1-server:8000/;
    }
    
    location /app2/ {
        proxy_pass http://app2-server:9000/;
    }
}

6. 缓存代理

结合 proxy_cache 实现缓存功能:

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m;

server {
    location / {
        proxy_pass http://backend;
        proxy_cache my_cache;
        proxy_cache_valid 200 302 10m;
    }
}

7. WebSocket 代理

代理 WebSocket 连接:

location /ws/ {
    proxy_pass http://websocket-server;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

8. 灰度发布

配合变量实现灰度发布:

map $cookie_user_type $backend {
    default      http://production-backend;
    "beta"       http://beta-backend;
}

server {
    location / {
        proxy_pass $backend;
    }
}

高级配置选项

  1. 超时控制

    proxy_connect_timeout 5s;
    proxy_read_timeout 60s;
    proxy_send_timeout 30s;
    

  2. 请求头处理

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    

  3. 缓冲控制

    proxy_buffering on;
    proxy_buffer_size 4k;
    proxy_buffers 8 16k;
    proxy_busy_buffers_size 24k;
    

  4. 重试机制

    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
    proxy_next_upstream_tries 3;
    proxy_next_upstream_timeout 10s;
    

proxy_pass 是 nginx 反向代理功能的核心指令,通过合理配置可以实现多种复杂的代理场景,满足现代 Web 架构的各种需求。

Logo

更多推荐