前言
今天不知咋地,突然就想到我那个本地服务器,到现在也只跑了个博客。它应该还能跑更多服务的,但是以我目前的技术,没法处理不同服务之间的路径串扰。
就像之前打算的那样
huqz.com/blog/xxx // 博客
huqz.com/album/xxx // 图床
...
在 nginx 中配置(大体配置如此):
server {
listen 80;
server_name localhost;
location /blog {
proxy_pass http://localhost:8090;
}
location /album {
proxy_pass http://localhost:8001;
}
}
但是,这样玩是会出问题的。
例如,我的博客请求一个图片静态资源,那博客系统请求该图片的完整地址是 http://huqz.com/static/2021/10/13/1634139090039.jpg ,但是在这个请求经过 nginx 的时候,它既不会分到 /blog 也不会分到 /album。但是它只有经过 /blog 的时候才会被正确显示出来。
你可能会想,那我在加个静态资源的 nginx 配置,直接将带 static 路径的地址全部转发到 blog 去。
虽然这个方法有点用,但是我不同意。其一,转发静态资源的 nginx 配置极其难写,且不容易区分各个请求的归属。其二,万一另一个服务也有 static 的请求呢?我总不可能为了这个去改服务的源码吧。。。
所以,今天的主角登场了,那就是: 二级域名
二级域名的配置
接入互联网的二级域名配置,网上一抓一大把,我在此就不再多言。况且我仅仅是在内网使用,所以内网的域名就用 host 文件来规定吧。以下是我的思路和解决办法。
一、二级域名的 IP 指向
当然我只有一个服务器,所以不管啥二级域名肯定都指向同一个 IP 地址啦。
# host file
192.168.43.198 huqz.com
192.168.43.198 blog.huqz.com
192.168.43.198 album.huqz.com
二、Nginx 的配置
00 配置文件的放置
一般来说,/etc/nginx/conf.d/ 目录下存放的是公共的配置文件,所以咱们的一些网站的配置文件就不放这里了。一是位置尴尬,二是不便于管理。
况且 nginx 已经给了我们一个好地方来放置我们的配置文件:
-
/etc/nginx/sites-available/
它的意思是在此放置可用的配置文件。 -
/etc/nginx/sites-enable/
它与available相关联,意思是已经开启的配置文件。
也就是说,我们把配置文件放到 available 中,通过软链接( ln -s /etc/nginx/sites-available/xxx /etc/nginx/sites-enable/xxx )将我们的配置文件连接到 enable 中,这样配置文件就能生效。
当我们不需要某个配置文件时,直接在 enable 中删除对应软链接即可。极大地提高了工作效率。
01 动态项目的配置
由于动态项目有自己的服务运行起的,所以我们直接通过 nginx 反向代理即可。
# blog
# 其他细节已经省略
server {
listen 80;
server_name blog.huqz.com; # 这里是对应的二级域名
location / {
proxy_pass http://localhost:8090; # 转发到对应的端口就好
}
}
10 静态项目的配置
静态项目没有服务,它是通过 nginx 工作起来的。要将其放到我们的二级域名下,可以这样操作:
# album
# 其他细节已经省略
server {
listen 80;
server_name album.huqz.com; # 这里是对应的二级域名
root /var/www/ablum;
index index.html index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include fastcgi.conf;
fastcgi_pass unix:/run/php/php-fpm.sock;
}
}
11 禁止某些访问
通过不同的域名访问后,我们最好阻止其他方式的访问。
-
比如我再用 IP地址 来直接访问,它不匹配任何一个
server_name,所以进入了谁的服务我也很蒙。 -
比如我再用一级域名来直接访问,它到底进了谁的服务?
所以,对于没有功能的域名和 IP地址 我们直接给他 ban 掉,让他无法访问或者给他重定向至固定的地方。
01 不在列表中的域名
server {
listen 80;
server_name _; # _ 表示匹配所有域名
location / {
return 404; # 发现没有匹配的域名,直接返回404错误
}
}
02 重定向
server {
listen 80;
server_name huqz.com; # 一级域名没有放置任何服务
location / {
rewrite ^/(.*) http://blog.huqz.com permanent; # 重定向至博客的地址
}
}
有关重定向的知识网上很多,我这里就不列举了。
总结
OK, 本文的内容就到此为止了。完美实现了对每个服务的二级域名,达到了互不干扰的目标,这下再多服务也不怕冲突了哈哈哈哈。
另外,
Nginx 二级域名部署
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法