一、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. 常用管理命令
bash
nginx # 启动
nginx -s stop # 强制快速停止
nginx -s quit # 优雅停止,处理完现有连接再退出
nginx -s reload # 热重载配置(最常用)
nginx -t # 校验配置语法(修改配置必执行)
systemctl start/stop/restart nginx
systemctl enable nginx --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. 各块作用详解
- 全局块(所有进程全局生效)
bash
user nginx; # Nginx运行用户
worker_processes auto; # 工作进程数
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
- events 块(网络并发配置)
bash
events {
worker_connections 1024; # 单进程最大并发连接
use epoll; # Linux IO模型
}
- http 块(所有网站共用配置,可包含多个 server)
- 加载 mime 类型、日志格式、sendfile 静态优化、长连接超时
include /etc/nginx/conf.d/*.conf;模块化加载虚拟主机(实训重点)
- server 块:单站点虚拟主机,绑定端口+域名
- location 块:同一站点内不同URL路径匹配规则
四、虚拟主机(一台服务器多个网站)
三种实现方式
- 基于域名(实训主流)
bash
server {
listen 80;
server_name web1.laogao.cloud;
root /usr/share/nginx/web1;
}
server {
listen 80;
server_name web2.laogao.cloud;
root /usr/share/nginx/web2;
}
- 基于端口
bash
server { listen 8081; server_name www.laogao.cloud; root /usr/share/nginx/8081; }
server { listen 8082; server_name www.laogao.cloud; root /usr/share/nginx/8082; }
- 基于IP(极少使用)
环境清理规范(老师要求)
bash
# 统一迁移旧虚拟主机配置
mkdir -p /etc/nginx/conf.d/vhosts
mv /etc/nginx/conf.d/*.conf /etc/nginx/conf.d/vhosts
# 删除网站测试目录
rm -rf /usr/share/nginx/8081 web1 web2
五、HTTPS 证书配置(SSL/TLS)
1. 自建证书三步流程(openssl)
bash
# 1.生成私钥 www.key(保密)
openssl genrsa -out www.key 2048
# 2.生成证书请求文件 www.csr(中间文件)
# -subj 后必须带空格,CN=访问域名,必须和server_name完全一致
openssl req -new -key www.key -out www.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 -days 3650 -in www.csr -signkey www.key -out www.crt
2. 证书统一存放
bash
mkdir /etc/ssl/certs/www.deng.cloud
mv www.key www.csr www.crt /etc/ssl/certs/www.deng.cloud/
3. HTTPS 虚拟主机完整配置
bash
# 443 HTTPS站点
server {
listen 443 ssl 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跳转HTTPS
server {
listen 80;
listen [::]:80;
server_name www.deng.cloud;
return 301 https://$host$request_uri;
}
4. 防火墙放行HTTPS
bash
firewall-cmd --add-service=https --permanent
firewall-cmd --reload
六、客户端域名解析报错解决(curl:6 Could not resolve host)
故障原因
Linux 客户端无 DNS 记录,无法解析自定义域名 www.deng.cloud
修复方案(客户端执行)
bash
vim /etc/hosts
# 写入服务端IP+域名
10.1.8.10 www.deng.cloud
验证:ping www.deng.cloud 能通再 curl 测试
七、Basic 网页账号密码认证
1. 安装工具生成密码文件
bash
yum install -y httpd-tools
# -c 创建文件,用户名laogao 密码123456
htpasswd -b -c /etc/nginx/.htpasswd laogao 123456
2. Nginx 配置(放入HTTPS server块)
bash
location /auth-basic/ {
auth_basic "Basic Auth";
auth_basic_user_file "/etc/nginx/.htpasswd";
}
3. 测试访问
bash
# -u 指定账号密码,-k 忽略自建证书不安全警告
curl -ku laogao:123456 https://www.deng.cloud/auth-basic/
八、PHP 动态网页解析(nginx+php-fpm)
1. 安装启动PHP服务
bash
yum install -y php php-fpm php-gd php-mbstring
systemctl enable php-fpm --now
# 默认监听 127.0.0.1:9000
2. 生成PHP测试页
bash
echo "<?php phpinfo(); ?>" > /usr/share/nginx/html/info.php
3. Nginx 解析PHP配置(易错点:变量拼写)
bash
location ~ \.php$ {
try_files $uri =404; # 防路径穿透攻击
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
# 易错:fastcgi_script_name 不要写成 scripy_name
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
4. 客户端测试
bash
curl -k https://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. 基础反向代理配置
bash
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 负载均衡集群
bash
# 定义后端服务器组
upstream backends {
# 1.默认轮询(平均分发)
server nginx1.laogao.cloud:80;
server nginx2.laogao.cloud:80 weight=2; # 权重,流量翻倍
server nginx3.laogao.cloud:80 backup; # 备用机,其他全挂才启用
# server nginx4 down; 标记下线
# 2.ip_hash 会话保持,同一IP固定后端
# ip_hash;
# 3.least_conn 最少连接优先
# least_conn;
}
server {
listen 80;
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 压缩:减小网页传输体积
bash
gzip on;
gzip_types text/css text/html application/json application/javascript;
- IP访问控制
bash
location /admin {
allow 10.1.8.0/24;
deny all;
}
- 日志文件
access.log:所有用户访问记录(IP、时间、状态码、UA)error.log:服务报错、502/403等故障日志,排错核心文件