Ubuntu下Nginx的快速配置多网站(前端)

📜 简介

Nginx 是一个高性能的 HTTP 和反向代理服务器,广泛用于托管多个网站或应用。通过配置虚拟主机(Virtual Hosts),可以在同一台服务器上运行多个独立的网站。本文将指导你如何在 Nginx 中设置虚拟主机。


✏️基础配置教程 

📥 第 1 步:安装 Nginx 

#无nginx

# 1. 更新软件包列表
sudo apt update

# 2. 安装 Nginx
sudo apt install nginx

# 3. 检查安装状态和版本
nginx -v
systemctl status nginx

----------------------------

#如果有nginx且没配好

# 1. 停止 Nginx 服务
sudo systemctl stop nginx

# 2. 卸载 Nginx 软件包
sudo apt purge nginx nginx-common nginx-core

# 3. 删除残留的配置文件、日志和网站文件 (⚠️ 注意:这会删除所有Nginx相关配置和默认网站文件!)
sudo rm -rf /etc/nginx /var/log/nginx /var/www/html

# 4. 删除可能存在的第三方模块目录 (如果有)
sudo rm -rf /usr/share/nginx /usr/lib/nginx

# 5. 自动删除不再需要的依赖包
sudo apt autoremove

# 6. (可选) 删除创建的网站目录 (如果你之前把网站放在其他地方,如 /var/www/ 下自定义目录,按需手动删除)
# sudo rm -rf /var/www/your_site1 /var/www/your_site2

 此时 Nginx 应该已自动启动。访问服务器 IP 地址,应该能看到 ​​Nginx 默认欢迎页面​​ (Welcome to nginx!)。这证明基础安装成功。

 🔧 第 2 步:创建网站目录 & 测试文件

(以两个网站 blog.yourdomain.com和 shop.yourdomain.com为例)

# 假设你有两个网站: blog.yourdomain.com 和 shop.yourdomain.com
sudo mkdir -p /var/www/blog.yourdomain.com/html
sudo mkdir -p /var/www/shop.yourdomain.com/html

# 设置所有权给 Nginx 用户 (通常是 www-data)
sudo chown -R www-data:www-data /var/www/blog.yourdomain.com
sudo chown -R www-data:www-data /var/www/shop.yourdomain.com

# 设置目录权限
sudo chmod -R 755 /var/www

# 创建简单的测试页面
echo '<html><body><h1>Blog Site (blog.yourdomain.com) is Working!</h1></body></html>' | sudo tee /var/www/blog.yourdomain.com/html/index.html
echo '<html><body><h1>Shop Site (shop.yourdomain.com) is Working!</h1></body></html>' | sudo tee /var/www/shop.yourdomain.com/html/index.html

 📝 第 3 步:为每个网站创建配置文件

(在sites-available)

