Nginx 服务器
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 配置采用层级化、模块化的组织方式,整体是 “全局块 → 核心模块块 → 业务模块块” 的嵌套结构
-
全局配置块
作用于 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等)
}
配置加载机制
- include 指令:Nginx 支持通过
include引入外部配置文件,实现模块化管理。- 把不同虚拟主机配置拆到
/etc/nginx/conf.d/*.conf - 把不同代理配置拆到
/etc/nginx/default.d/*.conf
- 把不同虚拟主机配置拆到
- 配置优先级:
- 同层级:后定义的配置覆盖先定义的;
- 不同层级:子级(如 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协议转发至指定服务器处理。
- ngx_http_uwsgi_module:将客户端对Python的请求以uwsgi协议转发至指定服务器处理。
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 匹配规则
- 后端匹配逻辑:URL 路径 → 按 location 优先级命中规则 → 由规则内的 proxy_pass 转发至对应后端;
- 优先级:精确匹配(=)> 前缀匹配(^~)> 正则匹配(/*)> 普通前缀 > 兜底(/);
- 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
更多推荐

所有评论(0)