nginx通过host请求头匹配server_name实现虚拟主机,本质是字符串匹配;server块必须置于http块内,需同时配置listen和server_name,支持多域名共存但https需san证书。

Nginx 用 server 块划分虚拟主机,本质是靠 HTTP 请求头里的 Host 字段做字符串匹配,不是靠端口或目录自动区分。一个 server 块就是一个独立站点,多个块并列存在即可支持多域名或多站点。
server 块必须放在 http 块内部
写错位置会导致 unknown directive "server" 错误——server 块不能顶格写在配置文件开头,也不能塞进 events 块里。它必须嵌套在 http { ... } 大括号中。
- 常见正确位置:主配置
/etc/nginx/nginx.conf文件末尾的http段内 - 更推荐做法:新建独立文件,如
/etc/nginx/conf.d/example.com.conf,只放一个server块 - 确认是否加载:运行
nginx -T | grep -A5 "server_name example.com",看到完整生效配置才算成功
每个 server 块必须显式声明 listen 和 server_name
缺一不可,否则请求会 404 或落入默认站点:
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
-
listen 80;表示监听所有 IP 的 80 端口(等价于listen *:80;);若写成listen 127.0.0.1:80;,外网就访问不到 -
server_name example.com www.example.com;——多个域名用空格分隔,不能加逗号或引号 - 如果只配了
server_name www.example.com;,但用户访问的是example.com,就不会匹配上
多个域名共用一个 server 块?可以,但有前提
单个 server 块支持多个域名,适用于内容完全一致的场景(比如带 www 和不带 www):
- 语法很简单:
server_name example.com www.example.com demo.example.org; - HTTPS 下必须用 SAN 证书,即一张证书同时覆盖所有域名,否则浏览器会报证书错误
- 可通过
$host变量做差异化处理,例如强制跳转:if ($host != 'example.com') { return 301 https://example.com$request_uri; }
root 和 alias 路径别写反,否则静态文件 404
这是最常导致“配置看起来对、但页面打不开”的原因:
-
root /var/www;+location /static/ { ... }→ 实际查找路径是/var/www/static/... -
alias /var/www/static/;+location /static/ { ... }→ 实际查找路径是/var/www/static/...(注意alias路径结尾必须带斜杠) - 混淆两者会导致 Nginx 找不到
/static/js/app.js这类文件,直接返回 404










