假设现在有一个顶级域名ouou.com和三个二级域名white.ouou.com,blog.ouou.com,default.ouou.com,这4个域名都跟同一个IP进行绑定。三个二级域名分别对应三个不同的项目,我们希望通过不同二级域名访问同一个服务器,用Nginx做路由转发,到达不同的项目首页。
默认配置当访问顶级域名时,与访问blog.ouou.com到达同一个项目。
以下通过一个具体的例子进行讲解。本篇文章着重描述Nginx如何做路由转发,但也涉及部分部署的知识,为了本人学习记录所用,可以选择性阅读。因为需求高度定制,所以通用性不大。如果纯粹想看nginx根据不同域名做路由,可查看此文章:Nginx 根据不同域名做路由转发
版本
Nginx:1.20.1 (使用LNMP环境快速搭建)
MySQL:8.0.28
Linux操作系统:CentOS7
项目
项目一:前后端分离项目,本文使用开源项目白卷作为例子,作者在CSDN中有详尽的笔记,可以当作springboot入门实践项目。对应域名white.ouou.com。
项目二:WordPress博客项目,用php开发的小型web项目,适合做个人博客。不是前后端分离架构。对应域名blog.ouou.com。
项目三:这里作为例子,显示Nginx默认首页。对应域名default.ouou.com。
服务器
服务器一:作为Nginx做转发的服务器,部署了WordPress项目,白卷的前端部分,和test项目
服务器二:作为后端服务器,部署了白卷的后端,仅接收api请求
服务器三:作为数据库服务器,安装了mysql
本文假设已经安装好所有软件环境,如果没有,可以参考附录
先看结果
ouou.com和blog.ouou.com到博客项目首页(目前我的真实个人博客地址https://www.ouou.ink,欢迎来访,.com域名太贵啦~)
white.ouou.com
default.ouou.com 就是lnmp环境下Nginx的首页
本文实验环境在虚拟机上进行,如果使用服务器,应该用真实域名绑定到服务器ip
首先在windows文件系统中找到hosts文件:C:\Windows\System32\drivers\etc\hosts
将4个域名绑定到服务器一的ip,要知道域名只能绑定到ip而不能指定端口
服务器一的ip ouou.com
服务器一的ip default.ouou.com
服务器一的ip blog.ouou.com
服务器一的ip white.ouou.com
首先看下通过lnmp工具安装好的Nginx的配置文件(之前为了快速搭建出WordPress而使用lnmp,与正常安装不会有太大差异,在此场景不受影响)
打开文件:
vim /usr/local/nginx/conf/nginx.conf
查看server部分:
server {
listen 80 default_server reuseport;
#listen [::]:80 default_server ipv6only=on;
server_name _;
index index.html index.htm index.php;
root /home/wwwroot/default;
....
}
listen 80,Nginx默认监听80端口,根目录 /home/wwwroot/default,当我们访问ouou.com时,会访问服务器中/home/wwwroot/default目录下的index文件。
之前写过一篇博客使用WordPress搭建个人博客,本文在此实现下继续做部署工作。通过搭建WordPress博客后,会生成一个wordpress项目,项目放到/home/wwwroot/下,与default目录同级,同时,我们创建white目录,将打包好的白卷前端项目,放到white目录内。
当然这个需求只有我个人需要,大可以创建一个wordpress的空目录,然后放置一个简单的index.html来完成实验。
为了使得顶级域名默认访问博客项目,将server中的root进行修改root /home/wwwroot/wordpress;
在nginx.conf文件下添加Server
server {
listen 8001;
server_name _;
root /home/wwwroot/white;
# 处理vue的history模式路由
location / {
try_files $uri $uri/ /index.html;
}
}
server {
listen 8002;
server_name _;
root /home/wwwroot/default;
}
保存文件,重启Nginx
nginx -s reload
首先测试是否能通过端口访问到项目,输入http://ouou.com:8001,http://ouou.com:8002,如果能访问到白卷和默认页,则表示成功。
经过这一步骤,实现Nginx监听不同端口,路由到不同的项目。接下来要做的事情是,判断请求的域名,根据域名转发到不同端口。
在**/usr/local/nginx/conf/vhost**下创建3个文件
default.ouou.com.conf
server {
listen 80; # 监听 80 端口
autoindex on;
server_name blog.ouou.com; # 判断域名
access_log /usr/local/nginx/logs/access.log combined;
index index.html index.htm index.jsp index.php;
if ( $query_string ~* ".*[\;'\<\>].*" ){
return 404;
}
location / {
proxy_pass http://127.0.0.1:80; # 反向代理到 80 端口
add_header Access-Control-Allow-Origin *;
}
}
blog.ouou.com.conf
server {
listen 80; # 监听 80 端口
autoindex on;
server_name white.ouou.com; # 判断域名
access_log /usr/local/nginx/logs/access.log combined;
index index.html index.htm index.jsp index.php;
if ( $query_string ~* ".*[\;'\<\>].*" ){
return 404;
}
location / {
proxy_pass http://服务器二ip:8001; # 反向代理到 8001 端口
add_header Access-Control-Allow-Origin *;
}
}
white.ouou.com.conf文件
server {
listen 80; # 监听 80 端口
autoindex on;
server_name default.ouou.com; # 判断域名
access_log /usr/local/nginx/logs/access.log combined;
index index.html index.htm index.jsp index.php;
if ( $query_string ~* ".*[\;'\<\>].*" ){
return 404;
}
location / {
proxy_pass http://127.0.0.1:8002; # 反向代理到 8002 端口
add_header Access-Control-Allow-Origin *;
}
}
再次重启Nginx。
每段大概的意思是通过监听80端口,因为每个域名一开始都是进入到80端口,判断域名内容,然后代理到对应的地方,反向代理地址不局限于同一个服务器。
再次使用二级域名访问即可。
白卷后端项目使用springboot框架开发,springboot自带Tomcat环境,可以通过maven打成jar包,在服务器二中安装好java环境,直接上传jar包,再通过命令java -jar xxx.jar运行即可。
在白卷前端项目中,需要将请求服务器ip改为服务器二的ip地址,并且做路由转发时,转发到服务器二的ip地址。
这没什么好说的,在springboot配置文件中将连接数据库的url改为服务器三的ip地址。指出来是因为之前都是用的本地开发调试,很少设计到远程链接mysql,如果连接远程mysql出问题,可以参考:远程链接MySQL报错
虽然三言两语就结束了篇文章,但是过程中遇到不少问题,个中苦涩滋味只有自己能体会,从中也收获了许多。
前路漫漫,依然要持续坚定地前行。
白卷
使用VMware安装CentOS7
使用WordPress搭建个人博客
CentOS手动安装JDK
CentOS7用yum方式安装MySQL
远程链接MySQL报错