Nginx 反向代理 一個IP代理多個域名,不區分端口,類似windows虛擬機。


簡介:

IP有限,所以我們以前使用端口來區分不同的虛擬主機,提供不同的WEB服務。

小范圍還湊活,一旦規模擴大,地址記不住了吧?端口記不住了吧?

這個時候我們可以使用DNS,域名解析,畢竟記名字比記IP和端口好記。

但是,不想但是也得但是,我們以前使用的一部分端口是沒辦法解析的。

好吧,有用過IIS的同學會考慮,用虛擬主機,綁定域名即可。多個域名解析到相同的IP,使用相同的IP,由IIS根據訪問域名來決定使用哪個虛擬主機來相應這個請求。

繼續但是,IIS是微軟家的技術,我最近部署的都是python+flask,IIS能支持么?

不過我已經過渡到linux+docker來部署了。這時候有什么辦法來實現類似IIS的虛擬主機功能呢?

同一個IP地址,使用不同的訪問域名來使用不同的主機來相應請求。

可以使用Nginx的反向代理功能。

我使用的是DOCKER技術,部署docker,部署apache,部署tomcat。

一:環境安裝

1.安裝linux。

2.安裝docker。

3.安裝docker-compose。

全略

二:docker安裝Nginx

1.配置nginx.yaml

version: "3" #版本3
services: #服務
  nginx:   #服務名
    image: nginx:stable-alpine   #鏡像名稱
    privileged: true  #高級權限
    tty: true         #開一個終端
    container_name: nginx  #自定義容器名
    restart: always
    networks:       #網絡
    - et_net         #屬於網絡mynet
    ports:          #開放端口映射
    - 80:80     #冒號左邊是宿主機開放端口,冒號右邊是容器開放端口
    #volumes:
    #- ./nginx.conf:/etc/nginx/nginx.conf:ro
    #command: [nginx-debug, '-g', 'daemon off;'] #映射mariadb的數據庫文件存儲路徑,冒號左邊是宿主機路徑,冒號右邊是容器內路徑
networks:  #關於網絡的服務
  et_net:   #聲明網絡mynet

以上內容保存為nginx.yaml即可。

2.啟動nginx

運行

docker-compose -f nginx.yaml up -d

3.測試nginx

這樣就配置好了,在你操作的工作站訪問linux的IP,就能看到nginx啟動成功如下:

 

 

三:docker安裝apache

1.配置apache.yaml

version: "3" #版本3
services: #服務
  apache:   #服務名
    image: httpd:alpine  #鏡像名稱
    privileged: true  #高級權限
    tty: true         #開一個終端
    container_name: apache1  #自定義容器名
    restart: always
    networks:       #網絡
    - et_net         #屬於網絡et_net
    ports:          #開放端口映射
    - 8080:80     #冒號左邊是宿主機開放端口,冒號右邊是容器開放端口
networks:  #關於網絡的服務
  et_net:   #聲明網絡mynet

  以上內容保存為apache.yaml即可

2.啟動apache

運行

docker-compose -f apache.yaml up -d

3.測試訪問apache

這樣就配置好了,在你操作的工作站訪問linux的IP:8080,就能看到apache啟動成功如下:

四:docker安裝tomcat

1.配置tomcat.yam

version: "3" #版本3
services: #服務
  tomcat:   #服務名
    image: tomcat  #鏡像名稱
    privileged: true  #高級權限
    tty: true         #開一個終端
    container_name: tomcat  #自定義容器名
    restart: always
    networks:       #網絡
    - et_net         #屬於網絡mynet
    ports:          #開放端口映射3306-->3306
    - 8081:8080     #冒號左邊是宿主機開放端口,冒號右邊是容器開放端口
networks:  #關於網絡的服務
  et_net:   #聲明網絡mynet

2.啟動tomcat

docker-compose -f tomcat.yaml up -d

3.測試tomcat

這樣就配置好了,在你操作的工作站訪問linux的IP:8081,就能看到apache啟動成功如下:

 

 

五:配置Nginx

1.復制nginx配置文件模板

已知nginx的配置文件為

/etc/nginx/nginx.conf

在linux執行

 docker cp nginx:/etc/nginx/nginx.conf ./nginx.conf

即可將nginx的配置文件從docker容器中復制到linux宿主機的當前文件夾。

