本文关键词:nginx怎么做多个网站
很多刚接触服务器的小白,一听到“配置nginx”就头大。觉得那是大神干的事。其实真没你想得那么玄乎。
我就直说了,nginx配置多个网站,核心就一个字:分。
把不同的域名,分给不同的server块。这就好比你在一个小区里开了好几家店,每家店有独立的门牌号。nginx就是那个物业经理,负责把访客引到正确的店里。
咱们不整那些虚头巴脑的理论。直接上干货。
你打开你的nginx配置文件,通常在 /etc/nginx/conf.d/ 或者 sites-available 目录下。你会看到一堆 .conf 文件。
每个 .conf 文件,就是一个独立的网站配置。
比如,你想跑两个站。一个是 blog.example.com,一个是 shop.example.com。
你就新建两个文件:blog.conf 和 shop.conf。
别偷懒,别把所有东西都塞进一个 default.conf 里。那样后期维护起来,你绝对想骂人。
在 blog.conf 里,写 server 块。
server {
listen 80;
server_name blog.example.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
}
}
简单吧?listen 监听80端口,server_name 指定域名。location 里把请求转发给你的后端应用,比如跑在8080端口的node.js或者java服务。
注意看 proxy_set_header Host $host; 这一行。很多新手容易漏掉这个。
如果不加这一行,后端收到的请求头里,host是空的或者不对的。有些框架会因此报错,或者重定向循环。
这就是坑。
同样的,shop.conf 里也这么写,只是 server_name 改成 shop.example.com,proxy_pass 改成你shop后端的端口,比如 8081。
配置完,别急着重启。
先测试一下语法。
nginx -t
如果显示 syntax is ok,test is successful,那恭喜你,基本稳了。
如果有报错,它会告诉你哪一行错了。通常是分号漏了,或者大括号没配对。
这时候别慌,仔细检查。
测试通过后,reload 一下。
nginx -s reload
这样不用断开现有连接,平滑重启。
这时候,你去浏览器输入 blog.example.com。
如果看到你的博客页面,说明成了。
输入 shop.example.com,看到商城页面,也说明成了。
但是,这里有个大坑。
很多兄弟配完发现,访问 shop 的时候,竟然跳到了 blog。
为什么?
因为 nginx 有一个默认行为。
如果你访问的域名,在所有 server 块里都没匹配到,它会去访问第一个加载的 server 块,或者是你标记为 default_server 的那个。
通常,第一个被 nginx 读取到的 conf 文件,就会成为默认站点。
所以,如果你只想让特定域名访问,其他域名访问要返回 404 或者跳转到主页。
你需要在每个 server 块里,确保 server_name 写准确。
或者,你可以专门写一个 catch-all 的 server 块,监听所有未匹配的请求,直接返回 403 禁止访问。
server {
listen 80 default_server;
server_name _;
return 403;
}
把这个放在最后加载的位置。
这样,别人随便输个域名来扫你的端口,也只能看到 403。
安全一点。
再说说 https。
现在不搞 https 都不好意思说自己是做网站的。
配置 https 也很简单。
在 server 块里加上 ssl 相关的参数。
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
然后把 listen 80 改成 listen 443 ssl。
记得,http 和 https 要分开配置。
你可以写一个 http 的 server 块,专门做 301 跳转,把所有 http 请求强制跳转到 https。
server {
listen 80;
server_name blog.example.com;
return 301 https://$server_name$request_uri;
}
这样既安全,又规范。
我见过太多人,为了省事,http 和 https 混在一起写。结果证书过期了,或者配置乱了,网站直接打不开。
排查起来能把你急死。
还有,静态资源。
如果你的网站里有图片、css、js。
别让他们经过 proxy_pass。
直接在 nginx 里用 location 匹配静态路径,指向磁盘上的目录。
location /static/ {
alias /var/www/blog/static/;
expires 30d;
}
这样 nginx 直接返回文件,不经过后端应用。
速度快,还省后端资源。
这是基本操作。
最后,提醒一句。
配置文件改完,一定要 nginx -t 测试。
一定要 reload。
不要直接 restart。
重启虽然也能生效,但在高并发场景下,restart 会导致瞬间连接中断。
reload 是平滑过渡,用户无感知。
这点细节,决定了你是业余选手还是专业运维。
如果你按照上面的步骤,还是搞不定。
那可能是你的服务器环境有问题,或者防火墙没开。
检查端口是否开放,检查后端服务是否真的在监听。
别光盯着 nginx 看。
有时候,问题出在别处。
如果你实在搞不定,或者想配置更复杂的负载均衡、动静分离。
那可以找我聊聊。
我不卖课,也不忽悠。
就是帮你看看配置,找找毛病。
毕竟,服务器稳定运行,比什么都重要。
别等网站挂了,才想起来找救兵。
平时多备份配置,多测试。
这才是正道。