前言

今天不知咋地,突然就想到我那个本地服务器,到现在也只跑了个博客。它应该还能跑更多服务的,但是以我目前的技术,没法处理不同服务之间的路径串扰。

就像之前打算的那样

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, 本文的内容就到此为止了。完美实现了对每个服务的二级域名,达到了互不干扰的目标,这下再多服务也不怕冲突了哈哈哈哈。
另外,