XYCOVO CONSOLE KURISU · WEB 渗透 / AI 辅助攻防 ONLINE
#023 · 2025-03-01✓ PASS

Nginx Web 服务器

从安装部署到虚拟主机、SSL/TLS 证书、反向代理和负载均衡的 Nginx 完整配置指南。
linuxnginxweb服务器网络安全AUTHOR: KURISU

Nginx 是高性能的 HTTP 和反向代理服务器,在 RHEL 10 中作为默认 Web 服务器。本文涵盖从基础安装到生产部署的完整配置。


一、安装与启动

# 安装 Nginx
dnf install -y nginx

# 启动并开机自启
systemctl enable --now nginx

# 防火墙放行
firewall-cmd --add-service=http --permanent
firewall-cmd --add-service=https --permanent
firewall-cmd --reload

# SELinux 放行
setsebool -P httpd_can_network_connect on

核心目录

路径说明
/etc/nginx/nginx.conf主配置文件
/etc/nginx/conf.d/额外配置目录
/usr/share/nginx/html/默认网站根目录
/var/log/nginx/日志目录

二、主配置文件结构

# /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /run/nginx.pid;

events {
    worker_connections 1024;
    use epoll;                     # Linux 高性能事件模型
}

http {
    include /etc/nginx/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"';

    access_log /var/log/nginx/access.log main;

    sendfile on;
    tcp_nopush on;
    keepalive_timeout 65;
    gzip on;

    include /etc/nginx/conf.d/*.conf;
}

三、虚拟主机配置

基于域名的虚拟主机

server {
    listen 80;
    server_name www.example.com example.com;

    root /var/www/example;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }
}

多站点配置

# 每个站点一个独立配置文件
cat > /etc/nginx/conf.d/site1.conf << 'EOF'
server {
    listen 80;
    server_name site1.example.com;
    root /var/www/site1;
    index index.html;
}
EOF

cat > /etc/nginx/conf.d/site2.conf << 'EOF'
server {
    listen 80;
    server_name site2.example.com;
    root /var/www/site2;
    index index.html;
}
EOF

# 验证配置
nginx -t

# 重载
systemctl reload nginx

四、SSL/TLS 配置

生成自签名证书(测试用)

openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout /etc/nginx/ssl/private.key \
  -out /etc/nginx/ssl/certificate.crt

HTTPS 站点配置

server {
    listen 443 ssl http2;
    server_name secure.example.com;

    ssl_certificate     /etc/nginx/ssl/certificate.crt;
    ssl_certificate_key /etc/nginx/ssl/private.key;

    # 现代 SSL 配置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    root /var/www/secure;
    index index.html;
}

# HTTP 自动跳转 HTTPS
server {
    listen 80;
    server_name secure.example.com;
    return 301 https://$server_name$request_uri;
}

五、反向代理

基本反向代理

server {
    listen 80;
    server_name api.example.com;

    location / {
        proxy_pass http://127.0.0.1:3000;
        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_set_header X-Forwarded-Proto $scheme;
    }
}

WebSocket 代理

location /ws/ {
    proxy_pass http://127.0.0.1:8080;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

六、负载均衡

# 上游服务器组
upstream backend {
    least_conn;                          # 最少连接算法
    server 192.168.1.10:8080 weight=3;   # 权重 3
    server 192.168.1.11:8080 weight=1;
    server 192.168.1.12:8080 backup;     # 备用服务器

    # 健康检查(商业版)
    # health_check interval=5s fails=3 passes=2;
}

server {
    listen 80;
    server_name lb.example.com;

    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

负载均衡算法

算法指令说明
轮询默认依次分发
最少连接least_conn发给连接最少的服务器
IP 哈希ip_hash同一 IP 请求到同一服务器
加权weight=N按权重比例分发

七、访问控制

# IP 白名单/黑名单
location /admin/ {
    allow 192.168.1.0/24;
    allow 10.0.0.100;
    deny all;
}

# HTTP 基本认证
location /private/ {
    auth_basic "Restricted Area";
    auth_basic_user_file /etc/nginx/.htpasswd;
}
# 创建用户密码文件
dnf install -y httpd-tools
htpasswd -c /etc/nginx/.htpasswd admin

八、日志与监控

# 实时查看访问日志
tail -f /var/log/nginx/access.log

# 查看错误日志
tail -f /var/log/nginx/error.log

# 统计状态码分布
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn

# Top 10 IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10

Stub Status 监控

location /nginx_status {
    stub_status;
    allow 127.0.0.1;
    deny all;
}

输出示例:

Active connections: 291
server accepts handled requests
 16630948 16630948 31070465
Reading: 6 Writing: 179 Waiting: 106

九、性能优化

# Worker 进程
worker_processes auto;
worker_rlimit_nofile 65535;

events {
    worker_connections 4096;
    multi_accept on;
}

http {
    # 文件缓存
    open_file_cache max=10000 inactive=30s;
    open_file_cache_valid 60s;
    open_file_cache_min_uses 2;

    # Gzip 压缩
    gzip on;
    gzip_types text/plain text/css application/json application/javascript text/xml;
    gzip_min_length 1000;
    gzip_comp_level 6;

    # 缓冲区
    client_max_body_size 100m;
    client_body_buffer_size 128k;
}

← #022 DNS 域名解析…#024 Chronyd 时间同步… →