nginx反向代理轉發apache配置 之 cookie去哪兒了?


  在公司接手了個微信項目,由於微信環境下訪問網站需要使用對外開放的域名,所以有相關問題,都是直接運維同事幫忙處理。

  原理是這樣:

    方案一:

      1. 將域名解析指向測試服務器的地址;

      2. 開放相關端口訪問權限;

    方案二:

      1. 將域名解析指向內網測試服務器的某一台;(也方便用於測試https證書問題)

      2. 由該台服務器轉發服務到相應需要的測試服務器;

      3. 開發本台測試服務器及轉發的測試服務器的端口權限;

  最初,我們使用第一種方案,但是每次都要麻煩好幾組的同事一起處理,才能搞定,因此啟用了方案二。開了一台中轉服務器,搭建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其實挺好玩的,有很預置變量,不懂的去搜下文檔,基本都能解決。 重在實踐吧!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM