在 nginx 中,通过为每个 server 块配置唯一的 server_name 并分别指定不同的 alias 路径,可以实现多站目录隔离。具体做法是定义多个虚拟主机,每个主机监听相同的端口但匹配不同的域名,并在各自的 location 块中使用 alias 将 url 映射到服务器磁盘上完全独立的物理目录,确保一个站的请求不会访问到另一个站的文件。

如何配置 server_name 以区分不同域名
配置的核心在于利用 server_name 指令进行域名匹配。Nginx 会优先匹配最精确的域名,如果找不到完全匹配的域名,则尝试匹配通配符或正则表达式,最后回退到默认服务器(即第一个配置的 server 块)。为了实现严格的隔离,每个站点必须拥有唯一的 server_name,并且建议设置一个默认的 server 块来拦截未绑定域名的请求,防止信息泄露。

server {
listen 80;
server_name site1.com www.site1.com;
location / {
alias /var/www/site1/html/;
index index.html;
}
}
server {
listen 80;
server_name site2.com www.site2.com;
location / {
alias /var/www/site2/html/;
index index.html;
}
}
上述配置中,当用户访问 site1.com 时,Nginx 会将请求路由到第一个 server 块,并将根路径映射到 /var/www/site1/html/。同理,访问 site2.com 则映射到 /var/www/site2/html/。这两个目录在文件系统中是完全独立的,互不干扰。注意 alias 路径末尾的分号至关重要,它指示 Nginx 这是一个目录而非文件。
alias 与 root 在目录隔离中的关键差异
虽然 root 和 alias 都能定位文件,但在实现严格的目录隔离和灵活的路径映射时,alias 提供了更精确的控制。使用 root 时,Nginx 会将 root 指定的路径与 location 匹配后的 URI 拼接起来;而使用 alias 时,location 路径会被完全替换为 alias 指定的路径。这种替换机制使得 alias 更适合处理非标准目录结构或需要隐藏真实物理路径的场景,从而增强隔离性。

# 使用 root 的情况
server {
root /var/www/sites;
server_name site1.com;
location /data {
# 实际访问路径: /var/www/sites/data + URI
}
}
# 使用 alias 的情况
server {
server_name site1.com;
location /data {
alias /var/www/site1/assets;
# 实际访问路径: /var/www/site1/assets + URI
}
}
在上面的对比中,如果使用 root,所有站点可能共享一个父目录 /var/www/sites,然后通过子目录区分,这在一定程度上降低了隔离级别。而使用 alias,我们可以直接将 /data 映射到任意位置的 /var/www/site1/assets,甚至可以是其他服务器的挂载点,彻底切断了与主 Web 根目录的物理联系。这种灵活性对于多租户环境下的安全隔离非常有用。务必记住,alias 只能用于 location 块,不能用于 server 级别,且必须包含完整的目录路径。
如何处理 alias 路径不存在时的错误响应
当使用 alias 指向一个不存在的物理目录时,Nginx 默认会返回 404 Not Found 错误。为了提升用户体验和安全性,可以配置自定义的错误页面或重定向规则。此外,还需要注意权限问题,确保运行 Nginx 进程的用户(通常是 www-data 或 nginx)对 alias 指定的目录具有读取权限。如果权限不足,即使目录存在,也会返回 403 Forbidden 错误。
server {
server_name site1.com;
location / {
alias /var/www/site1/html/;
index index.html;
error_page 404 /custom_404.html;
location = /custom_404.html {
root /var/www/errors;
internal;
}
}
}
在上述配置中,如果 /var/www/site1/html/ 下没有对应的文件,Nginx 会尝试加载 /var/www/errors/custom_404.html。这里的 internal 指令确保该错误页面只能通过内部重定向访问,防止外部直接请求。同时,应定期检查目录权限:chmod -R 755 /var/www/site1/html 和 chown -R www-data:www-data /var/www/site1/html。这样可以确保 Nginx 能够正常读取文件,同时防止其他用户写入恶意内容。通过这种方式,不仅实现了目录隔离,还增强了系统的健壮性和安全性。


















