CentOS搭建:Nginx
2024/8/8大约 12 分钟
sudo:Linux系统管理指令,允许系统管理员让普通用户执行部分root命令,如 halt、reboot、su 等。
环境依赖
| 软件/环境 | 版本 | 包名 | 备注 |
|---|---|---|---|
| Linux | CentOS 7.x | ||
| Nginx | 1.24.0 | nginx-1.24.0.tar.gz | 官网 |
安装依赖
# 更新 yum 软件包(排除内核更新,避免系统不稳定)
sudo yum -y update --exclude=kernel*
# 安装编译必需工具:gcc/gcc-c++ 编译器、make 构建工具
sudo yum -y install gcc gcc-c++ make
# 安装 libtool:通用库支持工具,用于编译过程中库文件管理
sudo yum -y install libtool
# 安装 zlib/zlib-devel:支持数据压缩,Nginx 压缩模块依赖
sudo yum -y install zlib zlib-devel
# 安装 openssl/openssl-devel:支持 SSL/TLS 协议,实现 HTTPS 功能依赖
sudo yum -y install openssl openssl-devel
# 安装 pcre/pcre-devel:支持正则表达式,Nginx 地址匹配(如 location)依赖
sudo yum -y install pcre pcre-devel解压缩包
# 解压 Nginx 源码包到 /soft/nginx 目录
sudo tar -zxvf nginx-1.24.0.tar.gz -C /soft/nginx-zxvf :z=解压gz格式,x=提取文件,v=显示过程,f=指定包文件;-C=指定目标目录
编译&安装
# 进入 Nginx 源码目录
cd /soft/nginx/nginx-1.24.0
# 配置编译参数(指定安装路径+启用核心模块)
sudo ./configure \
--prefix=/soft/nginx/nginx-1.24.0/local/nginx \ # 指定安装根目录:所有程序、配置、日志文件均在此目录
--with-http_stub_status_module \ # 启用 Stub Status 模块:获取 Nginx 运行状态(连接数、负载等)
--with-http_v2_module \ # 启用 HTTP/2 模块:支持 HTTP/2 协议,提升访问速度
--with-http_ssl_module \ # 启用 SSL 模块:支持 HTTPS 协议,加密传输数据
--with-http_realip_module \ # 启用 Real IP 模块:从请求头提取真实客户端 IP(解决代理隐藏IP问题)
--with-http_sub_module \ # 启用 Sub 模块:替换响应内容中的文本(如替换页面链接)
--with-http_gzip_static_module \ # 启用 Gzip 静态模块:预压缩静态文件(如JS/CSS/HTML),减少传输带宽
--with-stream \ # 启用 Stream 模块:支持 TCP/UDP 代理(如代理 MySQL、Redis 等非HTTP服务)
--with-stream_ssl_module # 启用 Stream SSL 模块:为 TCP/UDP 代理添加 SSL 加密(如加密 MySQL 连接)
# 编译并安装(make 编译源码,make install 复制文件到指定安装目录)
sudo make && sudo make installconfigure命令是用来配置Nginx的编译选项,包括:
--prefix=/soft/nginx/nginx-1.24.0/local/nginx:指定Nginx安装后的根目录。所有的Nginx文件(包括可执行文件、配置文件等)都将安装在这里。--with-http_stub_status_module:启用Nginx的Stub Status模块,这个模块用于提供Nginx服务器的状态信息。--with-http_v2_module:启用HTTP/2模块,这个模块用于支持HTTP/2协议。--with-http_ssl_module:启用SSL模块,这个模块用于支持HTTPS协议。--with-http_realip_module:启用Real IP模块,这个模块用于从HTTP请求头(如X-Forwarded-For)中获取真实客户端IP地址。--with-http_sub_module:启用替换模块,这个模块允许在响应内容中替换文本。--with-http_gzip_static_module:启用Gzip静态模块,这个模块用于预压缩文件,并在用户请求时发送压缩后的文件,以减少网络传输量。--with-stream选项用于启用 Nginx 的 TCP/UDP 代理模块(stream 模块)。这个模块允许 Nginx 处理非 HTTP 协议的 TCP 和 UDP 流。例如,你可以使用它来代理 SSL/TLS 加密的 TCP 连接(如 HTTPS 流量,但更常用于其他协议如 MySQL、MongoDB、Redis 等的加密连接),或者简单的 TCP/UDP 转发。启用 stream 模块后,你可以在 Nginx 配置文件中使用stream块来定义这些代理规则,类似于 HTTP 服务器的server块。--with-stream_ssl_module选项用于在 Nginx 的 stream 模块中启用 SSL/TLS 支持。这意味着你可以使用 Nginx 来代理加密的 TCP 连接,如 HTTPS 流量(尽管这通常通过 HTTP 模块处理)或其他基于 SSL/TLS 的协议。这个模块允许你在 stream 配置块中使用 SSL/TLS 相关的指令,如ssl_certificate和ssl_certificate_key,来配置 SSL/TLS 证书和密钥,从而保护 TCP 连接的安全性。
修改配置
# 查看 Nginx 配置目录下的 nginx.conf 文件(验证是否存在)
ll -a /soft/nginx/nginx-1.24.0/local/nginx/conf/ |grep nginx
# 备份原始配置文件(后缀加日期,便于回滚)
sudo cp /soft/nginx/nginx-1.24.0/local/nginx/conf/nginx.conf /soft/nginx/nginx-1.24.0/local/nginx/conf/nginx.conf.bak20240703
# 再次查看备份结果
ll -a /soft/nginx/nginx-1.24.0/local/nginx/conf/ |grep nginx# 创建附加配置目录 conf.d:用于拆分多个站点配置(便于管理多应用)
sudo mkdir -p /soft/nginx/nginx-1.24.0/local/nginx/conf/conf.d
# 1. 引入附件配置文件: nginx.conf 的 default_type 行上方插入:引入 conf.d 目录下所有 .conf 配置文件
sudo sed -i '/default_type/i include conf.d/*.conf;' /soft/nginx/nginx-1.24.0/local/nginx/conf/nginx.conf
# 2. 定义工作进程的用户:在 #user 行下方插入:指定 Nginx 工作进程运行用户为 root(避免文件权限问题)
sudo sed -i '/#user/a user root;' /soft/nginx/nginx-1.24.0/local/nginx/conf/nginx.conf
# 3. 开启错误日志:替换首行 #error_log 为 error_log(记录 Nginx 运行错误,便于排查问题)
sudo sed -i '0,/#error_log/s/#error_log/error_log/' /soft/nginx/nginx-1.24.0/local/nginx/conf/nginx.conf
# 4. 开启访问日志:替换首行 #access_log 为 access_log(记录所有客户端访问记录)
sudo sed -i '0,/#access_log/s/#access_log/access_log/' /soft/nginx/nginx-1.24.0/local/nginx/conf/nginx.conf
# 5. 启用日志格式:删除 23-25 行的 # 注释(日志包含时间、客户端IP、请求路径等关键信息)
sudo sed -i '23s/#//g' /soft/nginx/nginx-1.24.0/local/nginx/conf/nginx.conf
sudo sed -i '24s/#//g' /soft/nginx/nginx-1.24.0/local/nginx/conf/nginx.conf
sudo sed -i '25s/#//g' /soft/nginx/nginx-1.24.0/local/nginx/conf/nginx.conf使用nginx -t命令来测试配置文件的语法是否正确
# 测试配置文件语法是否正确(配置修改后必执行,避免语法错误导致启动失败)
sudo /soft/nginx/nginx-1.24.0/local/nginx/sbin/nginx -t配置服务
创建或编辑systemd的服务单元文件,该文件描述了如何启动、停止和管理Nginx服务。
sudo tee /etc/systemd/system/nginx.service <<EOF
[Unit]
# 服务的简短描述
Description=nginx
# 服务启动的依赖条件:在网络服务启动之后启动
After=network.target
[Service]
# 服务的启动类型,forking:作为子进程启动
Type=forking
# 指定服务主进程的PID文件位置
PIDFile=/soft/nginx/nginx-1.24.0/local/nginx/logs/nginx.pid
# 在启动服务之前执行的命令,这里用于测试配置文件的正确性
ExecStartPre=/soft/nginx/nginx-1.24.0/local/nginx/sbin/nginx -t -c /soft/nginx/nginx-1.24.0/local/nginx/conf/nginx.conf
# 启动服务的命令
ExecStart=/soft/nginx/nginx-1.24.0/local/nginx/sbin/nginx
# 重新加载服务的命令,这里用于在不中断服务的情况下重新加载配置
ExecReload=/soft/nginx/nginx-1.24.0/local/nginx/sbin/nginx -s reload
# 停止服务的命令
ExecStop=/soft/nginx/nginx-1.24.0/local/nginx/sbin/nginx -s stop
# 服务将使用自己的临时目录,而不是系统共享的临时目录
PrivateTmp=true
[Install]
# 指定服务安装后的默认运行级别,multi-user.target是大多数服务器和桌面系统使用的级别,表示多用户模式
WantedBy=multi-user.target
EOF服务管理
# 重新加载 systemd 配置:使新创建的 nginx.service 生效
sudo systemctl daemon-reload
# 设置开机自启:系统启动时自动运行 Nginx
sudo systemctl enable nginx
# 启动 Nginx 服务
sudo systemctl start nginx
# 查看 Nginx 服务状态(是否运行正常、进程ID等)
sudo systemctl status nginx
# 停止 Nginx 服务
sudo systemctl stop nginx
# 重启 Nginx 服务(配置修改后需重启生效,会中断服务)
sudo systemctl restart nginx常用命令
# 测试配置文件语法(核心命令,修改配置后必执行)
sudo /soft/nginx/nginx-1.24.0/local/nginx/sbin/nginx -t快捷命令
- 测试Nginx配置文件
# 创建 Nginx 环境变量文件(用于存储自定义别名)
sudo vi /etc/profile.d/nginx.sh# 在文件中添加以下内容:定义 tnc 别名(快速测试配置文件)
alias tnc='sudo /soft/nginx/nginx-1.24.0/local/nginx/sbin/nginx -t -c /soft/nginx/nginx-1.24.0/local/nginx/conf/nginx.conf'# 使快捷命令生效(无需重启系统)
source /etc/profile.d/nginx.sh# 使用快捷命令(直接输入 tnc 即可测试配置)
tnc
反向代理配置
http {
#... # 保留原配置中的其他全局参数(如日志格式、连接超时等)
server {
listen 80; # 监听端口:HTTP 协议默认端口(客户端访问时可省略端口)
server_name your_domain_name_or_ip; # 替换为你的域名(如 www.example.com)或服务器IP(如 192.168.1.100)
# 匹配的请求路径(/ 表示根路径,所有未匹配其他 location 的请求都会走这里)
location / {
# 代理目标地址:后端服务的地址
# 末尾有 /,转发规则:后端接收的地址 = proxy_pass 地址 + 剩余的请求路径
# 末尾无 /,转发规则:后端接收的地址 = proxy_pass 地址 + location 匹配的请求路径 + 剩余的请求路径
proxy_pass http://localhost:8080/;
# 传递请求头:让后端服务获取客户端真实信息
proxy_set_header Host $host; # 传递客户端请求的主机名(容错性强,无 Host 头时回退到 server_name)
proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实 IP(直接与 Nginx 连接的 IP)
proxy_set_header X-Real-Port $remote_port; # 传递客户端真实访问端口(补充端口信息,便于后端统计)
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 传递代理链路 IP 列表(格式:客户端IP, 一级代理IP, 二级...)
proxy_set_header X-Forwarded-Proto $scheme; # 传递真实协议(http/https,解决代理后后端无法识别协议的问题)
proxy_set_header X-Forwarded-Path $request_uri; # 传递客户端请求的完整路径(含参数)
}
# 可添加多个 location 实现不同路径代理(示例:代理 /api 路径到另一个后端)
# location /api {
# proxy_pass http://192.168.1.101:9090; # 后端 API 服务地址
# proxy_set_header Host $host;
# proxy_set_header X-Real-IP $remote_addr;
# ...
# }
}
# 可添加多个 server 块实现多域名代理(如同时代理 www.example.com 和 blog.example.com)
# server {
# listen 80;
# server_name blog.example.com;
# location / {
# proxy_pass http://localhost:8081/; # 服务地址
# ...
# }
# }
}配置指令:proxy_set_header 详解
proxy_set_header 是 Nginx 反向代理核心配置指令,用于自定义向后端服务器传递的请求头信息,帮助后端服务器识别请求的原始来源、协议类型、端口等关键信息,避免因代理转发导致的信息丢失。以下是完整的配置说明、常用指令及使用场景:
核心作用
Nginx 作为反向代理时,后端服务器直接接收的是来自 Nginx 的请求(而非客户端原始请求)。通过 proxy_set_header 可将客户端真实信息、请求上下文等传递给后端,确保后端业务逻辑(如权限校验、日志记录、定向跳转)正常运行。
常用配置指令及说明
| 配置指令 | 语法格式 | 核心作用 | 示例场景 |
|---|---|---|---|
| Host 头传递 | proxy_set_header Host $host; 或 proxy_set_header Host $http_host; | 向后端传递客户端请求的原始主机名(域名/IP) | 后端服务需根据 Host 头区分多站点(如虚拟主机)时必须配置 |
| 真实客户端 IP | proxy_set_header X-Real-IP $remote_addr; | 传递客户端真实 IP 地址(Nginx 直接对接的客户端 IP) | 后端需记录访问日志、限制单 IP 访问频率时使用 |
| 客户端真实端口 | proxy_set_header X-Real-Port $remote_port; | 传递客户端发起请求时使用的端口号 | 后端需区分同一客户端不同端口请求场景(如多终端接入) |
| IP 转发链 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | 记录完整的 IP 转发路径(客户端 IP + 中间代理 IP) | 多层代理架构(如 CDN + Nginx + 后端),需追溯原始请求来源时 |
| 原始协议类型 | proxy_set_header X-Forwarded-Proto $scheme; | 传递客户端请求的原始协议(http/https) | 后端服务需根据协议类型跳转(如 HTTP 自动跳 HTTPS)或处理加密逻辑时 |
| 原始请求路径 | proxy_set_header X-Forwarded-Path $request_uri; | 传递客户端请求的完整路径(含参数) | 后端需校验请求路径合法性、统计接口访问频率时 |
关键指令补充说明
Host 头的两种配置区别
$host:优先取请求头中的 Host 字段,若为空则取 Nginx 配置的server_name(推荐使用,兼容性更强);$http_host:直接取请求头中的 Host 字段(包含端口号,如example.com:8080),若客户端未传递 Host 头则为空。- 建议配置:
proxy_set_header Host $host;(适配大多数场景)。
X-Forwarded-For 的拼接规则
- 格式:
客户端真实 IP, 第一层代理 IP, 第二层代理 IP,... - 示例:客户端 IP 为
192.168.1.100,经过 CDN(IP:203.0.113.5)和 Nginx(IP:10.0.0.5),则传递给后端的字段值为192.168.1.100, 203.0.113.5。 - 注意:后端需从该字段中提取第一个 IP 作为客户端真实 IP(需防范伪造 X-Forwarded-For 头的风险)。
- 格式:
$scheme 变量的含义
$scheme是 Nginx 内置变量,自动识别客户端请求的协议(http 或 https),无需手动指定。- 示例:客户端通过
https://example.com访问,X-Forwarded-Proto字段值为https,后端可据此返回 HTTPS 相关资源。
完整配置示例(结合反向代理场景)
http {
# ...
server {
listen 80;
server_name example.com 192.168.1.200; # 域名或服务器IP
location / {
proxy_pass http://localhost:8080/; # 后端服务地址
# 请求头配置
proxy_set_header Host $host; # 传递客户端请求的主机名(容错性强,无 Host 头时回退到 server_name)
proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实 IP(直接与 Nginx 连接的 IP)
proxy_set_header X-Real-Port $remote_port; # 传递客户端真实访问端口(补充端口信息,便于后端统计)
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 传递代理链路 IP 列表(格式:客户端IP, 一级代理IP, 二级...)
proxy_set_header X-Forwarded-Proto $scheme; # 传递真实协议(http/https,解决代理后后端无法识别协议的问题)
proxy_set_header X-Forwarded-Path $request_uri; # 传递客户端请求的完整路径(含参数)
# 超时配置(配合请求头传递,避免后端超时未响应)
proxy_connect_timeout 60s;
proxy_read_timeout 60s;
}
}
# ...
}注意事项
- 配置位置:
proxy_set_header需在location块或server块中配置(仅对当前块生效); - 覆盖默认值:Nginx 默认会传递部分请求头,自定义配置会覆盖默认值,需根据后端需求选择必要字段;
- 多层代理场景:若存在多级 Nginx 代理,每一级都需配置
X-Forwarded-For和X-Forwarded-Proto,确保信息链完整; - 安全校验:后端需对
X-Forwarded-For等字段进行校验(如仅信任特定代理 IP),防止恶意伪造请求头。