在公司接手了個微信項目,因爲微信環境下訪問網站須要使用對外開放的域名,因此有相關問題,都是直接運維同事幫忙處理。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其實挺好玩的,有很預置變量,不懂的去搜下文檔,基本都能解決。 重在實踐吧!