Nginx超详细实战详解教程
Java进阶全套教程(九)—— Nginx超详细实战详解教程
一、Nginx核心概述
1.1 什么是Nginx
Nginx是一款高性能、轻量级、开源免费的HTTP和反向代理服务器,同时兼具邮件代理服务器、通用TCP/UDP代理服务器功能。由俄罗斯工程师Igor Sysoev开发,专为高并发、低资源消耗场景设计,彻底解决了传统Apache服务器高并发卡顿、内存占用过高的痛点。
相较于传统Web服务器,Nginx核心优势突出:内存占用极低、毫秒级启动、支持数万级并发连接,依托异步非阻塞、事件驱动的核心运行模型,成为互联网企业Web服务、反向代理、负载均衡的首选中间件,广泛应用于电商、直播、门户、微服务架构等场景。
1.2 主流Web服务器对比
目前企业常用的Web服务器包含Apache、Tomcat、Nginx、IIS,四款服务器定位与适用场景差异显著:
- Apache:老牌开源服务器,基于同步阻塞模型,稳定性极强,但并发能力弱,资源开销大,适合静态网站、低并发传统项目,现已逐步被Nginx替代。
- Tomcat:Java专属应用服务器,支持JSP、Servlet运行,主打动态Java项目解析,并发性能一般,仅用于Java后端服务部署,不擅长静态资源处理。
- IIS:微软自带服务器,适配Windows系统,兼容性强,多用于Windows平台.NET项目,跨平台性差、性能较弱。
- Nginx:跨平台高性能服务器,兼顾静态资源处理、反向代理、负载均衡,支持高并发、热部署,无平台限制,是目前企业主流首选。
1.3 Nginx核心运行模型
Nginx核心采用异步非阻塞事件驱动模型,这是其高并发能力的核心原理。区别于同步阻塞模型(一个请求占用一个线程,线程阻塞等待响应),Nginx通过单个工作线程轮询处理多个客户端请求,无线程阻塞、无频繁线程创建销毁开销。
在Linux系统中,Nginx默认采用epoll高效事件池,能够监听海量文件描述符,官方基准测试可支撑5万+瞬时并发连接,生产环境稳定承载2-4万并发,且内存占用仅为Apache的1/5左右。
二、Nginx四大核心应用场景
2.1 静态资源HTTP服务器
Nginx原生优化了静态资源(HTML、CSS、JS、图片、视频)的解析与传输能力,无需依赖后端程序,可独立部署静态网站。相较于Tomcat、Apache,Nginx对静态文件的读取、缓存、压缩效率更高,响应速度提升3-10倍。
适用场景:纯静态官网、资源托管服务器、前端项目打包部署(Vue/React静态产物)。
2.2 反向代理(核心高频场景)
反向代理是Nginx最核心、使用最广泛的功能。客户端仅访问Nginx服务器,由Nginx代为转发请求至后端真实业务服务器,处理完成后再由Nginx将结果返回客户端。
核心价值:隐藏后端真实服务器IP与架构、抵御网络攻击、统一入口管理请求、实现请求统一拦截与处理,保障后端服务安全。
正向代理与反向代理核心区别:正向代理代理客户端(如VPN),反向代理代理服务端(Nginx核心场景)。
2.3 负载均衡
当后端单台服务器无法承载高并发请求时,可部署多台业务服务器集群,通过Nginx负载均衡策略,将客户端请求均匀分发至集群节点,避免单节点压力过载。
核心价值:解决单机并发瓶颈、实现服务水平扩容、通过节点故障自动剔除实现服务高可用,提升项目整体吞吐量与稳定性。
2.4 动静分离
动静分离是Web性能优化的核心方案,核心思路是拆分动态资源与静态资源请求:Nginx直接处理静态资源请求(图片、样式、脚本),动态请求(JSP、接口请求)转发至Tomcat、SpringBoot等后端服务。
核心价值:减轻后端业务服务器压力、静态资源可配置缓存与压缩、大幅提升页面加载速度,是企业Web项目性能优化的标配方案。
三、Nginx选型与技术优势
3.1 技术选型背景
传统单机Tomcat架构存在严重性能瓶颈:Tomcat默认配置仅支持150左右并发连接,即便优化硬件与JVM参数,并发上限也难以突破1000。在互联网高并发场景下,单机架构极易出现请求超时、服务宕机问题,因此必须引入Nginx作为前置网关,实现请求分流与性能优化。
3.2 Nginx核心优势(企业选型核心原因)
- 高并发高性能:基于epoll事件模型,支持数万级并发,请求处理效率远超传统服务器。
- 极低资源消耗:启动后常驻内存极小,千级并发场景下内存占用不足10M,CPU利用率极低。
- 开源免费商用:完全开源,无版权费用,对比F5、NetScaler等十万级硬件负载设备,大幅降低企业成本。
- 智能健康检查:自动检测后端集群节点状态,宕机节点自动剔除,恢复后自动重新纳入集群,不影响前端访问。
- 带宽优化:原生支持Gzip压缩、资源缓存,减少网络传输数据量,节省服务器带宽资源。
- 高稳定性:反向代理与负载均衡场景下,宕机概率极低,可常年不间断运行。
- 热部署热更新:支持不停机加载配置、升级版本,实现业务零中断维护。
四、Nginx环境准备与依赖安装
4.1 基础环境要求
本次实战基于CentOS 7.9 X64系统,适配所有CentOS7系列版本,同时兼容主流Linux发行版(Ubuntu、Debian)。安装前需完成四项环境校验,规避安装报错:
- 网络连通性:服务器可正常访问外网,用于下载依赖与Nginx源码
- YUM源可用:配置官方YUM源或阿里云镜像源,保证依赖安装正常
- 防火墙策略:关闭防火墙或放行80、443、自定义业务端口
- SELinux状态:关闭SELinux安全限制,避免权限拦截
4.2 环境校验实操命令
# 1. 校验网络连通性 ping -c 4 www.baidu.com # 2. 校验YUM可用性 yum clean all && yum makecache # 3. 关闭防火墙(临时+永久) systemctl stop firewalld systemctl disable firewalld # 4. 关闭SELinux(临时+永久) setenforce 0 sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
4.3 核心依赖安装
Nginx编译安装需依赖四大核心库,缺一不可,所有依赖可通过YUM一键安装:
- gcc/gcc-c++:C语言编译环境,用于编译Nginx源码
- pcre/pcre-devel:正则表达式库,支持Nginx rewrite规则解析
- zlib/zlib-devel:压缩库,支撑Gzip压缩功能实现
- openssl/openssl-devel:加密库,支持HTTPS、SSL证书配置
# 一键安装所有编译依赖 yum -y install gcc gcc-c++ make automake pcre pcre-devel zlib zlib-devel openssl openssl-devel
五、Nginx源码编译安装(企业生产标准)
5.1 版本选型规范
Nginx官网提供三类版本,生产与开发环境严格区分:
- Mainline Version(主线版):最新功能版,未经过充分生产测试,禁止生产使用,仅用于功能测试
- Stable Version(稳定版):经过大规模生产验证,企业生产首选,本次选用1.24.0稳定版
- Legacy Version(旧版):老旧维护版本,仅用于老旧项目兼容
5.2 源码下载与目录规划
企业规范:所有源码统一存放至/opt/apps目录,安装程序部署至/usr/local/nginx/目录,统一服务器文件规范。
# 1. 创建源码存放目录 mkdir -p /opt/apps cd /opt/apps # 2. 下载Nginx1.24.0稳定版源码 wget http://nginx.org/download/nginx-1.24.0.tar.gz # 3. 解压源码包 tar -zxvf nginx-1.24.0.tar.gz cd nginx-1.24.0
5.3 编译参数配置(完整版企业参数)
编译参数用于指定Nginx安装路径、日志路径、模块功能、运行用户等核心配置,以下为生产环境通用完整参数,包含SSL、Gzip、静态资源优化等必备模块:
# 创建临时缓存目录(必须手动创建,否则启动报错)
mkdir -p /var/temp/nginx/{client,proxy,fastcgi,uwsgi,scgi}
# 完整编译配置命令
./configure \
--prefix=/usr/local/nginx \
--sbin-path=/usr/local/nginx/sbin/nginx \
--conf-path=/usr/local/nginx/conf/nginx.conf \
--pid-path=/usr/local/nginx/logs/nginx.pid \
--error-log-path=/usr/local/nginx/logs/error.log \
--http-log-path=/usr/local/nginx/logs/access.log \
--lock-path=/usr/local/nginx/logs/nginx.lock \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_gzip_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--with-http_realip_module5.4 编译与安装
configure执行无报错后,执行编译安装命令,仅首次安装执行make install,后续新增模块仅需make编译,无需重装。
# 编译+安装(分步执行,便于排查报错) make make install # 创建Nginx运行用户与用户组 useradd -s /sbin/nologin nginx
六、Nginx目录结构详解
安装完成后,Nginx主目录为/usr/local/nginx,核心四大目录各司其职,是运维与配置的核心重点:
6.1 conf 配置目录(核心目录)
存放所有Nginx配置文件,nginx.conf为主配置文件,所有服务规则、代理、负载均衡、缓存策略均在此配置,其余为模板配置文件。
6.2 html 站点目录
默认静态资源根目录,包含两个默认页面:index.html(默认访问首页)、50x.html(服务器异常报错页面),可自定义静态页面替换。
6.3 logs 日志目录
存放运行日志与进程文件,启动Nginx后自动生成:access.log(正常访问日志)、error.log(错误日志)、nginx.pid(主进程ID文件),是排查线上问题的核心依据。
6.4 sbin 命令目录
存放Nginx可执行程序,所有启停、重载、校验命令均基于该目录下的nginx程序执行。
七、Docker快速部署Nginx(容器化方案)
Docker部署无需编译环境,一键部署、快速扩容,适合测试环境与容器化生产环境,支持目录挂载、配置持久化。
7.1 基础容器部署
# 拉取官方最新稳定镜像 docker pull nginx:stable # 启动基础Nginx容器 docker run -d \ --name nginx-base \ --rm \ -p 8080:80 \ nginx:stable
7.2 持久化挂载部署(生产可用)
通过挂载本地目录,实现配置文件、静态资源、日志持久化,删除容器不丢失数据:
# 创建本地持久化目录
mkdir -p /docker/nginx/{conf,html,logs}
# 临时启动容器,拷贝默认配置文件
docker run -d --name nginx-tmp nginx:stable
docker cp nginx-tmp:/etc/nginx/nginx.conf /docker/nginx/conf/
docker cp nginx-tmp:/etc/nginx/conf.d /docker/nginx/conf/
docker stop nginx-tmp && docker rm nginx-tmp
# 启动持久化Nginx容器
docker run -d \
--name nginx-prod \
-p 80:80 \
-p 443:443 \
-v /docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /docker/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /docker/nginx/html:/usr/share/nginx/html \
-v /docker/nginx/logs:/var/log/nginx \
--restart always \
nginx:stable八、Nginx服务启停与核心命令
8.1 核心命令参数
# 查看Nginx版本 /usr/local/nginx/sbin/nginx -v # 查看详细版本与编译参数 /usr/local/nginx/sbin/nginx -V # 校验配置文件语法(核心!修改配置后必执行) /usr/local/nginx/sbin/nginx -t # 静默校验配置(仅输出错误信息) /usr/local/nginx/sbin/nginx -q
8.2 启停与重载操作
Nginx支持热重载,无需停机即可更新配置,保障业务零中断:
# 启动Nginx /usr/local/nginx/sbin/nginx # 快速停止(强制终止所有请求,不推荐生产使用) /usr/local/nginx/sbin/nginx -s stop # 平缓停止(处理完当前请求后关闭,生产推荐) /usr/local/nginx/sbin/nginx -s quit # 热重载配置(修改配置后必用,零停机更新) /usr/local/nginx/sbin/nginx -s reload # 重启日志文件 /usr/local/nginx/sbin/nginx -s reopen
九、Nginx核心配置块详解
Nginx主配置文件nginx.conf分为四大核心块,优先级与作用域逐层递减,是所有功能配置的基础:全局块、events块、http块、server块、location块。
9.1 全局块(顶级作用域)
作用于整个Nginx服务,配置全局运行参数,核心指令如下:
# 定义运行Nginx的用户与组 user nginx nginx; # 工作进程数,建议与CPU核心数一致(auto自动适配) worker_processes auto; # 错误日志路径与日志级别(debug/info/warn/error/crit) error_log /usr/local/nginx/logs/error.log error; # 主进程PID文件路径 pid /usr/local/nginx/logs/nginx.pid; # 最大文件打开数 worker_rlimit_nofile 65535;
9.2 events块(事件驱动配置)
配置Nginx工作模式与连接上限,直接决定并发能力:
events {
# 启用Linux高效epoll事件模型
use epoll;
# 单个工作进程最大连接数
worker_connections 10240;
# 开启多进程accept锁
accept_mutex on;
# 批量接收新连接
multi_accept on;
}并发计算公式:最大并发数 = worker_processes * worker_connections,反向代理场景需除以4(经验值)。
9.3 HTTP块(全局Web配置)
配置HTTP协议通用参数、日志格式、压缩、超时、MIME类型等全局Web规则:
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" "$http_x_forwarded_for"';
access_log /usr/local/nginx/logs/access.log main;
# 开启零拷贝传输
sendfile on;
tcp_nopush on;
tcp_nodelay on;
# 连接超时时间
keepalive_timeout 120s 100s;
# 请求缓冲区配置
client_header_buffer_size 16k;
large_client_header_buffers 4 64k;
# 开启Gzip全局压缩
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 6;
gzip_types text/plain text/css text/js application/json application/javascript;
gzip_disable "MSIE [1-6]\.";
}9.4 Server虚拟主机块
一个server块对应一个虚拟站点,支持多站点共存,核心配置监听端口、域名、站点根目录:
server {
listen 80;
server_name www.demo.com demo.com;
root /usr/local/nginx/html/demo;
index index.html index.htm index.php;
access_log /usr/local/nginx/logs/demo-access.log main;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}9.5 Location路由匹配块
Nginx核心路由规则,用于匹配客户端请求URL,支持多种匹配模式,优先级从高到低:
精准匹配(=) > 前缀锁定(^~) > 大小写正则(~) > 忽略大小写正则(~*) > 通用匹配(/)
# 精准匹配根路径
location = / {
index index.html;
}
# 锁定静态资源前缀,停止后续匹配
location ^~ /static/ {
root /usr/local/nginx/html;
expires 30d;
}
# 正则匹配图片资源(区分大小写)
location ~ \.(jpg|png|gif|ico)$ {
expires 7d;
add_header Cache-Control "public";
}
# 通用匹配所有请求
location / {
proxy_pass http://127.0.0.1:8080;
}十、三大虚拟主机实战配置
10.1 基于IP的虚拟主机
单网卡绑定多IP,不同IP访问不同站点,适合内网业务隔离场景:
# 1. 网卡配置多IP(CentOS7)
vim /etc/sysconfig/network-scripts/ifcfg-ens33
BOOTPROTO="static"
IPADDR=192.168.66.100
IPADDR1=192.168.66.101
NETMASK=255.255.255.0
GATEWAY=192.168.66.2
# 重启网络
systemctl restart network
# 2. Nginx虚拟主机配置
server {
listen 80;
server_name 192.168.66.100;
root /usr/local/nginx/html/ip100;
index index.html;
}
server {
listen 80;
server_name 192.168.66.101;
root /usr/local/nginx/html/ip101;
index index.html;
}10.2 基于域名的虚拟主机(生产主流)
同一IP、同一端口,通过不同域名区分站点,适用于多官网、多业务部署:
# hosts域名映射(本地测试)
192.168.66.100 www.frontend.com
192.168.66.100 www.backend.com
# 前端站点配置
server {
listen 80;
server_name www.frontend.com;
root /usr/local/nginx/html/frontend;
index index.html;
}
# 后端站点配置
server {
listen 80;
server_name www.backend.com;
root /usr/local/nginx/html/backend;
index index.html;
}10.3 基于端口的虚拟主机
同一IP、不同端口部署不同服务,适合内部测试系统、后台管理系统:
server {
listen 8088;
server_name 192.168.66.100;
root /usr/local/nginx/html/test8088;
index index.html;
}
server {
listen 9099;
server_name 192.168.66.100;
root /usr/local/nginx/html/test9099;
index index.html;
}十一、Nginx核心模块实战
11.1 Rewrite地址重写模块
通过正则匹配实现URL重定向、域名跳转、地址标准化,支持301永久重定向、302临时重定向:
# 1. 旧域名永久跳转新域名
server {
listen 80;
server_name old.com www.old.com;
rewrite ^/(.*)$ https://www.new.com/$1 permanent;
}
# 2. 伪静态配置(动态URL转静态URL)
location / {
rewrite ^/article-(\d+)\.html$ /article.php?id=$1 last;
}
# 3. 目录跳转
location /admin {
rewrite ^/admin$ /admin/index.html redirect;
}11.2 If条件判断模块
支持基于IP、请求方式、浏览器标识、参数的条件拦截与定制化配置:
# 禁止POST请求访问静态资源
location ~ \.(html|js|css)$ {
if ($request_method = POST) {
return 405;
}
}
# 拦截指定IP访问
if ($remote_addr = "192.168.66.200") {
return 403;
}
# 拦截爬虫访问
if ($http_user_agent ~* (spider|crawler)) {
return 403;
}11.3 浏览器缓存优化
通过expires与Cache-Control配置静态资源缓存,减少重复请求,提升访问速度:
server {
listen 80;
server_name www.demo.com;
# 图片、视频缓存30天
location ~ \.(jpg|png|gif|mp4|ico)$ {
expires 30d;
add_header Cache-Control "max-age=2592000, public";
}
# JS、CSS缓存7天
location ~ \.(js|css)$ {
expires 7d;
add_header Cache-Control "max-age=604800, public";
}
# HTML禁止缓存,保证实时更新
location ~ \.(html|htm)$ {
add_header Cache-Control "no-cache, no-store, must-revalidate";
add_header Pragma "no-cache";
expires -1;
}
}11.4 防盗链配置
基于Referer请求头拦截非法盗链,保护服务器资源,防止流量被盗用:
location ~ \.(jpg|png|gif|js|css)$ {
# 允许空Referer、本机、合法域名访问
valid_referers none blocked www.demo.com demo.com 192.168.66.100;
# 非法请求返回403
if ($invalid_referer) {
return 403;
}
}11.5 跨域问题解决
前端跨域请求报错核心解决方案,配置全局跨域响应头:
location / {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
add_header Access-Control-Allow-Headers DNT,X-Requested-With,Content-Type,Authorization;
# 处理预检请求
if ($request_method = OPTIONS) {
return 204;
}
proxy_pass http://127.0.0.1:8080;
}十二、Nginx高阶企业实战场景
12.1 动静分离实战
分离静态、动态请求,Nginx处理静态资源,Tomcat处理动态接口,极致优化性能:
upstream tomcat_cluster {
server 192.168.66.102:8080 weight=5;
server 192.168.66.103:8080 weight=5;
}
server {
listen 80;
server_name www.demo.com;
# 静态资源直接由Nginx处理
location ~ \.(html|js|css|jpg|png|gif|ico)$ {
root /usr/local/nginx/static;
expires 10d;
}
# 动态请求转发至Tomcat集群
location ~ \.(jsp|do|action)$ {
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_pass http://tomcat_cluster;
}
# 通用接口请求转发
location /api/ {
proxy_pass http://tomcat_cluster;
}
}12.2 负载均衡完整配置
支持权重、IP哈希、故障转移,实现后端服务高可用:
http {
# 定义后端服务集群
upstream backend_cluster {
# 权重配置,weight越大分发请求越多
server 192.168.66.102:8080 weight=3 max_fails=3 fail_timeout=10s;
server 192.168.66.103:8080 weight=2 max_fails=3 fail_timeout=10s;
# 备用节点,主节点全部故障时启用
server 192.168.66.104:8080 backup;
}
server {
listen 80;
server_name www.demo.com;
location / {
# 转发请求至集群
proxy_pass http://backend_cluster;
# 保留真实客户端信息
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_connect_timeout 5s;
proxy_send_timeout 10s;
proxy_read_timeout 10s;
# 故障转移
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
}
}
}12.3 限流防护实战
基于漏桶算法实现请求速率限流、并发连接限流,防护突发流量与CC攻击:
http {
# 速率限流:单IP每秒1次请求,缓冲区5个
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=1r/s;
# 并发限流:单IP最大10个并发连接
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
server {
listen 80;
server_name www.demo.com;
location / {
# 启用速率限流
limit_req zone=req_limit burst=5 nodelay;
# 启用并发限流
limit_conn conn_limit 10;
proxy_pass http://backend_cluster;
}
}
}12.4 缓存加速实战
配置Nginx代理缓存,缓存后端接口响应数据,大幅提升重复请求响应速度:
http {
# 缓存路径、层级、内存空间、过期时间
proxy_cache_path /var/nginx/cache levels=1:2 keys_zone=api_cache:100m inactive=7d max_size=5G;
server {
listen 80;
server_name www.demo.com;
location /api/data/ {
# 启用缓存
proxy_cache api_cache;
# 200/304状态码缓存10分钟
proxy_cache_valid 200 304 10m;
# 自定义缓存key
proxy_cache_key "$host$request_uri$args";
# 缓存状态响应头
add_header Nginx-Cache "$upstream_cache_status";
proxy_pass http://backend_cluster;
}
# 手动清理缓存接口(仅本机访问)
location /purge/cache {
allow 127.0.0.1;
deny all;
proxy_cache_purge api_cache $host$request_uri$args;
}
}
}十三、Nginx高可用架构(Nginx+Keepalived)
13.1 架构原理
单台Nginx存在单点故障风险,通过Keepalived实现双机热备:主节点正常工作,备节点待命,主节点故障时,虚拟VIP自动漂移至备节点,实现服务无感知切换。
13.2 环境规划
- 主Nginx:192.168.66.100(MASTER)
- 备Nginx:192.168.66.101(BACKUP)
- 虚拟VIP:192.168.66.99
13.3 Keepalived核心配置
主节点配置 /etc/keepalived/keepalived.conf:
! Configuration File for keepalived
global_defs {
router_id nginx_master
}
# Nginx状态检测脚本
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 120
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 123456
}
track_script {
chk_nginx
}
virtual_ipaddress {
192.168.66.99/24
}
}备节点配置仅修改 state BACKUP、priority 80,其余参数与主节点一致。
13.4 健康检测脚本
创建 /etc/keepalived/nginx_check.sh,实现Nginx宕机自动切换:
#!/bin/bash
# 统计Nginx进程数
NGINX_NUM=$(ps -C nginx --no-header | wc -l)
# 无进程则重启Nginx
if [ $NGINX_NUM -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
# 重启失败则关闭keepalived,触发VIP漂移
if [ $(ps -C nginx --no-header | wc -l) -eq 0 ];then
systemctl stop keepalived
fi
fi脚本授权:chmod 755 /etc/keepalived/nginx_check.sh
十四、Nginx HTTPS证书企业级配置实战
14.1 HTTPS核心原理与前置准备
HTTPS基于SSL/TLS协议对HTTP数据加密传输,端口默认443,可解决明文传输、数据篡改、中间人劫持问题,是网站合规、浏览器安全访问的必备配置。Nginx实现HTTPS依赖编译时的openssl模块,前文编译流程已默认集成,无需重新编译。
证书类型分为两类:免费域名证书(Let’s Encrypt、阿里云免费证书,适合中小企业官网)、付费OV/EV证书(适合金融、电商等高危场景),证书文件核心包含.pem/.crt公钥文件、.key私钥文件。
前置准备:域名已完成备案、服务器防火墙放行443端口、证书文件上传至服务器固定目录。
14.2 证书目录规范与文件部署
企业统一规范:在Nginx配置目录下创建ssl专属目录,统一存放所有域名证书,便于管理和续期:
# 创建证书统一存放目录 mkdir -p /usr/local/nginx/conf/ssl # 上传证书文件(示例:域名demo.com) # 上传后目录包含:demo.com.pem(公钥)、demo.com.key(私钥) # 授权证书目录权限,防止权限过高报错 chmod 600 /usr/local/nginx/conf/ssl/* chown nginx:nginx /usr/local/nginx/conf/ssl/*
14.3 完整HTTPS站点配置(生产最优)
配置包含SSL加密参数优化、兼容主流浏览器、开启会话复用、强制HTTPS跳转,适配生产环境所有场景:
# 80端口强制跳转HTTPS
server {
listen 80;
server_name www.demo.com demo.com;
# 301永久重定向,SEO友好
return 301 https://$host$request_uri;
}
# 443 HTTPS核心配置
server {
listen 443 ssl;
server_name www.demo.com demo.com;
root /usr/local/nginx/html/demo;
index index.html index.htm;
# 配置证书公钥、私钥路径
ssl_certificate /usr/local/nginx/conf/ssl/demo.com.pem;
ssl_certificate_key /usr/local/nginx/conf/ssl/demo.com.key;
# SSL性能与安全优化参数(生产必配)
ssl_protocols TLSv1.2 TLSv1.3; # 禁用老旧不安全协议
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on; # 优先使用服务器加密套件
ssl_session_cache shared:SSL:10m; # 开启SSL会话缓存
ssl_session_timeout 10m; # 会话缓存过期时间
ssl_buffer_size 4k; # 优化传输缓冲区大小
# 浏览器HTTPS安全强化
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Frame-Options DENY; # 防止页面被嵌套劫持
add_header X-Content-Type-Options nosniff;
# 日志配置
access_log /usr/local/nginx/logs/https-demo-access.log main;
error_log /usr/local/nginx/logs/https-demo-error.log error;
# 静态资源缓存、反向代理等业务配置沿用原有规则
location ~ \.(jpg|png|gif|js|css)$ {
expires 10d;
}
}14.4 多域名HTTPS共存配置
单服务器多域名独立HTTPS证书部署,互不冲突,适配多站点业务场景:
# 站点1:www.frontend.com
server {
listen 80;
server_name www.frontend.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name www.frontend.com;
ssl_certificate /usr/local/nginx/conf/ssl/frontend.com.pem;
ssl_certificate_key /usr/local/nginx/conf/ssl/frontend.com.key;
# 通用SSL优化参数省略,同上
}
# 站点2:www.backend.com
server {
listen 80;
server_name www.backend.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name www.backend.com;
ssl_certificate /usr/local/nginx/conf/ssl/backend.com.pem;
ssl_certificate_key /usr/local/nginx/conf/ssl/backend.com.key;
# 通用SSL优化参数省略,同上
}14.5 证书自动续期方案(免费证书必备)
Let’s Encrypt等免费证书有效期仅90天,需配置定时任务自动续期,避免证书过期导致网站无法访问:
# 1. 安装续期工具 yum install -y certbot # 2. 手动续期测试 certbot renew --dry-run # 3. 配置定时任务,每日凌晨2点自动检测续期 crontab -e # 写入以下内容 0 2 * * * /usr/bin/certbot renew && /usr/local/nginx/sbin/nginx -s reload
十五、Nginx线上高频报错排查方案
本节汇总生产环境最常见的Nginx报错,包含报错现象、根因分析、完整解决办法,覆盖启动报错、访问异常、HTTPS报错、代理转发报错四大类场景。
15.1 启动/重载报错
报错1:nginx: [emerg] mkdir() “/var/temp/nginx/client” failed (2: No such file or directory)
报错原因:编译配置中指定的临时缓存目录不存在,首次安装后未手动创建目录。
解决方案:执行命令批量创建所需临时目录,重新重载配置:
mkdir -p /var/temp/nginx/{client,proxy,fastcgi,uwsgi,scgi}
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload报错2:nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
报错原因:80端口被Nginx残留进程、Apache、httpd等服务占用,端口冲突。
解决方案:排查端口占用、终止残留进程:
# 查看80端口占用进程 netstat -tulpn | grep 80 # 强制终止占用进程 kill -9 进程ID # 关闭冲突服务 systemctl stop httpd && systemctl disable httpd # 重启Nginx /usr/local/nginx/sbin/nginx
报错3:nginx: [emerg] user “nginx” does not exist
报错原因:配置文件中指定的nginx运行用户未创建。
解决方案:创建无登录权限的系统用户:
useradd -s /sbin/nologin nginx /usr/local/nginx/sbin/nginx -s reload
15.2 HTTPS专属报错
报错1:nginx: [emerg] SSL_CTX_use_certificate_file(…) failed (SSL: error:02001002:system library:fopen:No such file or directory)
报错原因:证书文件路径错误、文件缺失、文件名大小写不匹配、证书目录权限不足。
解决方案:核对配置文件证书路径、检查文件完整性、修正权限:
# 核对证书文件是否存在 ls /usr/local/nginx/conf/ssl/ # 修正目录与文件权限 chmod 600 /usr/local/nginx/conf/ssl/* chown nginx:nginx /usr/local/nginx/conf/ssl/* # 重载配置 nginx -s reload
报错2:浏览器提示“您的连接不是私密连接”/证书已过期
报错原因:证书过期、域名不匹配、服务器系统时间错误、证书链不完整。
解决方案:1. 核对证书有效期,过期则重新上传新证书并重载;2. 确保配置域名与证书绑定域名一致;3. 同步服务器时间;4. 补充完整证书链文件。
# 同步系统时间 ntpdate time.aliyun.com
报错3:nginx: [emerg] unknown directive “ssl” in nginx.conf
报错原因:Nginx编译时未添加--with-http_ssl_module模块,不支持HTTPS功能。
解决方案:重新编译Nginx,新增SSL模块,保留原有配置:
复用前文5.3节完整编译参数,执行make编译,无需make install,编译完成后替换二进制文件即可。
15.3 访问状态异常报错
报错1:403 Forbidden 访问禁止
常见原因:1. 站点目录权限不足,nginx用户无读取权限;2. 目录无默认首页文件;3. SELinux未关闭;4. 防盗链规则拦截。
解决方案:逐层排查修复:
# 1. 关闭SELinux(永久生效) sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config && setenforce 0 # 2. 修正站点目录权限 chmod -R 755 /usr/local/nginx/html chown -R nginx:nginx /usr/local/nginx/html # 3. 检查是否存在index.html默认文件 #
到此这篇关于Nginx超详细实战详解教程的文章就介绍到这了,更多相关Nginx实战详解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
记一次nginx配置不当引发的499与failover 机制失效问题
近期在非高峰期也存在499超过告警阈值的偶发情况,多的时候一天几次,少的时候则几天一次,持续一般也就数分钟,经过和小伙伴的共同探究,最后发现之前对于499是客户端主动断开因而和服务端关系不大的想当然认知是错误的,这里记录一下2023-05-05
Nginx出现504 Gateway Time-out的解决方法
nginx访问出现504 Gateway Time-out,一般是由于程序执行时间过长导致响应超时,本文就来介绍一下解决方法,感兴趣的可以了解一下2023-10-10


最新评论