官方网站 云服务器 专用服务器香港云主机28元月 全球云主机40+ 数据中心地区 成品网站模版 企业建站 业务咨询 微信客服 控制版面

nginx添加虚拟主机2020

admin 3周前 (07-12) 阅读数 340 #虚拟主机知识
文章标签 虚拟主机配置

Nginx虚拟主机实战指南(2020生产就绪版):从单站托管到云原生边缘网关

在HTTPS成为强制标准、IPv6规模商用、SaaS多租户架构爆发的2020年,Nginx虚拟主机早已超越“一个IP跑多个域名”的初级能力——它已成为零信任安全边界、灰度发布通道、静态资源调度中枢与合规审计基线的统一载体,本文摒弃碎片化教程,以可审计、可回滚、可自动化为设计准则,系统交付一套经百万级PV站点验证的标准化配置范式。


重新定义虚拟主机:不止于server_name,更是架构契约

Nginx官方文档中并无“Virtual Host”术语——这恰是其设计哲学的体现:用声明式server块替代Apache的指令式<VirtualHost>,其本质是HTTP/1.1协议层的精准路由机制:
✅ 解析请求头中的Host字段 → ✅ 匹配server_name(支持通配符*.example.com、正则~^www\.(?<domain>.+)$)→ ✅ 将流量注入独立上下文空间。

2020年的实践表明,一个健壮的server块应承载四重契约: | 维度 | 技术实现 | 合规价值 | |--------|-----------|-----------| | 安全契约 | TLS 1.3强制启用 + HSTS预加载 + OCSP Stapling | 满足PCI DSS 4.1、GDPR第32条“适当技术措施” | | 运维契约 | 独立访问日志/错误日志 + 目录权限隔离 + root路径显式声明 | 支持等保2.0“安全审计”与“剩余信息保护” | | 性能契约 | http2协议栈 + 静态资源immutable缓存 + Gzip/Brotli双压缩 | 提升Lighthouse评分,响应Google Core Web Vitals指标 | | 演进契约 | 配置文件与代码库同源管理 + nginx -T可追溯生效配置 | 实现GitOps闭环,满足DevSecOps审计要求 |

💡 典型场景:同一服务器上,shop.example.com(PHP电商)与docs.api.example.com(Swagger静态文档)共享IP,但SSL证书、缓存策略、日志留存周期、WAF规则完全解耦——这才是虚拟主机的现代意义。


标准化部署流程(2020黄金路径)

▶ 步骤1:筑牢安全基线

  • 版本确认:执行 nginx -v,要求 ≥1.16.1(修复CVE-2019-20372),Ubuntu 20.04默认1.18.0,CentOS 8需通过dnf module enable nginx:1.18启用稳定流。
  • 目录结构标准化
    sudo mkdir -p /var/www/sites/{blog.example.com,api.example.com}
    sudo chown -R $USER:www-data /var/www/sites/
    sudo find /var/www/sites -type d -exec chmod 755 {} \;
    sudo find /var/www/sites -type f -exec chmod 644 {} \;

    ⚠️ 禁止使用/usr/share/nginx/html——该路径属系统包管理范畴,混用将导致apt upgrade时配置被覆盖。

▶ 步骤2:创建原子化配置(核心实践)

原则:每个站点 = 1个独立文件 + 1个软链接 + 0处全局修改
文件路径:/etc/nginx/sites-available/blog.example.com

# /etc/nginx/sites-available/blog.example.com
# 【HTTP端口】强制跳转HTTPS(符合RFC 7231 301语义,避免混合内容)
server {
    listen 80;
    listen [::]:80;
    server_name blog.example.com www.blog.example.com;
    return 301 https://$host$request_uri; # 使用$host而非$server_name,兼容CDN透传Host头
}
# 【HTTPS端口】生产级TLS配置(基于Mozilla SSL Configuration Generator 2020 Intermediate Profile)
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name blog.example.com www.blog.example.com;
    # 站点根目录(必须显式声明,避免继承全局root)
    root /var/www/sites/blog.example.com;
    index index.html index.php;
    # Let's Encrypt证书(ACME v2协议,Certbot 1.0+自动部署)
    ssl_certificate /etc/letsencrypt/live/blog.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/blog.example.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf; # 含OCSP Stapling、TLS 1.3兼容配置
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
    # 【2020安全强化】
    ssl_protocols TLSv1.2 TLSv1.3; # 禁用TLS 1.0/1.1(PCI DSS 4.1强制要求)
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 1.1.1.1 8.8.8.8 valid=300s; # 必须配置DNS解析器,否则OCSP失败
    # PHP-FPM处理(Ubuntu 20.04示例,CentOS请对应调整socket路径)
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        # 关键加固:禁止PHP执行上传目录
        location ~ /uploads/.*\.php$ { deny all; }
    }
    # 【CDN友好静态缓存】
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2|ttf)$ {
        expires 1y;
        add_header Cache-Control "public, immutable, max-age=31536000";
        # 防止CDN缓存过期后回源失败
        add_header Last-Modified "";
        add_header ETag "";
    }
    # 【日志隔离】按站点切割,便于ELK日志分析
    access_log /var/log/nginx/blog.example.com_access.log main buffer=16k flush=5s;
    error_log /var/log/nginx/blog.example.com_error.log warn;
    # 【防爬虫增强】拒绝已知恶意User-Agent(可扩展为geoip或rate limiting)
    if ($http_user_agent ~* "sqlmap|nikto|wget") {
        return 403;
    }
}

▶ 步骤3:启用与验证(零停机交付)

# 创建启用链接(符号链接指向sites-available)
sudo ln -sf /etc/nginx/sites-available/blog.example.com /etc/nginx/sites-enabled/
# 【关键检查】语法验证 + 配置快照
sudo nginx -t && echo "✅ 语法通过" || exit 1
sudo nginx -T > /tmp/nginx-config-snapshot-$(date +%Y%m%d).txt  # 保留生效配置快照
# 【优雅重载】不中断现有连接
sudo systemctl reload nginx
# 验证:curl -I http://blog.example.com → 应返回301跳转至HTTPS

2020不可妥协的进阶实践

能力 实施要点 工具链建议
证书自动化 Certbot 1.2+配合--deploy-hook,续期后自动reload Nginx并发送企业微信告警 `certbot renew --deploy-hook "systemctl reload nginx && curl -X POST 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx'
版权声明
本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主 如果涉及侵权请尽快告知,我们将会在第一时间删除。
本站原创内容未经允许不得转载,或转载时需注明出处:特网云知识库

热门