一、Nginx 基础介绍
1. 核心定位
高性能事件驱动 Web 服务,可做:静态资源服务器、反向代理、负载均衡、HTTPS 加密、限流、防盗链、gzip 压缩、虚拟主机、PHP 动态解析。
2. 核心优势
- 异步非阻塞 IO(epoll):单进程支撑万级并发,Apache 一连接一进程资源消耗极高
- 轻量低占用:CPU/内存消耗小,部署简单
- 多角色复用:一台服务同时实现静态、代理、SSL、负载均衡
- 热重载:
nginx -s reload不中断业务更新配置
3. Master-Worker 多进程架构
- master(root):只管理,不处理请求
- 解析配置、管理 worker 进程、接收启停/重载信号
- worker(业务进程):实际处理 HTTP 请求
- 单线程异步 IO,推荐
worker_processes auto;匹配 CPU 核心数
- 单线程异步 IO,推荐
- 可选缓存进程:
cache manager(清理过期缓存)、cache loader(启动加载缓存)
4. 常用管理命令
nginx# 启动nginx-sstop# 强制快速停止nginx-squit# 优雅停止,处理完现有连接再退出nginx-sreload# 热重载配置(最常用)nginx-t# 校验配置语法(修改配置必执行)systemctl start/stop/restart nginx systemctlenablenginx--now# 开机自启+立即启动二、实验环境节点规划
标准实训双节点
| 主机名 | IP | 作用 |
|---|---|---|
| nginx-server | 10.1.8.10 | Nginx服务端,部署网站、证书、PHP |
| nginx-client | 10.1.8.11 | 客户端,curl 测试、域名解析 |
多节点负载均衡架构
| 主机 | IP | 角色 |
|---|---|---|
| proxy.laogao.cloud | 10.1.8.20 | 反向代理/负载均衡服务端 |
| nginx1/2/3 | 10.1.8.21/22/23 | 后端真实Web节点 |
| client | 10.1.8.11 | 测试客户端 |
三、Nginx 配置层级结构(从外到内)
配置文件主路径:/etc/nginx/nginx.conf
1. 层级优先级(外层→内层,子覆盖父)
全局块 → events 块 → http 块 → server 虚拟主机块 → location 路径匹配块
2. 各块作用详解
- 全局块(所有进程全局生效)
user nginx;# Nginx运行用户worker_processes auto;# 工作进程数error_log /var/log/nginx/error.log;pid /run/nginx.pid;include /usr/share/nginx/modules/*.conf;- events 块(网络并发配置)
events{worker_connections1024;# 单进程最大并发连接use epoll;# Linux IO模型}- http 块(所有网站共用配置,可包含多个 server)
- 加载 mime 类型、日志格式、sendfile 静态优化、长连接超时
include /etc/nginx/conf.d/*.conf;模块化加载虚拟主机(实训重点)
- server 块:单站点虚拟主机,绑定端口+域名
- location 块:同一站点内不同URL路径匹配规则
四、虚拟主机(一台服务器多个网站)
三种实现方式
- 基于域名(实训主流)
server{listen80;server_name web1.laogao.cloud;root /usr/share/nginx/web1;}server{listen80;server_name web2.laogao.cloud;root /usr/share/nginx/web2;}- 基于端口
server{listen8081;server_name www.laogao.cloud;root /usr/share/nginx/8081;}server{listen8082;server_name www.laogao.cloud;root /usr/share/nginx/8082;}- 基于IP(极少使用)
环境清理规范(老师要求)
# 统一迁移旧虚拟主机配置mkdir-p/etc/nginx/conf.d/vhostsmv/etc/nginx/conf.d/*.conf /etc/nginx/conf.d/vhosts# 删除网站测试目录rm-rf/usr/share/nginx/8081 web1 web2五、HTTPS 证书配置(SSL/TLS)
1. 自建证书三步流程(openssl)
# 1.生成私钥 www.key(保密)openssl genrsa-outwww.key2048# 2.生成证书请求文件 www.csr(中间文件)# -subj 后必须带空格,CN=访问域名,必须和server_name完全一致openssl req-new-keywww.key-outwww.csr-subj"/C=CN/ST=JS/L=NJ/O=LG/OU=DEVOPS/CN=www.deng.cloud/emailAddress=webadmin@deng.cloud"# 3.私钥自签名生成证书 www.crt(公钥)openssl x509-req-days3650-inwww.csr-signkeywww.key-outwww.crt2. 证书统一存放
mkdir/etc/ssl/certs/www.deng.cloudmvwww.key www.csr www.crt /etc/ssl/certs/www.deng.cloud/3. HTTPS 虚拟主机完整配置
# 443 HTTPS站点server{listen443ssl http2;listen[::]:443 ssl http2;server_name www.deng.cloud;root /usr/share/nginx/html;# 证书路径ssl_certificate"/etc/ssl/certs/www.deng.cloud/www.crt";ssl_certificate_key"/etc/ssl/certs/www.deng.cloud/www.key";}# 80端口强制301跳转HTTPSserver{listen80;listen[::]:80;server_name www.deng.cloud;return301https://$host$request_uri;}4. 防火墙放行HTTPS
firewall-cmd --add-service=https--permanentfirewall-cmd--reload六、客户端域名解析报错解决(curl:6 Could not resolve host)
故障原因
Linux 客户端无 DNS 记录,无法解析自定义域名www.deng.cloud
修复方案(客户端执行)
vim/etc/hosts# 写入服务端IP+域名10.1.8.10 www.deng.cloud验证:ping www.deng.cloud能通再 curl 测试
七、Basic 网页账号密码认证
1. 安装工具生成密码文件
yuminstall-yhttpd-tools# -c 创建文件,用户名laogao 密码123456htpasswd-b-c/etc/nginx/.htpasswd laogao1234562. Nginx 配置(放入HTTPS server块)
location /auth-basic/{auth_basic"Basic Auth";auth_basic_user_file"/etc/nginx/.htpasswd";}3. 测试访问
# -u 指定账号密码,-k 忽略自建证书不安全警告curl-kulaogao:123456 https://www.deng.cloud/auth-basic/八、PHP 动态网页解析(nginx+php-fpm)
1. 安装启动PHP服务
yuminstall-yphp php-fpm php-gd php-mbstring systemctlenablephp-fpm--now# 默认监听 127.0.0.1:90002. 生成PHP测试页
echo"<?php phpinfo(); ?>">/usr/share/nginx/html/info.php3. Nginx 解析PHP配置(易错点:变量拼写)
location ~\.php${try_files$uri=404;# 防路径穿透攻击fastcgi_pass127.0.0.1:9000;fastcgi_index index.php;# 易错:fastcgi_script_name 不要写成 scripy_namefastcgi_param SCRIPT_FILENAME$document_root$fastcgi_script_name;include fastcgi_params;}4. 客户端测试
curl-khttps://www.deng.cloud/info.php九、location 匹配规则(优先级从高到低)
location = /uri精确匹配(最高)location ^~ /uri前缀匹配,跳过正则location ~ 正则区分大小写正则location ~* 正则不区分大小写正则location /uri普通前缀匹配location /全局兜底(最低)
proxy_pass 路径关键细节
- 末尾带
/:剔除location匹配前缀转发/api/+proxy_pass http://xxx/→ 请求/api/user转发为/user
- 末尾不带
/:完整保留路径转发/api/+proxy_pass http://xxx→ 请求/api/user转发为/api/user
十、反向代理 & 负载均衡 upstream
1. 正向代理 vs 反向代理
- 正向代理:代理客户端(翻墙),服务器不知道真实用户
- 反向代理:代理后端服务(实训Nginx),用户不知道真实后端服务器
2. 基础反向代理配置
location /{proxy_pass http://backends;# 必传客户端真实信息proxy_set_header Host$http_host;proxy_set_header X-Real-IP$remote_addr;proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;}3. upstream 负载均衡集群
# 定义后端服务器组upstream backends{# 1.默认轮询(平均分发)server nginx1.laogao.cloud:80;server nginx2.laogao.cloud:80weight=2;# 权重,流量翻倍server nginx3.laogao.cloud:80 backup;# 备用机,其他全挂才启用# server nginx4 down; 标记下线# 2.ip_hash 会话保持,同一IP固定后端# ip_hash;# 3.least_conn 最少连接优先# least_conn;}server{listen80;server_name www.laogao.cloud;location /{proxy_pass http://backends;}}负载均衡算法对比
| 算法 | 作用 | 使用场景 |
|---|---|---|
| 轮询(默认) | 请求依次分配 | 后端性能一致,无会话需求 |
| weight权重 | 性能好的服务器多分流量 | 新旧服务器混合集群 |
| ip_hash | 同一客户端IP固定后端 | 需要保存session会话 |
| least_conn | 分给当前连接最少的后端 | 后端业务耗时差异大 |
十一、Nginx 常见报错与排错
- nginx -t 语法报错
- 拼写错误(
fastcgi_scripy_name)、引号缺失、分号漏写、配置嵌套错误 - 解决:开启vim行号
:set nu,定位报错行修改
- 拼写错误(
- curl:6 Could not resolve host
- 客户端hosts无域名解析,修改
/etc/hosts添加IP域名映射
- 客户端hosts无域名解析,修改
- nginx: [emerg] cannot load certificate
- 证书路径写错、证书文件未移动到
/etc/ssl/certs/、权限不足
- 证书路径写错、证书文件未移动到
- 403 Forbidden 无权限访问
- 网站目录权限不足、SELinux拦截、缺少index首页文件
- 临时关闭selinux:
setenforce 0(仅服务端执行)
- 502 Bad Gateway
- php-fpm未启动、fastcgi_pass端口写错、后端服务宕机
十二、Nginx 核心内置常用变量
| 变量 | 含义 |
|---|---|
| $uri | 请求URL(不含get参数) |
| $args | URL问号后的查询参数 |
| $remote_addr | 客户端真实IP |
| $host | 访问域名 |
| $scheme | 请求协议 http/https |
| $request_uri | 完整URL(含参数) |
十三、Nginx 其他实用功能
- gzip 压缩:减小网页传输体积
gzipon;gzip_types text/css text/html application/json application/javascript;- IP访问控制
location /admin{allow10.1.8.0/24;deny all;}- 日志文件
access.log:所有用户访问记录(IP、时间、状态码、UA)error.log:服务报错、502/403等故障日志,排错核心文件