簡介:
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也支持動靜態分離服務器。當需要的時候再來寫筆記配置動靜態分離。