2.修改nginx配置文件

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    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;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
	
	upstream s1.local {
				 server apache;
	}

	upstream s2.local {
				 server tomcat:8080;
	}

	server {
		listen       80;
		server_name  s1.local;
		index  index.html index.htm;
		location / {
			proxy_set_header   Host             $host;
			proxy_set_header   X-Real-IP        $remote_addr;
			proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
			proxy_pass http://s1.local;
		}
	}
	
	server {
		listen       80;
		server_name  s2.local;
		index  index.html index.htm;
		location / {
			proxy_set_header   Host             $host;
			proxy_set_header   X-Real-IP        $remote_addr;
			proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
			proxy_pass http://s2.local;
		}
	}
}

  

紅色部分是添加進去的。

upstream s1.local {
				 server apache;
	}

這一部分是定義一組被代理的服務器信息,upstream  和  server 是固定格式。

s1.local 是自定義的名字,apache是apache容器的名字  

upstream s2.local {
				 server tomcat:8080;
	}

  定義s2.local,是tomcat的服務器信息。

 

重點:定義被代理的服務器,直接定義被代理的容器的名字,如果默認端口是80,那么定義被代理的服務器時不需要定義端口,如果默認端口不是80,才需要定義端口。

查看端口有兩個方法:1,到hub.docker.com查看說明。2,直接不配置端口,運行容器,用docker ps -a 看運行狀態,也可以看到默認端口是多少。

 

server {
		listen       80;
		server_name  s2.local;
		index  index.html index.htm;
		location / {
			proxy_set_header   Host             $host;
			proxy_set_header   X-Real-IP        $remote_addr;
			proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
			proxy_pass http://s2.local;
		}
	}

  這是定義監聽端口和監聽域名,指向被代理服務器的。

s2.local是監聽的域名,即訪問這個域名,則用這條配置信息來指向某個被代理的服務器。

http://s2.local,是剛才配置的被代理服務器的自定義名字和協議。

3.重啟nginx

我們修改了Nginx.conf配置文件,而且文件時在linux宿主機,不在容器里面。

需要修改一下啟動配置文件重啟才能生效。

 #volumes:
 #- ./nginx.conf:/etc/nginx/nginx.conf:ro

  第一次的nginx.yaml當中注釋掉了這兩行,取消注釋即可。

意思時把宿主機的nginx.conf 映射到nginx容器當中,並且只讀。

nginx.yaml   和   nginx.conf 在同一個目錄下就可以了。

首先關閉原來的nginx

docker-compose -f nginx.yaml down

再重新啟動nginx 

docker-compose -f nginx.yaml up -d

4.測試訪問

有如下幾個地址需要測試:

apache:   IP:8080

tomcat:    IP:8081

nginx:      IP

訪問這三個地址,確認三個容器都是工作正常的。

編輯host文件

增加

192.168.1.4 s1.local
192.168.1.4 s2.local

即將  s1.local  和  s2.local  解析到linux服務器去。部署的時候應該去改寫DNS服務器。

然后就可以訪問   s1.local  和 s2.local 了。

五:關閉apache和tomcat的外部端口

由於我們在每個yaml當中都定義了 et_net 這個虛擬網絡。並且在配置Nginx時,對被代理服務器的定義也使用了docker內部虛擬網絡。

那么我們可以關閉apache和tomcat的外部端口。

剛開始開放apache和tomcat的外部端口,是為了對容器工作狀態進行測試。

服務器還是開的端口越少越好。

ports:          #開放端口映射3306-->3306
 - 8081:8080     #冒號左邊是宿主機開放端口,冒號右邊是容器開放端口

在apache.yaml  和  tomcat.yaml 當中注釋掉這兩行即可。

六:小結

在Listen ip:port; 這個指令行中,加參數default

這個server端就會是這個ip的默認站點。

server {
        listen       80 default;

 

至此我們已經實現了一個nginx根據訪問域名不同,反向代理到不同的后端服務器去。

需要注意的是,proxy_pass http://s2.local;  這行配置時包含了http協議名稱,要根據你后台被代理的服務器來配置協議。

據說nginx也支持mail服務器,也就是說不僅支持http和https,是否支持ftp?ssl?就需要查資料或做實驗了。

nginx也支持動靜態分離服務器。當需要的時候再來寫筆記配置動靜態分離。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM