【本人禿頂程式設計師】nginx反向代理轉發apache配置 之 cookie去哪兒了?
←←←←←←←←←←←← 我都禿頂了,還不點關注!
在公司接手了個微信專案,由於微信環境下訪問網站需要使用對外開放的域名,所以有相關問題,都是直接運維同事幫忙處理。
原理是這樣:
方案一:
將域名解析指向測試伺服器的地址;
開放相關埠訪問許可權;
方案二:
將域名解析指向內網測試伺服器的某一臺;(也方便用於測試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、監聽埠問題?
根據需要設定監聽相應埠,注意埠不能衝突了!
寫在最後:
禿頂程式設計師的不易,看到這裡,點了關注吧!
點關注,不迷路,持續更新!!!