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

簡介:

IP有限,因此咱們之前使用端口來區分不一樣的虛擬主機,提供不一樣的WEB服務。html

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

這個時候咱們能夠使用DNS,域名解析,畢竟記名字比記IP和端口好記。linux

可是,不想可是也得可是,咱們之前使用的一部分端口是沒辦法解析的。nginx

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

繼續可是,IIS是微軟家的技術,我最近部署的都是python+flask,IIS能支持麼?數據庫

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

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

能夠使用Nginx的反向代理功能。後端

我使用的是DOCKER技術,部署docker,部署apache,部署tomcat。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 當中註釋掉這兩行便可。

六:小結

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

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

聽說nginx也支持mail服務器,也就是說不只支持http和https,是否支持ftp?ssl?就須要查資料或作實驗了。

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

相關文章
相關標籤/搜索