nginx反向代理转发apache配置 之 cookie去哪儿了?

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> nginx反向代理转发apache配置 之 cookie去哪儿了?

作者:等你归去来
链接:www.cnblogs.com/yougewe

在公司接手了个微信项目,由于微信环境下访问网站需要使用对外开放的域名,所以有相关问题,都是直接运维同事帮忙处理。

原理是这样:

方案一:
  • 将域名解析指向测试服务器的地址;
  • 开放相关端口访问权限;
  • 方案二:
  • 将域名解析指向内网测试服务器的某一台;(也方便用于测试https证书问题)
  • 由该台服务器转发服务到相应需要的测试服务器;
  • 开发本台测试服务器及转发的测试服务器的端口权限;
  • 最初,我们使用第一种方案,但是每次都要麻烦好几组的同事一起处理,才能搞定,因此启用了方案二。开了一台中转服务器,搭建nginx服务,指向了我们当前测试的一台服务器,其间,遇到的问题。运维同事没时间,交给我们自己来搞。好嘛,遇到问题了。

    问题1、无法找到相应项目问题?

    因为nginx只负责将请求转发到该台机器的80或其他端口上了,并没有仔细配置,因此无法找到对应的项目。 解决:在apache 中添加相应vhost配置,示例如下:

    
    VirtualHost *:80
      DocumentRoot /www/web/madmin/public_html
      #ServerName admin.123.com
      #ServerAlias 10.8.0.1
      ServerName 192.168.1.212
      ErrorDocument 400 /errpage/400.html
      ErrorDocument 403 /errpage/403.html
      ErrorDocument 404 /errpage/404.html
      #php_admin_value open_basedir /www/web/madmin:/tmp
      IfModule mod_deflate.c
        DeflateCompressionLevel 7
        AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-httpd-php
        AddOutputFilter DEFLATE css js html htm gif jpg png bmp php
      /IfModule
    /VirtualHost
    Directory /www/web/mo123/ccww
      Options FollowSymLinks
      AllowOverride All
      Order allow,deny
      Allow from all
    /Directory
    

    这样,服务器就能正常解析项目了。

    问题2、转发过来后,客户端ip获取不到了,得到的只是一个代理服务器ip。

    因为涉及到转发,所有的东西都是可能丢掉的,在这里,就需要将原始IP转发过来,如下:

    
    upstream apache {
        server 127.0.0.1:80;
        keepalive 8;
    }
    
    upstream k_api {
        server 172.17.0.27:8080;
        keepalive 8;
    }
    
    server {
            listen 8091;
            server_name admin.123.com;
    
            location /api {
                    proxy_pass http://k_api;
                    proxy_set_header Host $host;    #域名转发
                    proxy_redirect off;
                    proxy_set_header X-Real-IP $remote_addr;  #IP转发
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_connect_timeout 60;
                    proxy_read_timeout 600;
                    proxy_send_timeout 600;
            }
    
            location / {
                    proxy_pass http://apache/h5/;    #转发到服务器后,加相对目录地址
                    proxy_set_header Host $host;
                    proxy_redirect off;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_connect_timeout 60;
                    proxy_read_timeout 600;
                    proxy_send_timeout 600;
            }
    }
    
    问题3、使用nginx代理后,一直无法登录,经排查为cookie无法保存?

    这个问题困扰了我很久,也找了运维同事请教了很久,始终无法解决。最终,花了很多时间去找资料,自己做了许多尝试,终于发现了。 原来是服务器时间差的问题,nginx服务器的时区设置为 EST,apache服务器的时区设置是 CST,其时区相差8小时。

    所以cookie无效了。具体原理就是,登录后会在apache所在服务器设置cookie,有效期为1小时内有效,而转到nginx后,时间却往前了8小时,因此服务器(或者是客户认为)会认为该cookie是过期的,因此不会被保存起来了。

    解决:更改nginx时区和时间,和apache一致。修改时间时区的命令如下:

    
    #修改时间
    date -s 12:12:12 # 时间改为了 12:12:12
    date -s 20170112 # 日期更改为2017/01/12
    date -s ”12:12:12 2017-01-00“ # 时间改为了2017-01-00 12:12:12
    
    #修改时区
    tzselect    #根据提示修改成相应时区
    
    问题4、监听端口问题?

    根据需要设置监听相应端口,注意端口不能冲突了!

    nginx其实挺好玩的,有很预置变量,不懂的去搜下文档,基本都能解决。 重在实践吧!

    关注后端技术精选,每天推送优质好文

    nginx反向代理转发apache配置 之 cookie去哪儿了?
    本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

    本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

    原文链接:blog.ouyangsihai.cn >> nginx反向代理转发apache配置 之 cookie去哪儿了?