403 禁地:Nginx 拒绝所有生者进入

一、Nginx 基础介绍

1. 核心定位

高性能事件驱动 Web 服务,可做:静态资源服务器、反向代理、负载均衡、HTTPS 加密、限流、防盗链、gzip 压缩、虚拟主机、PHP 动态解析。

2. 核心优势

  1. 异步非阻塞 IO(epoll):单进程支撑万级并发,Apache 一连接一进程资源消耗极高
  2. 轻量低占用:CPU/内存消耗小,部署简单
  3. 多角色复用:一台服务同时实现静态、代理、SSL、负载均衡
  4. 热重载nginx -s reload 不中断业务更新配置

3. Master-Worker 多进程架构

  1. master(root) :只管理,不处理请求
    • 解析配置、管理 worker 进程、接收启停/重载信号
  2. worker(业务进程) :实际处理 HTTP 请求
    • 单线程异步 IO,推荐 worker_processes auto; 匹配 CPU 核心数
  3. 可选缓存进程: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. 各块作用详解

  1. 全局块(所有进程全局生效)
bash 复制代码
user nginx;                # Nginx运行用户
worker_processes auto;     # 工作进程数
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
  1. events 块(网络并发配置)
bash 复制代码
events {
    worker_connections 1024;  # 单进程最大并发连接
    use epoll;                 # Linux IO模型
}
  1. http 块(所有网站共用配置,可包含多个 server)
  • 加载 mime 类型、日志格式、sendfile 静态优化、长连接超时
  • include /etc/nginx/conf.d/*.conf; 模块化加载虚拟主机(实训重点)
  1. server 块:单站点虚拟主机,绑定端口+域名
  2. location 块:同一站点内不同URL路径匹配规则

四、虚拟主机(一台服务器多个网站)

三种实现方式

  1. 基于域名(实训主流)
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;
}
  1. 基于端口
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; }
  1. 基于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 匹配规则(优先级从高到低)

  1. location = /uri 精确匹配(最高)
  2. location ^~ /uri 前缀匹配,跳过正则
  3. location ~ 正则 区分大小写正则
  4. location ~* 正则 不区分大小写正则
  5. location /uri 普通前缀匹配
  6. location / 全局兜底(最低)

proxy_pass 路径关键细节

  1. 末尾带 /:剔除location匹配前缀转发
    • /api/ + proxy_pass http://xxx/ → 请求 /api/user 转发为 /user
  2. 末尾不带 /:完整保留路径转发
    • /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 常见报错与排错

  1. nginx -t 语法报错
    • 拼写错误(fastcgi_scripy_name)、引号缺失、分号漏写、配置嵌套错误
    • 解决:开启vim行号 :set nu,定位报错行修改
  2. curl:6 Could not resolve host
    • 客户端hosts无域名解析,修改/etc/hosts添加IP域名映射
  3. nginx: emerg cannot load certificate
    • 证书路径写错、证书文件未移动到/etc/ssl/certs/、权限不足
  4. 403 Forbidden 无权限访问
    • 网站目录权限不足、SELinux拦截、缺少index首页文件
    • 临时关闭selinux:setenforce 0(仅服务端执行)
  5. 502 Bad Gateway
    • php-fpm未启动、fastcgi_pass端口写错、后端服务宕机

十二、Nginx 核心内置常用变量

变量 含义
$uri 请求URL(不含get参数)
$args URL问号后的查询参数
$remote_addr 客户端真实IP
$host 访问域名
$scheme 请求协议 http/https
$request_uri 完整URL(含参数)

十三、Nginx 其他实用功能

  1. gzip 压缩:减小网页传输体积
bash 复制代码
gzip on;
gzip_types text/css text/html application/json application/javascript;
  1. IP访问控制
bash 复制代码
location /admin {
    allow 10.1.8.0/24;
    deny all;
}
  1. 日志文件
  • access.log:所有用户访问记录(IP、时间、状态码、UA)
  • error.log:服务报错、502/403等故障日志,排错核心文件
相关推荐
ltl2 小时前
可观测性存储与成本:采样、下采样、冷热分层
运维
学代码的CJY3 小时前
Linux 库制作与原理:静态库、动态库、ELF 与动态链接完全指南
linux·运维·服务器
路由侠内网穿透5 小时前
本地部署企业级快速开发平台芋道管理后台并实现外部访问
运维·服务器·网络·网络协议
好评1245 小时前
【Linux】进程信号
linux·运维·服务器
cakeism8256 小时前
Gitee DevOps 平台定位、核心能力与选型指南
运维·gitee·devops
xianyuCcCcCCCcc6 小时前
Nginx 深度解析:从基础架构到反向代理与负载均衡实战全解
linux·运维·nginx·bash·负载均衡
qq_25294131686 小时前
列车车轮缺陷智能检测数据集:800张图像、4大类别,助力铁路安全运维
运维·人工智能·安全·yolo·目标检测·计算机视觉·视觉检测
爱折腾的小码农6 小时前
解决Navicat 17 Premium Lite在Linux上运行报错“LIBSYSTEMD_251‘ not found”问题
linux·运维
Doraemomo7 小时前
Linux编程-标准IO和系统IO
linux·运维·服务器