深入掌握Nginx:正向代理与反向代理详解及配置文件全解析

06-01 1685阅读

1. Nginx简介与应用场景

Nginx是一款高性能的开源Web服务器和反向代理服务器,广泛应用于高并发场景,如静态资源托管、负载均衡、API网关等。其核心优势包括:

  • 事件驱动模型:异步非阻塞架构,支持数万并发连接。

  • 模块化设计:通过模块扩展功能(如HTTP/2、gzip压缩)。

  • 轻量高效:内存占用低,适合资源受限环境。

    典型应用场景:

    • 静态文件托管

    • 反向代理动态应用(如Node.js、Java服务)

    • 负载均衡集群

    • 安全防护(如DDoS防御、HTTPS加密)

      2. 正向代理与反向代理的核心区别

      2.1 正向代理(Forward Proxy)

      • 定义:代理客户端访问外部资源,客户端主动配置代理。

      • 特点:

        • 隐藏客户端真实IP(如公司内网访问互联网)。

        • 突破访问限制(如访问被封锁的网站)。

          配置示例:

          server {
              listen 3128;                      # 监听端口
              resolver 8.8.8.8;                 # DNS解析服务器
              location / {
                  proxy_pass http://$http_host;  # 转发所有请求
              }
          }

           

          深入掌握Nginx:正向代理与反向代理详解及配置文件全解析
          (图片来源网络,侵删)

          2.2 反向代理(Reverse Proxy)

          • 定义:代理服务端接收客户端请求,客户端无感知后端服务。

          • 特点:

            深入掌握Nginx:正向代理与反向代理详解及配置文件全解析
            (图片来源网络,侵删)
            • 隐藏后端服务器,提供负载均衡和安全防护。

            • 支持动态应用加速(如缓存、SSL终止)。

              深入掌握Nginx:正向代理与反向代理详解及配置文件全解析
              (图片来源网络,侵删)

              配置示例: 

              server {
                  listen 80;
                  server_name example.com;
                  
                  location / {
                      proxy_pass http://backend_server;  # 转发到后端集群
                      proxy_set_header Host $host;       # 传递原始域名
                  }
              }

              对比总结:

              特性正向代理反向代理
              配置主体客户端服务端
              隐藏对象客户端IP后端服务IP
              典型用途访问控制、匿名访问负载均衡、安全防护

              3. Nginx配置文件结构总览

              Nginx的配置文件默认路径为/etc/nginx/nginx.conf,支持模块化设计,包含以下核心层级:

              # 全局块(Main Context)
              user nginx;
              worker_processes auto;
              # events块(Events Context)
              events {
                  worker_connections 1024;
              }
              # http块(HTTP Context)
              http {
                  # HTTP全局配置
                  include mime.types;
                  # server块(虚拟主机)
                  server {
                      # server块配置
                      listen 80;
                      # location块(请求路径匹配)
                      location / {
                          root /var/www/html;
                      }
                  }
              }
              # stream块(TCP/UDP代理,可选)
              stream {
                  server {
                      listen 3306;
                      proxy_pass backend_mysql;
                  }
              }

              4.Nginx配置文件结构全解析

              1.全局块(Main Context)

              • 作用范围:影响整个Nginx进程的全局配置。

              • 核心指令:

                user nginx;                     # 运行Nginx的用户和组(安全必备)
                worker_processes auto;          # 工作进程数(建议设为CPU核心数)
                error_log /var/log/nginx/error.log warn;  # 错误日志路径与级别(debug/info/notice/warn/error)
                pid /var/run/nginx.pid;        # 存储主进程PID的文件路径

                2.events块(Events Context)

                • 作用范围:定义Nginx处理网络连接的事件模型参数。

                • 核心指令:

                  events {
                      worker_connections 1024;   # 单个工作进程的最大并发连接数(总并发量= worker_processes × worker_connections)
                      use epoll;                 # 事件模型(Linux推荐epoll,FreeBSD用kqueue)
                      multi_accept on;           # 一次性接受所有新连接
                      accept_mutex off;          # 高并发时建议关闭互斥锁(减少上下文切换)
                  }

                  3.http块(HTTP Context)

                  3.1 http块全局指令

                  • 作用范围:所有HTTP请求的全局配置。

                  • 核心指令:

                    http {
                        # 基础配置
                        include /etc/nginx/mime.types;      # 包含MIME类型定义文件
                        default_type application/octet-stream;  # 默认响应类型(未知文件类型时使用)
                        # 日志配置
                        log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                                        '$status $body_bytes_sent "$http_referer" "$http_user_agent"';
                        access_log /var/log/nginx/access.log main;  # 访问日志路径与格式
                        error_log /var/log/nginx/error.log warn;
                        # 性能优化
                        sendfile on;                # 启用高效文件传输模式
                        tcp_nopush on;              # 仅在sendfile开启时有效,减少网络包数量
                        keepalive_timeout 65;       # 长连接超时时间(单位秒)
                        client_max_body_size 100m;  # 客户端请求体最大限制(防DDoS)
                        # 压缩配置
                        gzip on;
                        gzip_types text/plain text/css application/json;
                        # 安全增强
                        server_tokens off;          # 隐藏Nginx版本号
                    }

                    3.2 server块(虚拟主机配置)

                    • 作用范围:定义单个虚拟主机(一个http块可包含多个server块)。

                    • 核心指令:

                      server {
                          listen 80;                  # 监听端口(可指定IP,如listen 192.168.1.1:80)
                          server_name example.com;    # 匹配的域名(支持通配符和正则表达式)
                          root /var/www/html;         # 网站根目录
                          index index.html;           # 默认首页文件
                          # SSL配置(HTTPS)
                          listen 443 ssl;
                          ssl_certificate /etc/ssl/certs/example.crt;
                          ssl_certificate_key /etc/ssl/private/example.key;
                          # 访问控制
                          deny 192.168.1.100;         # 禁止特定IP访问
                          allow all;
                          # 错误页面重定向
                          error_page 404 /404.html;
                          error_page 500 502 503 504 /50x.html;
                      }

                      3.3 location块(请求路径匹配)

                      • 作用范围:在server块内定义,根据URI路径匹配处理规则。

                      • 匹配模式:

                        • 精确匹配:location = /path { ... }

                        • 前缀匹配:location /prefix/ { ... }

                        • 正则匹配:

                          • location ~ \.php$ { ... }(区分大小写)

                          • location ~* \.jpg$ { ... }(不区分大小写)

                          • 常用指令:

                            location / {
                                try_files $uri $uri/ /index.html;  # 静态文件优先匹配,不存在则返回首页
                            }
                            location /images/ {
                                alias /data/static/images/;       # 路径别名(替换URI中的/images/)
                                expires 30d;                      # 浏览器缓存30天
                            }
                            location /api/ {
                                proxy_pass http://backend_server;  # 反向代理到后端服务
                                proxy_set_header Host $host;       # 传递原始域名
                                proxy_set_header X-Real-IP $remote_addr;  # 传递客户端真实IP
                            }
                            location ~ \.php$ {
                                fastcgi_pass 127.0.0.1:9000;      # 转发PHP请求到FastCGI服务
                                include fastcgi_params;
                                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                            }

                            3.4 upstream块(负载均衡配置)

                            • 作用范围:在http块内定义后端服务器集群,用于负载均衡。

                            • 核心指令:

                              upstream backend {
                                  # 负载均衡策略(默认轮询)
                                  least_conn;                # 最少连接数策略
                                  # ip_hash;                # 按客户端IP哈希分配(会话保持)
                                  # 后端服务器列表
                                  server 10.0.0.1:8080 weight=3;  # 权重越高,分配请求越多
                                  server 10.0.0.2:8080;
                                  server 10.0.0.3:8080 backup;    # 备用服务器(主服务器宕机时启用)
                              }
                              server {
                                  location / {
                                      proxy_pass http://backend;  # 使用upstream配置的集群
                                  }
                              }

                              3.5stream块(TCP/UDP代理)

                              • 作用范围:处理非HTTP流量(如数据库、SSH、DNS)。

                              • 核心指令:

                                stream {
                                    upstream backend_mysql {
                                        server 10.0.0.1:3306;
                                        server 10.0.0.2:3306;
                                    }
                                    server {
                                        listen 3306;          # 监听TCP端口
                                        proxy_pass backend_mysql;
                                        proxy_connect_timeout 5s;
                                    }
                                }

                                6. 配置文件示例与注释

                                # 全局块
                                user www-data;
                                worker_processes auto;
                                error_log /var/log/nginx/error.log warn;
                                # events块
                                events {
                                    worker_connections 2048;
                                    use epoll;
                                }
                                # http块
                                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"';
                                    access_log /var/log/nginx/access.log main;
                                    sendfile on;
                                    keepalive_timeout 65;
                                    # 虚拟主机1:静态资源服务
                                    server {
                                        listen 80;
                                        server_name static.example.com;
                                        root /var/www/static;
                                        location / {
                                            expires 7d;
                                            add_header Cache-Control "public";
                                        }
                                    }
                                    # 虚拟主机2:反向代理动态应用
                                    server {
                                        listen 80;
                                        server_name api.example.com;
                                        location / {
                                            proxy_pass http://backend;
                                            proxy_set_header Host $host;
                                        }
                                    }
                                    # 负载均衡配置
                                    upstream backend {
                                        server 10.0.0.1:8080;
                                        server 10.0.0.2:8080;
                                    }
                                }
                                # stream块(MySQL负载均衡)
                                stream {
                                    upstream mysql_cluster {
                                        server 10.0.0.1:3306;
                                        server 10.0.0.2:3306;
                                    }
                                    server {
                                        listen 3306;
                                        proxy_pass mysql_cluster;
                                    }
                                }
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码