nginx實現(xiàn)單主機多域名映射的項目實踐
最近遇到的一個小問題,記錄了一下解決過程,寫出來分享給大家。
背景
因為前段時間買了騰訊云3年的云服務器,準備偶爾寫點后臺代碼放上去。正好最近也在計劃寫個小程序,用這個云服務器作為后臺。但是微信小程序必須要求使用已經(jīng)備案的域名和80端口,但是只有一臺云服務器,一個80端口,如果我想用這臺云服務器作為多個小程序的后臺,那就不能滿足需求了。
想著要是能夠?qū)⒍鄠€子域名都解析到我的云服務器上,然后再通過不同的子域名映射到我云服務器的不同端口,這樣,對外看起來是多個子域名并且是80端口,但是其實背后只有一臺云服務器。
本來也就是想想,正好有個好朋友最近也遇到了這個需求,就直接準備搞一下,找找具體的解決方法。
解決方案
剛開始的想法是這樣的,在我的云服務器上裝個Tomcat,然后將Tomcat監(jiān)聽端口從8080改為80。然后自己寫個Java Web的程序,接受所有發(fā)到80端口的請求,然后再獲得請求的子域名,根據(jù)不同的子域名轉(zhuǎn)發(fā)請求到不同的內(nèi)部服務的其他端口。但是感覺自己寫,可能沒法很好地處理,造成性能很低,遂作罷。
然后又上網(wǎng)找了一下其他方案,然后發(fā)現(xiàn)了nginx。nginx是一個高性能的HTTP反向代理服務器,關(guān)于它的介紹,這里不再贅述,大家可以自行搜索資料了解。這里的nginx服務器可以通過配置,監(jiān)聽80端口,并且可以將80端口的請求根據(jù)不同的子域名轉(zhuǎn)發(fā)到不同的內(nèi)部端口,正好滿足了我的需求,所以選定了nginx來實現(xiàn)。
具體實施
下面來實戰(zhàn)演示整個過程。
演示環(huán)境
云服務器使用的是Ubuntu16.04
安裝nginx服務器
使用下面的命令安裝nginx。
sudo apt install nginx
配置nginx服務器
在安裝完nginx服務器以后,nginx的配置文件在/etc/nginx/nginx.conf
,然后我么看到這個配置文件中有這樣的一段內(nèi)容。
http { #...... include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; }
說明nginx的默認配置文件中包含加載了這兩個目錄下的配置文件,所以我們可以在/etc/nginx/conf.d/
這個目錄下創(chuàng)建以.conf
結(jié)尾的文件,在里面配置我們的個性化配置就ok了。
所以我們在/etc/nginx/conf.d/
這個目錄下使用vi創(chuàng)建a.conf
和b.conf
來分別表示我們需要解析映射的兩個子域名。然后在這兩個文件中分別寫入下面的內(nèi)容。
server { listen 80; server_name a.codekong.cn; location / { proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-Ip $remote_addr; proxy_set_header X-NginX-Proxy true; proxy_pass http://127.0.0.1:3000/; proxy_redirect off; } }
其實我們需要關(guān)注的就兩行內(nèi)容,下面這一行是表示你要映射處理的子域名,我這里是a.codekong.cn
server_name a.codekong.cn;
還有就是下面這行用來表示你將這個子域名的請求轉(zhuǎn)發(fā)到服務器的哪個端口進行處理,這里是3000
這個端口。
proxy_pass http://127.0.0.1:3000/;
同樣的,我們再配置一下將b.codekong.cn
的請求轉(zhuǎn)發(fā)到服務器內(nèi)部的4000
這個端口,配置文件如下:
server { listen 80; server_name b.codekong.cn; location / { proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-Ip $remote_addr; proxy_set_header X-NginX-Proxy true; proxy_pass http://127.0.0.1:4000/; proxy_redirect off; } }
這樣就配置好了。
配置域名解析
下面我們開始配置子域名的解析,分別添加a.codekong.cn
和b.codekong.cn
兩個子域名的解析到我自己的云服務器,入下圖所示:
我這里解析配置完后緩存會在10分鐘后失效,也就是域名解析會在10分鐘后生效,大家依據(jù)自己的配置來定。
安裝NodeJS
到上面這一步其實我們就已經(jīng)成功了,但是我們下面可以使用NodeJs寫一段程序來驗證一下,所以必須先按照下面的命令按照NodeJs。
sudo apt install nodejs sudo apt install nodejs-legacy sudo apt install npm
執(zhí)行完上面的命令就安裝好了Node環(huán)境,為我們下一步測試做好了準備。
測試驗證
我們使用Node來寫一段最簡單的程序來驗證一下,程序如下:
var http = require('http'); http.createServer(function (request, response) { response.writeHead(200, {'Content-Type': 'text/plain'}); response.end('Hello World I am from A server\n'); }).listen(3000); // 終端打印如下信息 console.log('Server running at http://127.0.0.1:3000/');
var http = require('http'); http.createServer(function (request, response) { response.writeHead(200, {'Content-Type': 'text/plain'}); response.end('Hello World I am from B server\n'); }).listen(4000); // 終端打印如下信息 console.log('Server running at http://127.0.0.1:4000/');
然后我們先使用下面的命令啟動nginx監(jiān)聽80端口
sudo service nginx start
然后我們再使用Node啟動我們上面的那段測試代碼
node servera.js
然后訪問http://a.codekong.cn
就可以看到瀏覽器輸出響應了。然后測試一下另一個子域名也是可以正常響應的。
到這里,我們就已經(jīng)成功使用nginx實現(xiàn)了單主機多域名映射了。
遇到的問題
整個的探索過程中也遇到了一下問題,這里記錄一下。
- nginx啟動失敗,報下面的錯誤信息
Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details.
這個最可能的原因是80端口被其他程序占用了,可以使用下面的命令查看占用80端口的程序的名稱和PID
sudo lsof -i:80
然后輸出下面的信息
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME apache2 18472 root 3u IPv4 12682582 0t0 TCP *:http (LISTEN) apache2 18475 www-data 3u IPv4 12682582 0t0 TCP *:http (LISTEN) apache2 18476 www-data 3u IPv4 12682582 0t0 TCP *:http (LISTEN)
可以看出我這里是apache占用了80端口,所以可以使用命令吧apache停止了即可,也可以使用下面的命令直接把進程殺死
sudo kill -9 [進程PID]
- nginx報啟動失敗
這次端口沒被占用,報錯依然是下面的信息
Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details.
看不出原因就按錯誤提示使用下面的命令查看詳細的報錯信息
sudo systemctl status nginx.service
輸出信息如下:
nginx.service - A high performance web server and a reverse proxy server Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled) Active: failed (Result: exit-code) since Wed 2018-09-12 01:07:34 CST; 16s ago Process: 18137 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=exited, status=0/SUCCESS) Process: 18616 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=1/FAILURE) Process: 22450 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=1/FAILURE) Main PID: 22563 (code=exited, status=0/SUCCESS) Sep 12 01:07:34 VM-163-140-ubuntu systemd[1]: Starting A high performance web server and a reverse proxy server... Sep 12 01:07:34 VM-163-140-ubuntu nginx[22450]: nginx: [emerg] socket() [::]:80 failed (97: Address family not supported by protocol) Sep 12 01:07:34 VM-163-140-ubuntu nginx[22450]: nginx: configuration file /etc/nginx/nginx.conf test failed Sep 12 01:07:34 VM-163-140-ubuntu systemd[1]: nginx.service: Control process exited, code=exited status=1 Sep 12 01:07:34 VM-163-140-ubuntu systemd[1]: Failed to start A high performance web server and a reverse proxy server. Sep 12 01:07:34 VM-163-140-ubuntu systemd[1]: nginx.service: Unit entered failed state. Sep 12 01:07:34 VM-163-140-ubuntu systemd[1]: nginx.service: Failed with result 'exit-code'.
然后在錯誤信息里面看到了下面這句
nginx: [emerg] socket() [::]:80 failed (97: Address family not supported by protocol)
第一反應是IPV6的問題,想起來因為上次在云服務器上安裝docker,IPV6存在問題,直接把云服務器的IPV6禁用了,而nginx是默認同時支持IPV4和IPV6協(xié)議的,所以我禁用了IPV6就會報錯,所以處理辦法是禁用掉nginx的IPV6。
但是nginx的IPV6配置在哪里修改呢,看一下我們最開始展示的/etc/nginx/nginx.conf
這個配置文件中的下面這樣
include /etc/nginx/sites-enabled/*;
我們在這個目錄下發(fā)現(xiàn)了一個叫default
的鏈接文件,它的鏈接信息可以通過ls -al
查看,信息如下:
default -> /etc/nginx/sites-available/default
然后我們打開這個文件,看到里面的內(nèi)容是這樣的
server { listen 80 default_server; listen [::]:80 default_server; }
其中第二行就是對IPV6的支持,直接注釋了,重新啟動nginx即可。
總結(jié)
到此這篇關(guān)于nginx實現(xiàn)單主機多域名映射的項目實踐的文章就介紹到這了,更多相關(guān)nginx 單主機多域名映射內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
云服務器使用寶塔搭建Python環(huán)境,運行django程序
本文詳細講解了在云服務器使用寶塔搭建Python環(huán)境,運行django程序的方法。對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-12-12使用Nginx為自己的網(wǎng)站資源加上防盜鏈保護實現(xiàn)
這篇文章主要為大家介紹了使用Nginx為自己的網(wǎng)站資源加上防盜鏈保護實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08Nginx日志中request_time和upstream_response_time區(qū)別
Nginx日志中的request_time和upstream_response_time是關(guān)鍵的性能指標,本文就來介紹一下Nginx日志中request_time和upstream_response_time區(qū)別,具有一定的參考價值,感興趣的可以了解一下2024-11-11使用Nginx實現(xiàn)301跳轉(zhuǎn)至https的根域名示例代碼
這篇文章主要介紹了使用Nginx實現(xiàn)301跳轉(zhuǎn)至https的根域名,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-04-04服務器使用Nginx部署Springboot項目的詳細教程(jar包)
這篇文章主要介紹了服務器使用Nginx部署Springboot項目的詳細教程(jar包),本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07