本文介紹了利用nginx實現多域名和多站點的綁定的方法及相關注意事項。您也能夠只看標題或紅色標註部分。☺node
咱們常常會遇到在同一臺服務器創建多個Web站點的狀況,廣泛的作法是爲不一樣的站點配置不一樣的端口,這樣就能夠用IP:Port的形式訪問。python
可是用IP訪問畢竟不方便,不生動,不容易記憶。那麼,咱們能夠給每一個站點綁定不一樣的域名。(在這裏咱們僅談公網狀況)即便咱們只有一個域名,咱們能夠設置多個二級域名,使用Nginx很容易實現。nginx
一般,網上教程會直接貼一段配置文件的代碼,告訴咱們如此這般就Ok了。但我發現不少新手看着教程配置,並不能像博主那樣就Success了,因此接下來咱們談一下基本原理。瀏覽器
首先,要有一個本身能管理的域名,好比我有一個 postmsg.cn 的域名,就能夠生出多個子域名,二世三世千萬世……緩存
其次,有一臺能訪問的公網服務器,能夠在這臺服務器上創建本身的Web站點,一個兩個三四個,對應端口不一。服務器
而後,就是域名和站點的綁定,一個蘿蔔一個坑,固然也能夠多個蘿蔔一個坑……app
須要配置的地方有兩個,咱們先談首要先決條件,也是有些新手容易忽略的地方。tcp
(1)域名配置post
把域名的A記錄解析指向咱們的公網服務器,這一點通常人都能想到。解析的時候只能加IP,是不能帶端口號的,即只能使用默認的80端口。(不討論域名轉發)阿里雲
若想實現子域名綁定,在域名解析的時候必須配置合理。不然只靠Nginx是不行的。
例如我要把子域名 p.postmsg.cn 綁定到 服務器的 8001端口,我首先要保證訪問 p.postmsg.cn 的請求能到達該服務器,而後Nginx才能處理。
此時,要麼在域名A記錄解析里加一條 p 的主機記錄,要麼主機記錄裏有通配符 * 的配置(*.postmsg.cn的訪問所有解析到對應的服務器,慎用),只設置@和www確定是不行的。
圖1 - 域名解析示例
(2)主機配置
域名的請求到達主機以後,一切才能夠交給Nginx來處理。
修改Nginx配置的時候,能夠直接在默認配置文件(例如/etc/nginx/nginx.conf,如如下代碼片斷所示)裏修改,也能夠在某個目錄下新建獨立的配置文件,而後 include 這個目錄下的配置文件(如第17行所示)。
http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; include /etc/nginx/conf.d/*.conf; }
這是Nginx讀取配置文件的格式,咱們的配置一般寫在 http { } 塊裏,加上 server 塊,在server塊裏配置。剛纔也說了,server塊能夠寫在一個單獨文件裏,在nginx.conf裏包含該文件,同時,支持嵌套 include。
接下來看一下 server 塊的寫法:
server { listen 80; server_name p.postmsg.cn; location / { proxy_pass http://127.0.0.1:8008; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } #access_log logs/p_access.log; }
這裏的 server_name 對應配置的域名,proxy_pass對應代理的真實地址。
(3)注意事項一
必定要把 80 端口留給負責代理的Nginx。咱們能夠在一個服務器上同時使用Apache httpd,Nginx,Tomcat,可是域名解析只能使用默認的80端口,負責代理的同志要拿到第一手請求。
(4)注意事項二
即時生效性。有的朋友感受本身配置的都對,也重啓服務了,可就是看不到想要的結果。這裏有三個方面的可能因素。
➀ 域名解析生效時間。阿里雲的域名最低生效時間是10分鐘,有時候可能大於這個值。
➁ 本地DNS緩存。可在CMD使用 ipconfig /flushdns 命令刷新本地DNS緩存。
➂ 瀏覽器緩存。這個可能纔是最不容易發現的,尤爲是谷歌瀏覽器。F12以後,右鍵左上角地址欄邊上的刷新按鈕,點擊清空緩存並硬性從新加載。
➃ 服務未重啓。service nginx restart 有時候可能沒有先 stop, 再 start 好用。
本文閒扯了利用Nginx實現多域名代理的相關事宜。
若您發現本文所述有失偏駁之處,或有待改進之處,或您有其它想法、意見及建議,請在評論區留言,謝謝!