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也支持动静态分离服务器。当须要的时候再来写笔记配置动静态分离。