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

     

  • 相关阅读:
    Debug和Release区别
    C语言程序_管理系统
    读书的学问
    御姐的含义
    进制的英文书写
    CHM文件无法打开的解决方法
    819代码
    点击链接不跳转或刷新
    MS SqlServer 随机查询并随机排序
    Html背景图
  • 原文地址:https://www.cnblogs.com/jackadam/p/11582121.html
Copyright © 2020-2023  润新知