登录
首页 >  文章 >  linux

Linux下Nginx虚拟主机配置教程

时间:2026-04-26 21:02:38 140浏览 收藏

本文详解如何在Linux中通过Nginx正确配置多域名虚拟主机,核心在于为每个站点创建独立的`server`块并精准使用`server_name`匹配Host头,而非依赖端口或子目录“凑合”;强调必须显式声明`listen 80`或`listen 443 ssl`、避免`server_name`堆叠错误、区分HTTP跳转与HTTPS服务、合理排查配置不生效(首选`nginx -s reload`而非重启,并用`nginx -T`验证实际加载结果),同时覆盖SELinux权限、Let’s Encrypt自动续期、日志定位匹配逻辑等实战痛点——真正决定成败的,往往不是你会不会写配置,而是你改的那行代码,是否真的被Nginx看见并执行。

Linux怎么配置Nginx虚拟主机_Linux如何一台服务器多站点【技巧】

怎么让Nginx同时跑多个域名站点

直接说结论:靠 server 块 + server_name 匹配,不是靠端口或子目录硬凑。一个 server 块对应一个逻辑站点,Nginx 根据请求头里的 Host 字段决定进哪个块。

常见错误是把多个 server_name 写在同一块里想“一锅端”,结果只有第一个生效;或者漏写 listen 80,导致配置加载成功但根本收不到请求。

  • 每个站点必须有独立的 server 块,哪怕只差一个域名
  • server_name 支持精确匹配(example.com)、通配符(*.example.com)和正则(~^www\.(.+)$),但别滥用正则,影响性能
  • 务必显式写 listen 80listen 443 ssl,否则默认只监听 *:80,但某些系统会因权限或防火墙失效
  • 不同站点用不同 root 路径,别共用一个目录还靠 location 切分——那是自找麻烦

为什么改完配置 Nginx 不生效

90% 是没重载,不是重启。用 nginx -t 验证语法后,必须执行 nginx -s reload,而不是 systemctl restart nginx(后者可能中断连接,且掩盖配置热更能力)。

容易踩的坑:

  • nginx -t 显示 “syntax is ok” 但不提示 include 的文件路径错误——检查是否用了 include /etc/nginx/sites-enabled/*; 却忘了在 sites-available 里建软链
  • 修改了 /etc/nginx/conf.d/default.conf,但该文件里有 include 其他路径,实际生效的是被 include 的那个
  • SELinux 启用时,即使 root 路径权限 755,Nginx 也可能读不到文件,报 Permission denied 错误,临时关 SELinux 或用 setsebool -P httpd_read_user_content 1

HTTP 和 HTTPS 站点能共存吗

能,而且推荐分开写两个 server 块:一个 listen 80 做跳转,一个 listen 443 ssl 处理加密流量。混在一个块里虽然语法允许,但会让 SSL 配置变复杂、难维护。

关键点:

  • ssl_certificatessl_certificate_key 必须指向可读的 PEM 文件,路径别用相对路径(如 cert.pem),一律写绝对路径(/etc/letsencrypt/live/example.com/fullchain.pem
  • Let’s Encrypt 的证书要定期更新,建议用 certbot renew --deploy-hook "nginx -s reload" 自动续期
  • HTTP 块里加 return 301 https://$host$request_uri;,比用 rewrite 更快更安全

怎么查某个域名到底进了哪个 server 块

最直接的办法是临时加日志:在目标 server 块里加 access_log /var/log/nginx/example.com.log main;,然后 curl -H "Host: example.com" http://你的服务器IP,看日志有没有记录。如果没写入,说明没匹配上。

排查顺序很实际:

  • 先确认 DNS 或 hosts 已把域名指向服务器 IP
  • nginx -T | grep -A 5 -B 5 "server_name.*example.com" 查配置是否被正确加载
  • 检查 server_name 是否拼错,比如写成 www.example.com.(末尾多了点)或大小写混用(Nginx 匹配是大小写敏感的)
  • 如果用了泛域名,注意 *.example.com 不匹配 example.com,得额外写一行

真正麻烦的从来不是配置多难写,而是你改的那行,根本就没被 Nginx 看见——它可能在被注释的文件里,可能在被 include 忽略的路径下,也可能被另一个同名 server 块优先捕获了。动手前先 nginx -T 看全量展开配置,比猜强得多。

终于介绍完啦!小伙伴们,这篇关于《Linux下Nginx虚拟主机配置教程》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布文章相关知识,快来关注吧!

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>