📜 简介
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即可更换网站内容
🔒 重要提醒
-
防火墙: 确保服务器防火墙 (如
ufw
) 允许 HTTP (80) 端口:sudo ufw allow 80/tcp sudo ufw reload
-
后续管理:
-
添加新网站: 重复步骤 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
。
-
-
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 的完整流程:
📋 前提条件
-
拥有域名(如
yourdomain.com
) -
域名已解析到服务器公网 IP
-
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
执行过程中:
-
输入邮箱地址(用于安全通知)
-
同意服务条款
-
选择是否分享邮箱(可选)
-
关键选择:是否将所有 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 排名。所有现代浏览器都会在地址栏显示安全锁标志,表示连接已加密保护。