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
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便可。
運行
docker-compose -f nginx.yaml up -d
這樣就配置好了,在你操做的工做站訪問linux的IP,就能看到nginx啓動成功以下:
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便可
運行
docker-compose -f apache.yaml up -d
這樣就配置好了,在你操做的工做站訪問linux的IP:8080,就能看到apache啓動成功以下:
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
docker-compose -f tomcat.yaml up -d
這樣就配置好了,在你操做的工做站訪問linux的IP:8081,就能看到apache啓動成功以下:
已知nginx的配置文件爲
/etc/nginx/nginx.conf
在linux執行
docker cp nginx:/etc/nginx/nginx.conf ./nginx.conf
便可將nginx的配置文件從docker容器中複製到linux宿主機的當前文件夾。
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,是剛纔配置的被代理服務器的自定義名字和協議。
咱們修改了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
有以下幾個地址須要測試:
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 了。
因爲咱們在每一個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也支持動靜態分離服務器。當須要的時候再來寫筆記配置動靜態分離。