# 创建配置文件
sudo tee /etc/nginx/sites-available/blog.yourdomain.com <<'EOF'
server {
    listen 80;
    server_name blog.yourdomain.com www.blog.yourdomain.com;

    root /var/www/blog.yourdomain.com/html;
    index index.html index.htm;

    access_log /var/log/nginx/blog.yourdomain.com.access.log combined;
    error_log /var/log/nginx/blog.yourdomain.com.error.log warn;

    location / {
        try_files $uri $uri/ =404;
    }
}
EOF
# 创建配置文件
sudo tee /etc/nginx/sites-available/shop.yourdomain.com <<'EOF'
server {
    listen 80;
    server_name shop.yourdomain.com www.shop.yourdomain.com;

    root /var/www/shop.yourdomain.com/html;
    index index.html index.htm;

    access_log /var/log/nginx/shop.yourdomain.com.access.log combined;
    error_log /var/log/nginx/shop.yourdomain.com.error.log warn;

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

 🔗 第 4 步:创建并启用默认配置

# 移除默认配置的启用链接
sudo rm -f /etc/nginx/sites-enabled/default

# 创建默认配置文件
sudo sh -c cat > /etc/nginx/sites-available/default << 'EOF'
server {
    listen 80 default_server;
    server_name _;
    return 444; # 关闭连接

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

# 创建启用链接
sudo ln -s /etc/nginx/sites-available/blog.yourdomain.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/shop.yourdomain.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/

 🔍第 5 步:验证配置文件是否创建成功

# 检查所有配置文件
ls -l /etc/nginx/sites-available/
ls -l /etc/nginx/sites-enabled/

# 检查文件内容
cat /etc/nginx/sites-available/blog.yourdomain.com
cat /etc/nginx/sites-available/shop.yourdomain.com
cat /etc/nginx/sites-available/default

✅第 6 步:测试并重启 Nginx

# 1. 测试配置文件语法 (绝对关键步骤!)
sudo nginx -t
# 看到 "syntax is ok" 和 "test is successful" 才算通过。

# 2. 重启 Nginx (让所有更改生效)
sudo systemctl restart nginx

 🧪第 7 步:测试你的虚拟主机配置

在域名备案完成前,可以通过以下方法测试:

# 测试博客站点
curl -H "Host: blog.yourdomain.com" http://localhost
# 应该输出: <h1>Blog Site (blog.yourdomain.com) is Working!</h1>

# 测试商城站点
curl -H "Host: shop.yourdomain.com" http://localhost
# 应该输出: <h1>Shop Site (shop.yourdomain.com) is Working!</h1>

# 测试默认服务器 (直接访问IP或无效域名)
curl http://localhost
# 应该输出默认页面或关闭连接

 🌐第 8 步:配置 DNS 解析

在域名备案完成后

  • 登录您的域名注册商或 DNS 服务商的管理面板。

  • 为每个​​子域名​​创建 ​​A 记录​​,将它们都指向您的​​服务器公网 IP 地址​​。

    • blog.yourdomain.com-> 你的服务器IP

    • shop.yourdomain.com-> 你的服务器IP

  • 等待 DNS 生效 (通常几分钟到几小时,可通过 ping blog.yourdomain.com或在线 DNS 检测工具检查)。

  • 直接在浏览器输入配置好的域名访问即可。

 按照这个流程操作,你就能拥有一个干净、有序、基于最佳实践的 Nginx 多域名虚拟主机环境了!配置清晰,管理方便。遇到问题随时检查日志 (/var/log/nginx/*.error.log) 和用 nginx -t验证配置。

配置完成后,只需用xftp找到对应的文件夹,var/www/(你的域名)/html/,更换里面的index.html即可更换网站内容


🔒 重要提醒

  1. ​防火墙:​​ 确保服务器防火墙 (如 ufw) 允许 HTTP (80) 端口:

    sudo ufw allow 80/tcp
    sudo ufw reload
  2. ​后续管理:​

    • ​添加新网站:​​ 重复步骤 3 (创建目录 -> 创建 sites-available/文件 -> 链接到 sites-enabled/-> 测试 -> 重载 Nginx)。

    • ​禁用网站:​​ 删除 /etc/nginx/sites-enabled/中的对应符号链接,然后 sudo systemctl reload nginx

    • ​修改配置:​​ 编辑 /etc/nginx/sites-available/your_site文件,​​每次修改后必须 sudo nginx -t && sudo systemctl reload nginx​。

  3. ​HTTPS (强烈推荐):​​ 域名配置稳定后,使用 ​​Certbot (Let's Encrypt)​​ 为每个域名免费申请 SSL 证书,启用 HTTPS (listen 443 ssl;)。安装 Certbot: sudo apt install certbot python3-certbot-nginx,然后为每个域名运行 sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com


💪 扩展

1.​​ 静态资源处理​

补充CSS/JS等资源的Nginx配置(对 CSS/JS/图片等文件启用缓存,提升加载速度)

location ~* \.(js|css|png)$ {
    expires 30d;
    add_header Cache-Control "public";
}

2. SPA应用适配

​单页应用需增加路由重定向(解决 Vue/React/Angular 等单页应用的路由刷新 404 问题)

location / {
    try_files $uri $uri/ /index.html;  # 关键!
}

📝 ​​完整配置示例(结合两者)

      在为每个网站创建配置文件时使用

server {
    listen 80;
    server_name yourdomain.com www.yourdomain.com;
    root /var/www/yourdomain.com/html;
    index index.html;

    # 静态资源缓存
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2)$ {
        expires 30d;          # 缓存30天
        add_header Cache-Control "public, no-transform";  # 公共缓存
        try_files $uri =404;  # 防止目录遍历
    }

    # SPA路由处理
    location / {
        try_files $uri $uri/ /index.html;
    }

    # 访问日志和错误日志
    access_log /var/log/nginx/yourdomain.com.access.log;
    error_log /var/log/nginx/yourdomain.com.error.log;
}

3.  企业级补充​ 

# 在http块中添加(/etc/nginx/nginx.conf)

#在文件顶部添加
# 禁用worker进程优雅关闭(立即生效变更)
worker_shutdown_timeout 0;

http {
    # 启用长连接减少重建开销
    keepalive_timeout 75s;
    keepalive_requests 1000;

    # 启用Gzip压缩
    gzip_types text/css application/json;

    # 防爬虫策略
    map $http_user_agent $block_bot {
        default 0;
        ~*(bot|crawler) 1;
    }
    server {
        if ($block_bot) { return 444; }
    }
}

4.  没有域名的情况下如何配置多个网站 

a.配置网站文件

创建网站目录和测试文件等步骤参考上面即可,在配置网页文件时,将内容设置为

(网站一)

server {
    listen 8001;  # 指定监听端口
    server_name localhost;  # 无域名时使用localhost

    root /var/www/site1/html;
    
    #其他配置同上
}

(网站二)

server {
    listen 8002;  # 不同端口
    server_name localhost;
    
    root /var/www/site2/html;
    
    #其他配置同上
}

避免使用知名端口​​:

  • 不要使用 22(SSH)、80(HTTP)、443(HTTPS) 等常见端口

  • 建议使用 8000-8100 范围的端口

b.启用配置

sudo ln -s /etc/nginx/sites-available/site1 /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/site2 /etc/nginx/sites-enabled/

 c.防火墙开放对应端口

sudo ufw allow 8001/tcp
sudo ufw allow 8002/tcp
sudo ufw reload

 d.测试并重启Nginx

# 检查配置语法
sudo nginx -t

# 重启Nginx
sudo systemctl restart nginx

e.测试访问

#不同的端口指向不同的网站
http://<服务器IP>:8001
http://<服务器IP>:8002

 f.高级优化

# /etc/nginx/sites-available/default
server {
    listen 80 default_server;
    
    # 将所有80端口的请求重定向到网站1
    return 301 http://$host:8001$request_uri;
}

5.  使用 Certbot 为域名配置 HTTPS

在已有域名的情况下,配置 HTTPS 证书让网页更安全是最佳实践。以下是使用 Let's Encrypt 的 Certbot 工具为 Nginx 配置 HTTPS 的完整流程:

📋 前提条件

  1. 拥有域名(如 yourdomain.com

  2. 域名已解析到服务器公网 IP

  3. Nginx 已安装并配置好网站(如之前的教程)

🔐 HTTPS 配置步骤 

1. 安装 Certbot 和 Nginx 插件
sudo apt update
sudo apt install certbot python3-certbot-nginx
 2. 配置 Nginx 的 server_name 

确保您的 Nginx 配置文件(如 /etc/nginx/sites-available/yourdomain.com)包含正确的域名:

server {
    listen 80;
    server_name yourdomain.com www.yourdomain.com;  # 确保域名正确
    ...
}
 3. 获取并安装 SSL 证书
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com

执行过程中:

  1. 输入邮箱地址(用于安全通知)

  2. 同意服务条款

  3. 选择是否分享邮箱(可选)

  4. ​关键选择​​:是否将所有 HTTP 流量重定向到 HTTPS(强烈建议选 2)

4. 验证自动配置结果 

Certbot 会自动修改您的 Nginx 配置,添加类似以下内容:

server {
    listen 443 ssl;  # 添加 HTTPS 监听
    server_name yourdomain.com www.yourdomain.com;
    
    # Certbot 自动添加的 SSL 证书路径
    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
    
    # 原有配置保持不变
    root /var/www/yourdomain.com/html;
    ...
}

# HTTP 重定向到 HTTPS
server {
    listen 80;
    server_name yourdomain.com www.yourdomain.com;
    return 301 https://$host$request_uri;  # 301 永久重定向
}
5. 测试并重新加载配置 
# 测试配置语法
sudo nginx -t

# 重新加载 Nginx
sudo systemctl reload nginx
6. 验证 HTTPS 是否生效 
# 命令行验证
curl -I https://yourdomain.com

# 浏览器验证:
# 访问 https://yourdomain.com,地址栏应显示安全锁标志

⚙️ 高级 HTTPS 配置(可选) 

 1. 强制 HTTPS 和 HSTS

在 SSL server 块中添加安全头:

server {
    listen 443 ssl;
    ...
    
    # 添加安全头
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";
    add_header Referrer-Policy "strict-origin-when-cross-origin";
    
    # 启用 TLS 1.3 和现代加密套件
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
}
2. 配置 OCSP Stapling 

 提升 SSL 握手性能:

server {
    ...
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 1.1.1.1 valid=300s;
    resolver_timeout 5s;
}
3. 自动证书续期  

Let's Encrypt 证书有效期为 90 天,Certbot 已配置自动续期,但建议测试:

# 测试续期过程
sudo certbot renew --dry-run

# 手动续期(实际使用时不需要)
sudo certbot renew

 🌐 多网站配置示例

为多个网站配置 HTTPS:

# 同时为多个域名配置证书
sudo certbot --nginx \
  -d blog.yourdomain.com \
  -d shop.yourdomain.com \
  -d api.yourdomain.com

每个网站会自动获得单独的 SSL 配置:

/etc/letsencrypt/live/blog.yourdomain.com/
/etc/letsencrypt/live/shop.yourdomain.com/

🔧 常见问题解决 

 1. 证书申请失败
# 检查域名解析
nslookup yourdomain.com

# 检查防火墙
sudo ufw status

# 临时关闭防火墙测试
sudo ufw disable
# 测试后重新启用
sudo ufw enable
2. 混合内容警告
  • 确保网页中所有资源(图片/CSS/JS)都使用 HTTPS URL

  • 在浏览器控制台查看具体哪个资源使用了 HTTP

 3. 更新证书后配置未生效
# 手动重新加载配置
sudo systemctl reload nginx

# 检查证书路径是否更新
ls -l /etc/letsencrypt/live/yourdomain.com

通过以上配置,您的网站将获得免费、安全的 HTTPS 连接,提升用户信任度和 SEO 排名。所有现代浏览器都会在地址栏显示安全锁标志,表示连接已加密保护。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值