背景:同個域名下的三個子域名各自綁定了一個項目,每個項目都在自己的tomcat裏運行,而且這三個tomcat都在同一個服務器上。
- www.portal.a.com
- www.blog.a.com
- www.backadmin.a.com
需求:都通過瀏覽器默認的80端口訪問。
問題:我們知道,服務器只有一個80端口,正常情況下一個tomcat會佔用80端口,導致其他監聽不了。
解決方案:Nginx
我們可以更改tomcat監聽的端口,比如tomcat01監聽81,tomcat02監聽82,tomcat03監聽83,然後通過Nginx來監聽80端口,通過server_name的匹配,將請求轉發給各個tomcat
嘗試一:
server {
listen 80;
server_name app.miniguo77.com;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:3000;
}
}
server {
listen 80;
server_name demo.miniguo77.com;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:3001;
}
}
這是在網站找的資料,配置看起來沒什麼問題,但是我在嘗試的時候,發現每次請求都被轉發到第一個server那裏去。我也不知道具體原因是什麼,有知道的大神麻煩在下面的評論講解講解。於是有了嘗試二。
嘗試二:
# 監聽80端口,根據二級域名,動態進行轉發
server{
listen 80;
server_name *.a.cn;
if ( $http_host ~* "^(.*?)\.a\.cn" ) {
set $domain $1;
}
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
if ( $domain ~* "portal" ) {
proxy_pass http://www.portal.a.cn:81;
}
if ( $domain ~* "blog" ) {
proxy_pass http://www.blog.a.cn:82;
}
if ( $domain ~* "backadmin" ) {
proxy_pass http://www.backadmin.a.cn:83;
}
# proxy_pass http://www.a.cn:84;
}
}
這樣就可以通過表達式,動態地匹配二級域名,三級域名也是以此類比。