在公司接手了个微信项目,因为微信环境下访问网站须要使用对外开放的域名,因此有相关问题,都是直接运维同事帮忙处理。php
原理是这样:css
方案一:html
1. 将域名解析指向测试服务器的地址;nginx
2. 开放相关端口访问权限;web
方案二:apache
1. 将域名解析指向内网测试服务器的某一台;(也方便用于测试https证书问题)api
2. 由该台服务器转发服务到相应须要的测试服务器;服务器
3. 开发本台测试服务器及转发的测试服务器的端口权限;微信
最初,咱们使用第一种方案,可是每次都要麻烦好几组的同事一块儿处理,才能搞定,所以启用了方案二。开了一台中转服务器,搭建nginx服务,指向了咱们当前测试的一台服务器,其间,遇到的问题。运维同事没时间,交给咱们本身来搞。好嘛,遇到问题了。cookie
问题一、没法找到相应项目问题?
由于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>
,这样,服务器就能正常解析项目了。
问题二、转发过来后,客户端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; } }
问题三、使用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 #根据提示修改为相应时区
问题四、监听端口问题?
根据须要设置监听相应端口,注意端口不能冲突了!
nginx其实挺好玩的,有很预置变量,不懂的去搜下文档,基本都能解决。 重在实践吧!