单IP部署多个站点需通过server_name匹配Host头实现流量分发;各站点须有独立根目录并正确设置权限;配置应拆分为独立conf文件并通过include引入;每个server块需规范定义listen、server_name、root等字段;必须设置default_server处理未匹配请求;最后用nginx -t测试并reload生效。

单IP部署多个站点,核心是靠 server_name 匹配请求头中的 Host 字段,Nginx 会把不同域名的流量精准分发到各自配置的 server 块里。只要 DNS 解析到位、目录和权限正确、配置不冲突,整个过程很稳定。
域名与目录准备要到位
每个站点必须有独立根目录,路径建议按域名命名,便于识别和维护:
- 创建目录:
sudo mkdir -p /var/www/site1.com/html /var/www/site2.com/html - 设置权限:
sudo chown -R $USER:www-data /var/www/site1.com/html(Ubuntu/Debian)或sudo chown -R $USER:nginx /var/www/site1.com/html(CentOS/RHEL) - 放一个测试页:
echo "site1.com
" > /var/www/site1.com/html/index.html
配置文件按站点拆分管理
不要往主配置 nginx.conf 里硬塞,用 include 机制外挂更安全清晰:
- 确保主配置中已启用包含语句,比如在
http块里有:include /etc/nginx/conf.d/*.conf; - 为每个站点新建独立配置文件,如
/etc/nginx/conf.d/site1.com.conf - 内容精简明确,只保留必要字段:监听端口、域名、根目录、索引页、基础 location
server 块写法要规范
每个配置文件里只写一个 server 块,关键点如下:
-
listen 80;和listen [::]:80;都加上,兼容 IPv4/IPv6 -
server_name site1.com www.site1.com;多个域名空格分隔,不加协议,不带路径 -
root指向具体 html 子目录,不是父级;index index.html;明确首页文件 -
location / { try_files $uri $uri/ =404; }是静态站点推荐写法,防目录遍历也保默认行为
默认站点与错误处理不能少
没匹配上的请求会落到“默认 server”,必须显式定义,避免暴露其他站点或返回意外内容:
- 新建
/etc/nginx/conf.d/00-default.conf(数字前缀确保最先加载) - 里面只放一个最简块:
server { listen 80 default_server; return 444; } - 或者返回统一 404 页面、重定向到主站,视业务需要而定
配置完运行 nginx -t 测试语法,再 systemctl reload nginx 生效。查日志用 tail -f /var/log/nginx/error.log,比反复刷新浏览器快得多。











