Nignx 配置反向代理

解决问题:使用nignx完成http转https和二级域名转发,将已有http通信的web前端转为https,包括主域和一个二级域名,这两个domain解析到同一ip。
Nginx作用:
(1)HTTP静态服务器:存储图片,文件等静态资源
(2)负载均衡:当一台web服务器不够用时,需要添置一台web服务器,这时候就需要nginx来 做负载均衡,把浏览器的访问量以特定的规则分发到两台web服务器上。
(3)反向代理:正常情况下客户端直接访问服务器。反向代理是客户端请求nginx,nginx请求服务器,然后返回数据给客户端。
(4)虚拟主机:例如将www.aaa.comwww.bbb.com两个网站部署在同一台服务器上,两个域名解析到同一个IP地址,但是用户通过两个域名却可以打开两个完全不同的网站,互相不影响,就像访问两个服务器一样,所以叫两个虚拟主机。个域名解析同一个IP地址。用nginx做反向代理将对不同域名的请求分别转发到该IP的不同端口。

解决上面的问题,用到nginx反向代理,虚拟主机

Nginx安装:选择使用docker,一键部署。具体可参考博客:http://www.ruanyifeng.com/blog/2018/02/nginx-docker.html。在此使用nginx做反向代理而不是web服务器,所以只需要修改nginx配置,将配置文件映射到本地,不需要映射网页html文件。
Nginx配置:
实现功能:

以上可以实现的前提是DNS可以自动将domain解析到配置nginx的服务器ip上。

配置文件:

upstream upstream1 {  
    server 10.8.5.5:8888;  
    }   #upstream 实现负载均衡,可在此配置多个服务器
#------------http 重定向到https上----------------------
server {
    listen       80;
    server_name  aa.com;  #主域名
    return      301 https://$server_name; 重定向,浏览器向重定向后的地址重新请求
}

server {
    listen       80;
    server_name  bb.aa.com; #二级域名
    return      301 https://$server_name; 
}
#------------------------https设置反向代理-----------------------
server {
    listen 443 ssl http2;
    server_name  aa.com;  #主域名
    
   ssl                      on;
   ssl_certificate          /etc/nginx/certs/example.crt;   #证书位置
   ssl_certificate_key      /etc/nginx/certs/example.key;

    ssl_session_timeout  5m;

    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers   on;

    location / {
        proxy_pass  http://upstream1 ;
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        #proxy_buffer_size 64k;
        #proxy_buffers   32 32k;
        #proxy_busy_buffers_size 128k;

    }

}

server {
    listen 443 ssl http2;
    server_name  bb.aa.com; #二级域名
    
   ssl                      on;
   ssl_certificate          /etc/nginx/apicerts/example.crt;
   ssl_certificate_key      /etc/nginx/apicerts/example.key;

    ssl_session_timeout  5m;

    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers   on;

    location / {

        proxy_pass  https://10.8.5.5:5020/api/;  #被代理服务器地址

        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        #proxy_buffer_size 64k;
        #proxy_buffers   32 32k;
        #proxy_busy_buffers_size 128k;

    }

    location /swaggerui/ {#二级目录转发
            proxy_pass https://10.8.5.5:5020/swaggerui/;  需要转发的二级domain本身为https,
                # 该路径下为web页面的静态文件css,js等,不设置的话网页无法正常展示          
            proxy_set_header Host $host:$server_port;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
         }

    location /api/ {#二级目录转发

            proxy_pass  https://10.8.5.5:5020/api/;

            proxy_set_header Host $host:$server_port;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
            #proxy_buffer_size 64k;
            #proxy_buffers   32 32k;
            #proxy_busy_buffers_size 128k;
        }

}

至此,所有配置均已完成,启动命令:

docker container run   -d  \
-p 10.8.5.5:80:80 -p 10.8.5.5:443:443 \
--rm   \
--name mynginx \
--volume "/mnt/storage/nginx_docker_demo/conf":/etc/nginx  \
nginx

-d 后台运行
-p 容器80端口映射到10.8.5.5:80
-- rm 停止运行后删除容器文件
-- name 自定义容器名称
-volumn nginx配置文件映射
Bingo Bingo ~~~~
docker ps 可以查看正在运行的容器,可以发现已经启动成功。

番外:配置过程中遇到的一些其他问题:
1.ssl 证书 ,我用的是openssl申请的免费版证书,只能用于一个domain,对二级domain无效(貌似免费的都是这样),因此在nginx配置的时候分别配置,制定各自证书,否则可以配置到一起。配置方法如下:

server {
   listen 443 ssl http2;
    server_name  *.aa.com;  #此处设置为泛域名
    
   ssl                      on;
   ssl_certificate          /etc/nginx/certs/example.crt;  ##一定是相同的证书
   ssl_certificate_key      /etc/nginx/certs/example.key;

   ssl_session_timeout  5m;

   ssl_ciphers HIGH:!aNULL:!MD5;
   ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
   ssl_prefer_server_ciphers   on;

   if ($http_host ~* "^(.*?)\.aa\.com$") {    
                set $domain $1;                    
       }

   location / {
    if ($domain ~* "bb") {
              proxy_pass  https://10.8.5.5:5020/api/;#匹配到子域名时设置相应的转发  
            }
    proxy_pass  http://upstream1;#默认情况,也就是主域名时相应的转发
    proxy_set_header Host $host:$server_port;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
    }
  1. 配置子域名时有些特殊,web页面是flask-restplus框架中封装的swagger UI,本来也是http通信,按照主域名的配置后,静态的页面找不到css,js文件。找到这些文件所在路径后在nginx中添加二级目录可以解决。


    文件路径

    此时又出现了另外一个问题,swagger读某些json文件时为http,这样就产生了https和http混合通信,无法正常工作。在网上找了些解决办法,都不生效。干脆在flask-restplus配置为https,这样就全部是https通信了,修改的代码在此记录下:

###需要安装模块  pip install pyOpenSSL
if __name__ == '__main__':
    from werkzeug.contrib.fixers import ProxyFix
    initialize_app(app)
    app.wsgi_app = ProxyFix(app.wsgi_app) #手动修复代理
    app.run(threaded=True, host='0.0.0.0', port=5020 ,ssl_context='adhoc')#此处一定是adhoc,使用python模块自动生成的证书
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,776评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,527评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,361评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,430评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,511评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,544评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,561评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,315评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,763评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,070评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,235评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,911评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,554评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,173评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,424评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,106评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,103评论 2 352

推荐阅读更多精彩内容

  • 清晨,练笔 摄影是素描书上的作品,照着画,不是很传神。 骑行是我非常喜欢的一部电影 大家猜猜 最好不要猜出来 因为...
    一云快乐画画的猫阅读 403评论 4 4
  • 这个周末有快乐,有幸运,也有痛苦,但此时此刻我的内心确实很煎熬,很自责,我很后悔。 周五打不到回武义的顺风车,小宝...
    你的云云阅读 322评论 0 0
  • 干什么都不能着急,最简单的就说这个小孩儿吧。每天半夜回家我就不说什么了,从来也不顾及别人的感受,别人睡觉的时候她的...
    不会游泳的小鱼鱼阅读 208评论 0 0
  • 天开始转凉了,至今孤独的你是否在考虑谈场恋爱来御寒呢 彷惶无助的时候,一句安慰的话就可以夺走你的芳心 朋友既然...
    暖心小屋阅读 142评论 0 1