1. 程式人生 > >【本人禿頂程式設計師】nginx反向代理轉發apache配置 之 cookie去哪兒了?

【本人禿頂程式設計師】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、監聽埠問題?

根據需要設定監聽相應埠,注意埠不能衝突了!

寫在最後:

禿頂程式設計師的不易,看到這裡,點了關注吧!
點關注,不迷路,持續更新!!!