Nginx 服务器

Nginx 是一款高性能的HTTP和反向代理服务器,能够选择高效的epoll、kqueue、eventport最为网 络I/O模型,在高连接并发的情况下,能够支持高达5万个并发连接数的响应,而内存、CPU等系统资 源消耗却非常低,运行非常稳定。

安装 nginx

# 安装 nginx
[root@server ~ 15:00:06]# yum install -y nginx
# 启动 nginx
[root@server ~ 16:59:21]# systemctl enable nginx --now
# 准备主页
# 准备主页
[root@www ~]# mv /usr/share/nginx/html/index.html{,.ori}
[root@www ~]# echo Hello World From Nginx > 
/usr/share/nginx/html/index.html
# 防火墙
[root@www ~]# firewall-cmd --add-service=http --permanent
[root@www ~]# firewall-cmd --reload
[root@client ~]# curl http://www.bao.cloud
# windows客户端修改C:\Windows\System32\drivers\etc\hosts
# Linux或Unix修改 /etc/hosts
# 添加如下记录
10.1.8.10 www.bao.cloud

Nginx 配置

配置结构

Nginx 配置采用层级化、模块化的组织方式,整体是 “全局块 → 核心模块块 → 业务模块块” 的嵌套结构

  1. 全局配置块

    作用于 Nginx 整个进程的基础配置,不嵌套在任何块内,是配置文件的 “根级别”

    # 全局配置示例
    user nginx;                  # 运行Nginx的用户/用户组
    worker_processes auto;       # 工作进程数(核心参数,建议设为CPU核心数)
    error_log /var/log/nginx/error.log;  # 错误日志路径
    pid /run/nginx.pid;          # 主进程PID文件路径
    include /usr/share/nginx/modules/*.conf;  # 加载外部模块配置(全局级引入
    
    2. 核心模块 块

    Nginx 的核心功能模块 events 块,用于处理网络连接相关配置。

    events {
        worker_connections 1024;  # 每个工作进程的最大并发连接数
        use epoll;                # 事件驱动模型(epoll是Linux下高性能选择)
        multi_accept on;          # 允许一个进程一次性接受多个新连接
    }
    
3.业务模块 块

处理具体业务的核心配置块,最核心的是 http 块(HTTP/HTTPS 服务),可以包含多个 server 块(虚拟主机)

# http块:所有HTTP/HTTPS服务的公共配置,可嵌套多个server块
http {
    # HTTP全局公共配置
    include       /etc/nginx/mime.types;  # 加载MIME类型映射
    default_type  application/octet-stream; # 默认响应类型
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request"'; # 日志格式
    access_log  /var/log/nginx/access.log  main; # 访问日志
    sendfile     on;  # 高效文件传输开关
    keepalive_timeout  65;  # 长连接超时时间

    # server块:虚拟主机配置(一个http块可包含多个server)
    server {
        listen       80;  # 监听端口(80=HTTP,443=HTTPS)
        server_name  localhost;  # 域名/IP(可配置多个,用空格分隔)
        root         /usr/share/nginx/html;  # 网站根目录

        # location块:URL路径匹配规则(一个server块可包含多个location)
        location / {
            index  index.html index.htm;  # 默认首页
            try_files $uri $uri/ /index.html;  # 路径匹配规则
        }

        # 错误页面配置
        error_page  404              /404.html;
        error_page  500 502 503 504  /50x.html;
    }

    # 第二个虚拟主机(示例)
    server {
        listen       8080;
        server_name  test.example.com;
        # ... 其他配置
    }
}
4. 特殊配置:HTTPS 专属块

如果配置 HTTPS,会在 server 块内增加 SSL 相关配置:

server {
    listen       443 ssl;  # 监听HTTPS端口并启用SSL
    server_name  example.com;

    # SSL证书配置
    ssl_certificate      /etc/nginx/cert/server.crt;  # 公钥文件
    ssl_certificate_key  /etc/nginx/cert/server.key;  # 私钥文件
    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;
    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers  on;

    # ... 其他配置(如root、location等)
}

配置加载机制

  1. include 指令:Nginx 支持通过 include 引入外部配置文件,实现模块化管理。
    • 把不同虚拟主机配置拆到 /etc/nginx/conf.d/*.conf
    • 把不同代理配置拆到 /etc/nginx/default.d/*.conf
  2. 配置优先级:
    • 同层级:后定义的配置覆盖先定义的;
    • 不同层级:子级(如 location)覆盖父级(如 server/http);
    • location 匹配:精准匹配(=)> 正则匹配(~/~*)> 普通前缀匹配。
nginx.conf 配置详解
# 更多配置详情参考官方文档:
#   * 英文官方文档: http://nginx.org/en/docs/
#   * 俄文官方文档: http://nginx.org/ru/docs/

# 指定Nginx工作进程的运行用户为nginx
user nginx;

# 工作进程数,设置为auto时会自动根据CPU核心数调整
worker_processes auto;

# 错误日志文件路径及存储位置
error_log /var/log/nginx/error.log;

# Nginx主进程PID文件路径,用于标识进程ID
pid /run/nginx.pid;

# 加载动态模块,详细说明可查看/usr/share/doc/nginx/README.dynamic文件
include /usr/share/nginx/modules/*.conf;

# 事件模块配置块,用于设置网络连接相关参数
events {
    # 每个工作进程的最大并发连接数,默认1024
    worker_connections 1024;
}

# HTTP核心模块配置块,包含HTTP服务的主要配置
http {
    # 定义访问日志的格式,命名为main
    # 日志字段说明:客户端IP - 远程用户 [访问时间] "请求信息" 状态码 发送字节数 "来源页面" "用户代理" "代理IP"
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    # 启用访问日志,使用main格式,日志文件存储路径
    access_log  /var/log/nginx/access.log  main;

    # 启用高效文件传输模式,减少磁盘I/O和CPU消耗
    sendfile            on;

    # 启用TCP_NOPUSH选项,在发送响应时累积数据后一次性发送,提高网络效率(需配合sendfile使用)
    tcp_nopush          on;

    # 启用TCP_NODELAY选项,禁用Nagle算法,减少数据传输延迟(适用于实时性要求高的场景)
    tcp_nodelay         on;

    # HTTP长连接超时时间,超过65秒无活动则关闭连接
    keepalive_timeout   65;

    # 文件类型哈希表的最大容量,增大可提高文件类型查找效率
    types_hash_max_size 4096;
# 引入MIME类型配置文件,定义不同文件后缀对应的响应类型
    include             /etc/nginx/mime.types;

    # 默认MIME类型,当无法识别文件类型时使用(二进制流格式)
    default_type        application/octet-stream;

    # 加载/etc/nginx/conf.d目录下的所有.conf后缀配置文件(模块化配置)
    # 更多说明参考http://nginx.org/en/docs/ngx_core_module.html#include
    include /etc/nginx/conf.d/*.conf;

    # 虚拟主机配置块(默认HTTP服务)
    server {
        # 监听IPv4的80端口(HTTP默认端口)
        listen       80;

        # 监听IPv6的80端口
        listen       [::]:80;

        # 虚拟主机域名,_表示匹配所有未明确指定的域名
        server_name  _;

        # 网站根目录,存放静态资源的路径
        root         /usr/share/nginx/html;

        # 加载默认虚拟主机的额外配置文件(来自/etc/nginx/default.d/*.conf)
        include /etc/nginx/default.d/*.conf;

        # 配置404错误页面,当请求资源不存在时返回/404.html
        error_page 404 /404.html;
        # 精确匹配/404.html的访问路径(无额外配置,直接返回文件)
        location = /404.html {
        }

        # 配置500/502/503/504服务器错误页面,返回/50x.html
        error_page 500 502 503 504 /50x.html;
        # 精确匹配/50x.html的访问路径(无额外配置,直接返回文件)
        location = /50x.html {
        }
    }

# TLS/SSL加密服务配置(默认注释,启用需取消注释并配置证书)
#
#    server {
#        # 监听IPv4的443端口(HTTPS默认端口),启用SSL和HTTP/2协议
#        listen       443 ssl http2;
#        # 监听IPv6的443端口,启用SSL和HTTP/2协议
#        listen       [::]:443 ssl http2;
#        # 虚拟主机域名(需替换为实际域名)
#        server_name  _;
#        # 网站根目录(与HTTP服务一致)
#        root         /usr/share/nginx/html;
#
#        # SSL证书文件路径(公钥)
#        ssl_certificate "/etc/pki/nginx/server.crt";
#        # SSL证书密钥文件路径(私钥,需保密)
#        ssl_certificate_key "/etc/pki/nginx/private/server.key";
#        # SSL会话缓存配置:共享缓存,名称SSL,大小1MB
#        ssl_session_cache shared:SSL:1m;
#        # SSL会话超时时间,10分钟内再次连接无需重新握手
#        ssl_session_timeout  10m;
#        # SSL加密套件,优先选择高强度加密算法,排除aNULL和MD5
#        ssl_ciphers HIGH:!aNULL:!MD5;
#        # 优先使用服务器端指定的加密套件
#        ssl_prefer_server_ciphers on;
#
#        # 加载默认虚拟主机的额外配置文件
#        include /etc/nginx/default.d/*.conf;
#
#        # 404错误页面配置(原配置笔误,应为/404.html,此处保留原注释结构)
#        error_page 404 /404.html;
#            location = /40x.html {
#        }
#
#        # 服务器错误页面配置
#        error_page 500 502 503 504 /50x.html;
#            location = /50x.html {
#        }
#    }
}

虚拟主机

同一个 web 服务器提供多个站点。 虚拟主机支持多种方式: 1. 主机名 2. 端口号 3. IP地址(基本不用)

根据名称
#参考主配置文件/etc/nginx/nginx.conf中server块配置(尽量复制过来拿在该,不要手敲)
[root@server ~ 20:01:46]# cp /etc/nginx/nginx.conf /etc/nginx/conf.d/vhost-name.conf
[root@server ~ 20:03:26]# vim /etc/nginx/conf.d/vhost-name.conf

server {
    server_name  web1.bao.cloud;
    root         /usr/share/nginx/web1;
}
server {
    server_name  web2.bao.cloud;
    root         /usr/share/nginx/web2;
}
[root@server ~ 20:06:31]# echo web1.bao.cloud > /usr/share/nginx/web1/index.html
[root@server ~ 20:06:47]# echo web2.bao.cloud > /usr/share/nginx/web1/index.html
[root@server ~ 20:07:07]# systemctl restart nginx

客户端测试

# 配置名称解析,假设web服务器ip地址为10.1.8.10
10.1.8.10 web1.bao.cloud
10.1.8.10 web2.bao.cloud

[root@client ~ 20:08:51]# curl http://web1.bao.cloud/
web1.bao.cloud
[root@client ~ 20:10:34]# curl http://web2.bao.cloud/
web2.bao.cloud

提示:清理环境,避免影响后续实验。

[root@server ~ 20:12:17]# mkdir /etc/nginx/conf.d/vhosts
[root@server ~ 20:13:05]# mv /etc/nginx/conf.d/vhost-name.conf /etc/nginx/conf.d/vhosts

配置 SSL/TLS

生成证书
#--1--生成私钥 
[root@proxy ~ 16:49:16]# mkdir certs && cd certs
[root@proxy certs 16:49:37]# openssl genrsa-out www.key 2048  

#--2--生成请求文件csr
[root@proxy certs 16:50:48]# openssl req -new -key www.key -out www.csr -subj "/C=CN/ST=JS/L=NJ/O=LM/OU=DEVOPS/CN=www.bao.cloud/emailAddress=webad min@bao.cloud
# CN的值必须是网站域名

#--3--使用自己的私钥对请求文件签名,以生成证书 
[root@proxy certs 16:52:24]# openssl x509 -req -days 3650 -in www.csr -signkey www.key -out www.crt

配置站点
[root@proxy certs 16:53:09]# mkdir /etc/ssl/certs/www.bao.cloud
[root@proxy certs 16:53:22]#  mv www* /etc/ssl/certs/www.bao.cloud

# 参照默认配置修改
[root@proxy certs 16:55:21]# cp /etc/nginx/nginx.conf /etc/nginx/conf.d/vhost-www.bao.cloud-ssl.conf
[root@proxy certs 16:56:52]# vim /etc/nginx/conf.d/vhost-www.bao.cloud-ssl.conf

server {
    listen       443 ssl http2;
    listen       [::]:443 ssl http2;
    server_name  www.bao.cloud;
    root         /usr/share/nginx/html;
    # 证书
    ssl_certificate "/etc/ssl/certs/www.bao.cloud/www.crt";
    # 私钥
    ssl_certificate_key "/etc/ssl/certs/www.bao.cloud/www.key";
}

[root@proxy certs 16:57:37]# systemctl restart nginx


配置HTTP重定向到https
[root@proxy certs 16:59:41]# vim /etc/nginx/conf.d/vhost-www.bao.cloud-ssl.conf
server {
    listen       443 ssl http2;
    listen       [::]:443 ssl http2;
    server_name  www.bao.cloud;
    root         /usr/share/nginx/html;
    # 证书
    ssl_certificate "/etc/ssl/certs/www.bao.cloud/www.crt";
    # 私钥
    ssl_certificate_key "/etc/ssl/certs/www.bao.cloud/www.key";
}

# 配置HTTP重定向到https
server {
    listen       80;
    listen       [::]:80;
    server_name  www.bao.cloud;
    root         /usr/share/nginx/html;
    # 添加重定向
    return       301 https://$host$request_uri;
}

[root@proxy certs 17:02:28]# systemctl restart nginx.service 


# 测试
[root@client ~ 17:03:20]# curl http://www.bao.cloud/
<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>

# 使用-k指明目标站点不是一个安全站点

[root@client ~ 17:04:48]#  curl -k https://www.bao.cloud/

# 使用-L指明跟随重定向
[root@client ~ 17:04:55]#  curl -Lk https://www.bao.cloud/


配置基本认证

用户名和密码使用plain text发送,所以最好配置SSL/TLS。

#安装工具
[root@proxy ~ 17:03:28]# yum -y install httpd-tools
[root@proxy ~ 17:04:22]# vim /etc/nginx/conf.d/vhost-www.bao.cloud-ssl.conf
# add into the [server] section
server {
    .....
    location /auth-basic/ {
        auth_basic            "Basic Auth";
        auth_basic_user_file  "/etc/nginx/.htpasswd";
    }
}

[root@proxy ~ 17:07:21]# systemctl restart nginx

# add user for Basic authentication
[root@proxy certs 17:08:02]# yum install -y httpd-tools
[root@proxy certs 17:08:36]# htpasswd -b -c /etc/nginx/.htpasswd bao 123456

# create a test page
[root@proxy ~ 17:09:28]# mkdir /usr/share/nginx/html/auth-basic
[root@proxy ~ 17:10:09]# vim /usr/share/nginx/html/auth-basic/index.html
<html>
<body>
<div style="width: 100%; font-size: 40px; font-weight: bold; text-align: baoer;">
Test Page for Basic Authentication
</div>
</body>
</html>

# 测试,通过-u选项指定用户名和密码
[root@client ~ 17:15:49]# curl -ku bao:123456 https://www.bao.cloud/auth-basic/

支持动态脚本

使用 PHP
# 安装PHP和php-fpm,建议把其他的扩展包一起安装
[root@proxy ~ 17:16:56]# yum install -y php php-fpm
 php-fpm: 负责接收web程序发来的php代码
# php:负责解析和执行php代码,并将结果返回给php-fpm

# 当客户端访问 php 站点时,web站点接收用户请求
# 并转发 php 代码给php-fpm服务
# php-fpm 服务调用php解析php网页,然后将结果返回给web程序
# web 程序将结果返回给客户端

 启用并启动php-fpm服务
 [root@proxy ~ 17:17:08]# systemctl enable php-fpm --now

# 查看 php 版本
[root@proxy ~ 17:20:55]# php -v

# 测试 php 是否正常
[root@proxy ~ 17:21:26]# echo "<?php echo 'PHP Test Page'.\"\n\"; ?>" > php_test.php 
[root@proxy ~ 17:21:40]#  php php_test.php 
PHP Test Page

# 准备测试页,使用phpinfo查看详细信息
[root@proxy ~ 17:22:10]# echo "<?php phpinfo(); ?>" > /usr/share/nginx/html/info.php 

配置虚拟机主机支持php
# 修改配置文件
[root@proxy ~ 17:29:52]# vim /etc/nginx/conf.d/vhost-www.bao.cloud-ssl.conf
# add into the [server] section
server {
    listen       443 ssl http2;
    listen       [::]:443 ssl http2;
    server_name  www.bao.cloud;
    root         /usr/share/nginx/html;

    ssl_certificate "/etc/ssl/certs/www.bao.cloud/www.crt";
    ssl_certificate_key "/etc/ssl/certs/www.bao.cloud/www.key"
    # 匹配所有以.php结尾的URL请求,验证PHP文件是否存在
    # 存在则转发给本地9000端口的PHP-FPM处理,不存在则返回404
    location ~ \.php$ {
        # try_files:检测请求的PHP文件($uri)是否存在,不存在直接返回404错误
        # 作用:防止伪造PHP路径的恶意请求(如/xxx.php/yyy.jpg)被PHP-FPM解析,是重要的安全防护
        try_files $uri =404;
        # fastcgi_pass:指定FastCGI服务地址,将PHP请求转发到本地9000端口的PHP-FPM进程
        fastcgi_pass 127.0.0.1:9000;
        
         fastcgi_index:定义FastCGI默认索引文件,请求目录时默认使用index.php
        fastcgi_index index.php;
        
        # fastcgi_param:设置传递给PHP-FPM的核心环境变量
        # SCRIPT_FILENAME:指定要执行的PHP文件绝对路径,
        # $document_root是网站根目录,$fastcgi_script_name是请求的脚本名
        fastcgi_param SCRIPT_FILENAME   
        
         # include:引入Nginx默认的FastCGI参数配置文件,包含QUERY_STRING、REQUEST_METHOD等PHP运行必需的环境变量
        include fastcgi_params;
        }
        }
      # 配置HTTP重定向到https
server {
    listen       80;
    listen       [::]:80;
    server_name  www.bao.cloud;
    root         /usr/share/nginx/html;
    # 添加重定向
    return       301 https://$host$request_uri;
}      
还可以将php的配置与虚拟主机配置分离配置
[root@proxy ~ 17:35:12]# vim vhost-www.bao.cloud-ssl.conf
server {
    listen       443 ssl http2;
    listen       [::]:443 ssl http2;
    server_name  www.bao.cloud;
    root         /usr/share/nginx/html;

    ssl_certificate "/etc/ssl/certs/www.bao.cloud/www.crt";
    ssl_certificate_key "/etc/ssl/certs/www.bao.cloud/www.key";

    # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;
}

# 配置HTTP重定向到https
server {
    listen       80;
    listen       [::]:80;
    server_name  www.bao.cloud;
    root         /usr/share/nginx/html;
    # 添加重定向
    return       301 https://$host$request_uri;
}

[root@proxy ~ 17:41:16]# vim /etc/nginx/default.d/php.conf 
location ~ \.php$ {
    try_files $uri =404;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

配置完成后,务必要重启nginx服务

systemctl restart nginx

记得客户端要测试

反向代理介绍

反向代理(reverse proxy),指的是代理外网用户的请求到内部的指定的服务器,并将数据返回给用户。客户端不直接与后端服务器进行通信,而是与反向代理服务器进行通信,隐藏了后端服务器的 IP 地址

反向代理的主要作用是提供负载均衡和高可用性:

  • 负载均衡**:Nginx可以将传入的请求分发给多个后端服务器,以平衡服务器的负载,提高系统性能和可靠性。

  • 缓存功能*:Nginx可以缓存静态文件或动态页面,减轻服务器的负载,提高响应速度。

动静分离**:将动态生成的内容(如 PHP、Python、Node.js 等)和静态资源(如 HTML、CSS、JavaScript、图片、视频等)分别存放在不同的服务器或路径上。

  • 多站点代理:Nginx可以代理多个域名或虚拟主机,将不同的请求转发到不同的后端服务器上,实现多个站点的共享端口。

反向代理模块

ngx_http_proxy_module:将客户端的请求以http协议转发至指定服务器进行处理。

ngx_http_upstream_module**:用于定义为proxy_pass,fastcgi_pass,uwsgi_pass等指令引用的后端服务器分组

*ngx_stream_proxy_module**:将客户端的请求以tcp协议转发至指定服务器处理。

ngx_http_fastcgi_module](https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html)**:将客户端对php的请求以fastcgi协议转发至指定服务器处理。

Location 配置

Location 配置语法

Nginx 使用 location 匹配规则 + proxy_pass 反向代理指令实现反向代理功能,匹配本质是 “URL 路径匹配 → 命中对应规则 → 转发至指定后端地址”。

location 定义匹配路径

proxy_pass 指定后端服务地址

http {
  #后端服务可配置upstream 集群(推荐,支持负载均衡)
  upstream backend_nginx {
        nginx 192.168.1.100:8080;  # 后端服务1
        nginx 192.168.1.101:8080;  # 后端服务2(多节点自动轮询负载均衡)
    }
server {
        listen 80;  # Nginx 监听端口
        server_name localhost;  # 访问域名/IP

        # 1. 匹配所有请求(兜底规则)
        location / {
            proxy_pass http://backend_nginx;  # 转发至 upstream 集群
            # 必加的反向代理核心参数(传递客户端真实信息、适配后端服务)
            proxy_set_header Host $host;                # 传递客户端访问的域名
            proxy_set_header X-Real-IP $remote_addr;    # 传递客户端真实IP
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #传递IP链路
            proxy_set_header X-Forwarded-Proto $scheme; # 传递请求协议(http/https)
        }

        # 2. 匹配特定路径(如 /api 开头的请求,单独转发)
        location /api/ {
            proxy_pass http://192.168.1.102:9090/;  # 后端地址末尾带 /,会剔除匹配的 /api/
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}
Location 匹配规则
  1. 后端匹配逻辑:URL 路径 → 按 location 优先级命中规则 → 由规则内的 proxy_pass 转发至对应后端
  2. 优先级:精确匹配(=)> 前缀匹配(^~)> 正则匹配(/*)> 普通前缀 > 兜底(/);
  3. URL 重构关键:proxy_pass 末尾是否带 /,决定是否剔除 location 匹配的路径前缀。
1. 精确匹配(=)

语法:location = /path { ... }

逻辑:仅当请求 URL 与 /path 完全一致时命中,优先级最高。

示例

# 仅匹配 http://localhost/login,不匹配 /login?a=1、/login/
location = /login {
    proxy_pass http://backend_login:8080;
}
2. 前缀配(^~)

语法:location ^~ /path { ... }

逻辑:URL 以 /path 开头即命中,优先级仅次于精确匹配,会跳过正则匹配

用途:优先匹配静态资源(如 /static、/img)或特定业务路径,避免被正则规则拦截。

示例

# 匹配所有 /static 开头的请求(如 /static/css/main.css、/static/img/1.jpg)
location ^~ /static/ {
    proxy_pass http://backend_static:80;
}
3. 正则匹配(~ / ~*)

语法:

区分大小写:location ~ /regex { ... }(如 /API 不匹配 /api 规则)

不区分大小写:location ~* /regex { ... }(如 /API、/api 均匹配)

逻辑:URL 符合正则表达式即命中,优先级低于前缀匹配(^~),多个正则规则按定义顺序匹配,先命中先生效

示例:

# 匹配所有 .jpg、.png、.gif 结尾的图片请求(不区分大小写)
location ~* \.(jpg|png|gif)$ {
    proxy_pass http://backend_img:80;
}
4. 普通前缀匹配(无符号)

语法:location /path { ... }

逻辑:URL 以 /path 开头即命中,优先级低于正则匹配,多个普通前缀规则按 “路径最长” 优先命中

示例:

# 规则1:匹配 /api/xxx(路径长度3)
location /api/ {
    proxy_pass http://backend_api:9090;
}
# 规则2:匹配 /api/user/xxx(路径长度7,比规则1长,优先命中)
location /api/user/ {
    proxy_pass http://backend_user:9090;
}
5. 通用匹配(/)

语法:location / { ... }

逻辑:所有未被上述规则命中的请求,都会匹配此规则(兜底),优先级最低。

用途:通常作为全局反向代理,转发所有默认请求到主后端服务。

proxy_pass 后端地址细节

proxy_pass 末尾是否带 /,会直接改变转发到后端的 URL 路径,这是后端匹配后 “URL 重构” 的核心,分 2 种场景:

场景 1:proxy_pass 末尾带 /

逻辑:转发时,会剔除 location 匹配的路径前缀,将剩余路径拼接在后端地址后。

示例:

# location 匹配 /api/,proxy_pass 末尾带 /
location /api/ {
    proxy_pass http://192.168.1.102:9090/;
}
# 实际转发逻辑:
# 客户端请求 http://localhost/api/user/list → 后端接收 http://192.168.1.102:9090/user/list
场景 2:proxy_pass 末尾不带 /

逻辑:转发时,会保留 location 匹配的路径前缀,直接拼接在后端地址后。

示例:

# location 匹配 /api/,proxy_pass 末尾不带 /
location /api/ {
    proxy_pass http://192.168.1.102:9090;
}
# 实际转发逻辑:
# 客户端请求 http://localhost/api/user/list → 后端接收 http://192.168.1.102:9090/api/user/list
综合示例

配置文件

http {
    upstream backend_main { nginx 192.168.1.200:8080; }
    upstream backend_api { nginx 192.168.1.201:9090; }
    upstream backend_static { nginx 192.168.1.202:80; }
    upstream backend_login { nginx 192.168.1.203:8080; }

    server {
        listen 80;
        server_name localhost;

        # 1. 精确匹配:仅 /login → 后端 login 服务
        location = /login {
            proxy_pass http://backend_login;
            proxy_set_header Host $host;
        }

        # 2. 前缀匹配:/static/ 开头 → 后端静态服务(跳过正则)
        location ^~ /static/ {
            proxy_pass http://backend_static;
            proxy_set_header Host $host;
        }

        # 3. 正则匹配:图片后缀 → 后端静态服务
        location ~* \.(jpg|png|gif)$ {
            proxy_pass http://backend_static;
            proxy_set_header Host $host;
        }

        # 4. 普通前缀:/api/ 开头 → 后端 api 服务
        location /api/ {
            proxy_pass http://backend_api/;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }

        # 5. 兜底匹配:所有未命中的请求 → 主后端服务
        location / {
            proxy_pass http://backend_main;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}

反向代理实践环境

环境架构

/etc/hosts所有节点

# 所有节点
[root@nginx ~]# vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

############ proxy ##################
10.1.8.11 client.laoma.cloud client
10.1.8.20 www.laoma.cloud www
10.1.8.20 proxy.laoma.cloud proxy
10.1.8.21 nginx1.laoma.cloud nginx1
10.1.8.22 nginx2.laoma.cloud nginx2
10.1.8.23 nginx3.laoma.cloud nginx3
后端 nginx 服务器配置
# 除了客户端,所有节点安装nginx并启动nginx服务。
# 以nginx1为例
[root@nginx1 ~]# yum -y install nginx

# 启动并启用服务
[root@nginx1 ~]# systemctl enable nginx --now

# 防火墙设置
[root@nginx1 ~]# firewall-cmd --add-service=http --permanent
[root@nginx1 ~]# firewall-cmd --add-service=http

# 准备主页-其他节点
[root@nginx1 ~]# echo Welcome to $(hostname) > /usr/share/nginx/html/index.html
[root@nginx2 ~]# echo Welcome to $(hostname) > /usr/share/nginx/html/index.html
[root@nginx3 ~]# echo Welcome to $(hostname) > /usr/share/nginx/html/index.html

# 客户端测试
[root@client ~]# curl http://www.laoma.cloud/
Welcome to www.laoma.cloud
[root@client ~]# curl http://nginx1.laoma.cloud/
Welcome to nginx1.laoma.cloud
[root@client ~]# curl http://nginx2.laoma.cloud/
Welcome to nginx2.laoma.cloud
[root@client ~]# curl http://nginx3.laoma.cloud/
Welcome to nginx3.laoma.cloud
前端 proxy 服务器配置
# 准备主页-代理节点
[root@proxy ~]# yum -y install nginx
[root@proxy ~]# echo Welcome to www.laoma.cloud > /usr/share/nginx/html/index.html

[root@proxy ~]# mkdir /var/nginx
[root@proxy ~]# echo "Hello, Nginx" > /var/nginx/index.html
[root@proxy ~]# echo "Hello, Laoma" > /var/nginx/test.txt
[root@proxy ~]# cp /usr/share/nginx/html/nginx-logo.png /var/nginx/
[root@proxy ~]# ls /var/nginx/
index.html  nginx-logo.png  test.txt	

[root@proxy ~]# vim /etc/nginx/conf.d/proxy.conf
server {
	listen  80;
	server_name www.laoma.cloud;

    # 匹配根位置
    location / {
      root /var/nginx;
      index index.html;
    }
}
# 重新加载nginx配置
[root@proxy ~]# nginx -s reload
测试
[root@client ~]# curl http://www.laoma.cloud/
Hello, Nginx

[root@client ~]# curl http://www.laoma.cloud/test.txt
Hello, Laoma

反向代理基础实践-代理本地

环境准备
[root@proxy ~]# mkdir /var/nginx/nginx{1,2}
[root@proxy ~]# echo "Hello, I'm here /var/nginx/nginx1" > /var/nginx/nginx1/index.html
[root@proxy ~]# echo "Hello, I'm here /var/nginx/nginx2" > /var/nginx/nginx2/index.html

[root@proxy ~]# mkdir /var/nginx{1,2}
[root@proxy ~]# echo "Hello, Nginx1" > /var/nginx1/index.html
[root@proxy ~]# echo "Hello, Nginx2" > /var/nginx2/index.html
[root@proxy ~]# tree /var/nginx*
/var/nginx
├── index.html
├── nginx1
│   └── index.html
├── nginx2
│   └── index.html
├── nginx-logo.png
└── test.txt
/var/nginx1
└── index.html
/var/nginx2
└── index.html

2 directories, 7 files

[root@proxy ~]# \
for path1 in www{1..2}
do
  for path2 in nginx{1..2}
  do
    mkdir -p /var/$path1/$path2
	echo "Hello, I'm here /var/$path1/$path2" > /var/$path1/$path2/index.html
  done
done

[root@proxy ~]# tree /var/www*
/var/www1
├── nginx1
│   └── index.html
└── nginx2
    └── index.html
/var/www2
├── nginx1
│   └── index.html
└── nginx2
    └── index.html

4 directories, 4 files
基本测试**
[root@client ~]# curl http://www.laoma.cloud/
Hello, Nginx

# 显示结果是目录/var/nginx/nginx1中内容
[root@client ~]# curl http://www.laoma.cloud/nginx1/
Hello, I'm here /var/nginx/nginx1

# 显示结果是目录/var/nginx/nginx2中内容
[root@client ~]# curl http://www.laoma.cloud/nginx2/
Hello, I'm here /var/nginx/nginx2
实践1:无符号匹配
[root@proxy ~]# vim /etc/nginx/conf.d/proxy.conf
server {
	listen  80;
	server_name www.laoma.cloud;

    # 匹配根位置
    location / {
        root /var/nginx;
        index index.html;
    }

    # 匹配/nginx1时,/var目录下找nginx1,完整路径是/var/nginx1
    location /nginx1 {
        root /var;
        # 等效于下面的 alias 语句,必须使用绝对路径
        # alias /var/nginx1;
        index index.html;
    }
}
# 重新加载nginx配置
[root@proxy ~]# nginx -s reload
访问测试
# nginx1 后面必须添加 / 符号
[root@client ~]# curl http://www.laoma.cloud/nginx1/
Hello, Nginx1
# 显示结果是目录/var/nginx1中内容

# nginx2 后面必须添加 / 符号
[root@client ~]# curl http://www.laoma.cloud/nginx2/
Hello, I'm here /var/nginx/nginx2
# 显示结果是目录/var/nginx/nginx2中内容

实验结果:无符号匹配优先级高于默认的/。

实践2:正则表达式匹配
[root@proxy ~]# vim /etc/nginx/conf.d/proxy.conf
server {
	listen  80;
	server_name www.laoma.cloud;

    # 匹配根位置
    location / {
        root /var/nginx;
        index index.html;
    }

    # 匹配/nginx1时,/var目录下找nginx1,完整路径是/var/nginx1
    location /nginx1 {
        root /var;
        # 等效于下面的 alias 语句,必须使用绝对路径
        # alias /var/nginx1;
        index index.html;
    }

    # 正则表达式匹配 /nginx.*
    location ~ /nginx.* {
        root /var/www1;
        index index.html;
    }
}
# 重新加载nginx配置
[root@proxy ~]# nginx -s reload
访问测试
# nginx1 后面必须添加 / 符号
[root@client ~]# curl http://www.laoma.cloud/nginx1/
Hello, I'm here /var/www1/nginx1
# 显示结果是目录/var/www1/nginx1中内容

# nginx2 后面必须添加 / 符号
[root@client ~]# curl http://www.laoma.cloud/nginx2/
Hello, I'm here /var/www1/nginx2
# 显示结果是目录/var/www1/nginx2中内容

实验结果:正则表达式匹配优先级高于无符号。

实践3:精确匹配
[root@proxy ~]# vim /etc/nginx/conf.d/proxy.conf
server {
	listen  80;
	server_name www.laoma.cloud;

    # 匹配根位置
    location / {
        root /var/nginx;
        index index.html;
    }

    # 匹配/nginx1时,/var目录下找nginx1,完整路径是/var/nginx1
    location /nginx1 {
        root /var;
        # 等效于下面的 alias 语句,必须使用绝对路径
        # alias /var/nginx1;
        index index.html;
    }

    # 正则表达式匹配 /nginx.*
    location ~ /nginx.* {
        root /var/www1;
        index index.html;
    }

    # 精确匹配
    location = /nginx2/index.html {
        root /var/www2;
        index index.html;
    }

}
# 重新加载nginx配置
[root@proxy ~]# nginx -s reload
访问测试
# nginx1 后面必须添加 / 符号
[root@client ~]# curl http://www.laoma.cloud/nginx1/
Hello, I'm here /var/www1/nginx1
# 显示结果是目录/var/www1/nginx1中内容

# nginx2 后面必须添加 / 符号
[root@client ~]# curl http://www.laoma.cloud/nginx2/
Hello, I'm here /var/www2/nginx2
# 显示结果是目录/var/www2/nginx2中内容

实验结果:精确匹配优先级高于正则表达式。

反向代理基础实践-代理远端

实践1:无符号匹配
[root@proxy ~]# vim /etc/nginx/conf.d/proxy.conf
server {
    listen  80;
    server_name www.laoma.cloud;
    
    # 匹配根位置
    location / {
        root /var/nginx;
        index index.html;
    }

    # 匹配 /nginx1/ 开头,代理到nginx1.laoma.cloud,/nginx1/不组合到后端服务器
    # 访问 /nginx1/ 开头,相当于直接访问http://nginx1.laoma.cloud/
    location /nginx1/ {
        # 后端服务
        proxy_pass http://nginx1.laoma.cloud/; # 注意:代理后端后面有 /。
        index index.html;
    }
}
# 重新加载nginx配置
[root@proxy ~]# nginx -s reload
访问测试*
# nginx1 后面必须添加 / 符号
[root@client ~]# curl http://www.laoma.cloud/nginx1/
Welcome to nginx1.laoma.cloud
# 显示结果是服务器 nginx1.laoma.cloud 内容

# nginx2 后面必须添加 / 符号
[root@client ~]# curl http://www.laoma.cloud/nginx2/
Hello, I'm here /var/nginx/nginx2
# 显示结果是目录/var/nginx/nginx2中内容

实验结果:无符号匹配优先级高于默认的/。

实践2:正则表达式匹配
[root@proxy ~]# vim /etc/nginx/conf.d/proxy.conf
server {
    listen  80;
    server_name www.laoma.cloud;
    
    # 匹配根位置
    location / {
        root /var/nginx;
        index index.html;
    }

    # 匹配 /nginx1/ 开头,代理到nginx1.laoma.cloud,/nginx1/不组合到后端服务器
    # 访问 /nginx1/ 开头,相当于直接访问http://nginx1.laoma.cloud/
    location /nginx1/ {
        # 后端服务
        proxy_pass http://nginx1.laoma.cloud/; # 注意:代理后端后面有 /。
        index index.html;
    }
 
    # 正则表达式匹配 /nginx.*
    location ~ /nginx[12].* {
        # 手动重写路径:去掉 /nginx 前缀,转发到目标服务器
        # ^/nginx[12](.*)$ 匹配 /nginx[12] 开头的完整路径,$1表示 /nginx[12] 后的所有内容
        # break 表示重写后不再匹配其他 rewrite 规则
        rewrite ^/nginx[12](.*)$ $1 break;
         
        # proxy_pass 不带 URI(无末尾的 /),配合 rewrite 实现路径替换
        proxy_pass http://nginx2.laoma.cloud;  
        index index.html;
    }
}
# 重新加载nginx配置
[root@proxy ~]# nginx -s reload
访问测试
# nginx 后面必须添加 / 符号
[root@client ~]# curl http://www.laoma.cloud/nginx1/
Welcome to nginx2.laoma.cloud
# 显示结果是服务器 nginx2.laoma.cloud 内容

# nginx 后面必须添加 / 符号
[root@client ~]# curl http://www.laoma.cloud/nginx2/
Welcome to nginx2.laoma.cloud
# 显示结果是服务器 nginx2.laoma.cloud 内容

实验结果:正则表达式匹配优先级高于无符号。

实践3:精确匹配
[root@proxy ~]# vim /etc/nginx/conf.d/proxy.conf
server {
    listen  80;
    server_name www.laoma.cloud;
    
    # 匹配根位置
    location / {
        root /var/nginx;
        index index.html;
    }

    # 匹配 /nginx1/ 开头,代理到nginx1.laoma.cloud,/nginx1/不组合到后端服务器
    # 访问 /nginx1/ 开头,相当于直接访问http://nginx1.laoma.cloud/
    location /nginx1/ {
        # 后端服务
        proxy_pass http://nginx1.laoma.cloud/; # 注意:代理后端后面有 /。
        index index.html;
    }
 
    # 正则表达式匹配 /nginx.*
    location ~ /nginx[12].* {
        # 手动重写路径:去掉 /nginx 前缀,转发到目标服务器
        # ^/nginx[12](.*)$ 匹配 /nginx[12] 开头的完整路径,$1表示 /nginx[12] 后的所有内容
        # break 表示重写后不再匹配其他 rewrite 规则
        rewrite ^/nginx[12](.*)$ $1 break;
         
        # proxy_pass 不带 URI(无末尾的 /),配合 rewrite 实现路径替换
        proxy_pass http://nginx2.laoma.cloud;  
        index index.html;
    }

    # 精确匹配
    location = /nginx1/ {
        proxy_pass http://nginx1.laoma.cloud/;  
        index index.html;
    }

}
# 重新加载nginx配置
[root@proxy ~]# nginx -s reload
访问测试*
# nginx1 后面必须添加 / 符号
[root@client ~]# curl http://www.laoma.cloud/nginx1/
Welcome to nginx1.laoma.cloud
# 显示结果是服务器 nginx1.laoma.cloud 内容

# nginx2 后面必须添加 / 符号
[root@client ~]# curl http://www.laoma.cloud/nginx2/
Welcome to nginx2.laoma.cloud
# 显示结果是服务器 nginx2.laoma.cloud 内容

实验结果:精确匹配优先级高于正则表达式。

反向代理基础实践综合实践

后端 nginx 服务器配置
# 除了客户端,所有节点安装nginx并启动nginx服务。
# 以nginx1为例
[root@proxy ~ 17:19:46]# yum install -y nginx
[root@proxy ~ 17:21:47]# systemctl enable nginx --now
# 准备主页-其他节点

#######################################################
10.1.8.11 client.laoma.cloud client
10.1.8.20 www.laoma.cloud www
10.1.8.20 proxy.laoma.cloud proxy
10.1.8.21 company.laoma.cloud company
10.1.8.22 iwebshop.laoma.cloud iwebshop

proxy 作为代理节点:
  1. 当访问www.laoma.cloud,代理节点默认主页
  2. 当访问www.laoma.cloud/shop/,代理到iwebshop.laoma.cloud/shop/
  3. 当访问www.laoma.cloud/company/,代理到company.laoma.cloud/company/
  
 # 准备后端真实服务器
[root@company ~ 17:29:17]# yum install -y nginx
[root@company ~ 17:30:06]# vim /etc/nginx/nginx.conf
......
    server {
        # 设置字符集
        charset utf-8;
        listen       80;
......
[root@company ~ 17:33:47]# systemctl enable nginx --now
[root@company ~ 17:34:25]# mkdir /usr/share/nginx/html/company/
[root@company ~ 17:35:51]# echo '欢迎来到万和 IT 教育' > /usr/share/nginx/html/company/index.html

[root@iwebshop ~ 17:36:49]# yum install -y nginx
[root@iwebshop ~ 17:37:13]# vim /etc/nginx/nginx.conf
......
    server {
        # 设置字符集
        charset utf-8;
        listen       80;
......

准备后端iwebshop
[root@iwebshop ~ 17:38:16]# systemctl enable nginx --now
[root@iwebshop ~ 17:38:21]# echo '欢迎来到万和购物天堂' > /usr/share/nginx/html/index.html

[root@proxy ~ 17:39:42]# yum install -y nginx
[root@proxy ~ 17:40:13]# cp /etc/nginx/nginx.conf /etc/nginx/conf.d/proxy.conf
[root@proxy ~ 17:42:24]# vim /etc/nginx/conf.d/proxy.conf
server {
    listen       80;
    listen       [::]:80;
    server_name  _;

    # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;

    location / {
       root         /usr/share/nginx/html;
    }
    location /company/ {
       proxy_pass http://company.laoma.cloud/; 
    }
    location /shop/ {
       proxy_pass http://iwebshop.laoma.cloud;
       proxy_set_header Host $host;                # 传递客户端访问的域名
       proxy_set_header X-Real-IP $remote_addr;    # 传递客户端真实IP
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #传递IP链路
       proxy_set_header X-Forwarded-Proto $scheme; # 传递请求协议(http/https)
    }
}

[root@proxy ~ 17:46:56]# systemctl enable nginx --now

访问测试
[root@client ~ 10:25:34]# curl http://www.laoma.cloud/company/
欢迎来到万和 IT 教育
[root@client ~ 10:26:06]# curl http://www.laoma.cloud/shop/
欢迎来到万和购物天堂

################## 准备商城运行环境 ##############################

商城运行环境需要的php版本是5.5-7.3之间

这里以7.2版本为例

[root@iwebshop ~ 10:41:05]# yum install -y yum-utils
[root@iwebshop ~ 10:41:26]# yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm
[root@iwebshop ~ 11:42:18]# yum-config-manager --disable 'remi-php*'
[root@iwebshop ~ 11:43:09]# yum-config-manager --enable remi-php72
[root@iwebshop ~ 11:44:23]# yum install -y php php-fpm
[root@iwebshop ~ 11:45:48]# systemctl enable php-fpm --now

# 配置 Nginx支持 PHP
[root@iwebshop ~ 11:57:29]# vim /etc/nginx/default.d/php.conf
location ~ \.php$ {
    try_files $uri =404;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}
[root@iwebshop ~ 12:18:04]# systemctl restart nginx

# 测试php
[root@iwebshop ~ 12:22:24]# cat > /usr/share/nginx/html/phpinfo.php << 'EOF'
<?php phpinfo(); ?>
EOF

[root@client ~ 12:27:35]# curl http://www.laoma.cloud/shop/phpinfo.php

# 配置数据库
[root@iwebshop ~ 12:29:05]# yum install -y mariadb-server
[root@iwebshop ~ 12:29:05]# systemctl enable mariadb --now

# 安全初始化,设置root密码为123
[root@iwebshop ~ 12:29:22]# mysql_secure_installation

[root@iwebshop ~ 12:30:22]# mysql -u root -p123
MariaDB [(none)]> CREATE DATABASE iwebshop;
MariaDB [(none)]> CREATE USER iwebshop@localhost IDENTIFIED BY '123';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON iwebshop.* TO iwebshop@localhost;
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> exit

准备商城运行环境
# 安装网站需要的依赖包
[root@iwebshop ~ 12:34:55]# yum install -y php-mysqlnd php-gd php-xml php-mbstring php-json php-opcache php-cli php-pecl-zip

# php-fpm需要以nginx身份运行,因为nginx账户对目录/usr/share/nginx/html/iwebshop读写权限
[root@iwebshop ~ 12:37:46]# vim /etc/php-fpm.d/www.conf
# 修改以下参数,其他保持默认
user = nginx
group = nginx
[root@iwebshop ~ 12:40:01]# systemctl restart php-fpm


# 准备网站文件,找老师获取商城材料
[root@iwebshop ~ 12:41:08]# ls
anaconda-ks.cfg  iwebshop-v.5.15.zip  upload.zip
[root@iwebshop ~ 12:22:59]# unzip iwebshop-v.5.15.zip
[root@iwebshop ~ 12:43:18]# unzip upload.zip
[root@iwebshop ~ 12:43:18]# mv iwebshop-v.5.15 /usr/share/nginx/html/shop
[root@iwebshop ~ 12:44:58]# cp -a upload/* /usr/share/nginx/html/shop/upload/
[root@iwebshop ~ 12:46:36]# chown -R nginx:nginx /usr/share/nginx/html/shop/

# 配置虚拟主机
[root@iwebshop ~ 12:50:10]# cp /etc/nginx/nginx.conf /etc/nginx/conf.d/vhost-shop.conf
[root@iwebshop ~ 12:54:36]# vim /etc/nginx/conf.d/vhost-shop.conf
server {
    charset      utf-8;
    listen       80;
    listen       [::]:80;
    server_name  www.laoma.cloud;
    root         /usr/share/nginx/html;
    index        index.php index.html;

    # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;
}
[root@iwebshop ~ 12:56:19]# systemctl restart nginx

laoma123
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