2010-02-01 177 views
1

登錄到admin界面時,「登錄」按鈕被按下第一 時間,但按「後退」和「登錄再​​次失敗 - 記錄用戶在 成功Django管理認證失敗

我部署Django應用程序與zc.buildout在這裏,設置類似 這裏描述的內容http://www.meppum.com/2009/jan/17/installing-django-ubuntu-intrepid/。 Nginx(在127.0.0.1:8003上偵聽)超出Apache(在127.0.0.1:8001上偵聽 ),兩臺服務器的配置提供在 結尾的帖子我正在訪問我的django應用程序127.0.0.1:8003/。

所以,127.0.0.1:8003/admin/打開django admin登錄表單。 1)輸入用戶名/密碼,按「登錄」重定向到(出於某種未知原因?)127.0.0.1/ admin,因此沒有任何結果,因爲沒有服務器在80端口上監聽 。 HTTP跟蹤(後點擊登錄:http://127.0.0.1:8003/admin/

POST /admin/ HTTP/1.1 
Host: 127.0.0.1:8003 
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.17) Gecko/2010010604 Ubuntu/9.04 (jaunty) Firefox/3.0.17 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip,deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 300 
Connection: keep-alive 
Referer: http://127.0.0.1:8003/admin/ 
Cookie: JSESSIONID=0D287C17FBA82223AB7D5884EA534967; sessionid=c65c7af8ebde9e6bdf9c739a731d376b 
Content-Type: application/x-www-form-urlencoded 
Content-Length: 55 
username=to&password=password&this_is_the_login_form=1 

HTTP/1.x 302 FOUND 
Server: nginx/0.8.29 
Date: Mon, 01 Feb 2010 10:27:44 GMT 
Content-Type: text/html; charset=utf-8 
Connection: keep-alive 
Expires: Mon, 01 Feb 2010 10:27:44 GMT 
Vary: Cookie 
Etag: "d41d8cd98f00b204e9800998ecf8427e" 
Cache-Control: max-age=0 
Set-Cookie: sessionid=9db437da69c359136786696f90ba89f2; expires=Mon, 15-Feb-2010 10:27:44 GMT; Max-Age=1209600; Path=/ 
Last-Modified: Mon, 01 Feb 2010 10:27:44 GMT 
Location: http://127.0.0.1/admin/ 
Content-Length: 0 

2)按瀏覽器的後退,和「登錄」按鈕再次(或 按下瀏覽器的「返回」和「刷新」)日誌中成功地。 HTTP跟蹤:

POST /admin/ HTTP/1.1 
Host: 127.0.0.1:8003 
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.17) Gecko/2010010604 Ubuntu/9.04 (jaunty) Firefox/3.0.17 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip,deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 300 
Connection: keep-alive 
Referer: http://127.0.0.1:8003/admin/ 
Cookie: JSESSIONID=0D287C17FBA82223AB7D5884EA534967; sessionid=9db437da69c359136786696f90ba89f2 
Content-Type: application/x-www-form-urlencoded 
Content-Length: 55 
username=to&password=password&this_is_the_login_form=1 

HTTP/1.x 200 OK 
Server: nginx/0.8.29 
Date: Mon, 01 Feb 2010 10:52:02 GMT 
Content-Type: text/html; charset=utf-8 
Transfer-Encoding: chunked 
Connection: keep-alive 
Expires: Mon, 01 Feb 2010 10:52:02 GMT 
Vary: Cookie 
Etag: "3355a46fb32d7cb6ab21262c359d9eec" 
Cache-Control: max-age=0 
Last-Modified: Mon, 01 Feb 2010 10:52:02 GMT 

看起來這是一個cookie相關的問題,但是,我想,中 根本問題還不如位於apache的和/或nginx的配置爲好。

任何想法如何使管理員登錄表單立即工作?

乾杯!

P.S.configs:

apache的虛擬主機配置:

<VirtualHost *:8001> 

    <Directory /home/toinbis/Desktop/programming/project/runtime/ 
htdocs/django_wsgi/> 
     Order deny,allow 
     Allow from all 
    </Directory> 

    WSGIDaemonProcess tsd user=www-data group=www-data threads=25 
    WSGIProcessGroup tsd 

    WSGIScriptAlias//home/toinbis/Desktop/programming/project/ 
runtime/htdocs/django_wsgi/djproject.wsgi 

    LogLevel warn 
    ErrorLog /home/toinbis/Desktop/programming/project/runtime/logs/ 
apache_tsd_error.log 
    CustomLog /home/toinbis/Desktop/programming/project/runtime/logs/ 
apache_tsd_access.log combined 

    ServerName localhost 
</VirtualHost> 

nginx的配置:

daemon off; 
#user www-data; 
worker_processes 2; 

error_log /home/toinbis/Desktop/programming/project/runtime/logs/ 
nginx_general_error.log; 
pid  /home/toinbis/Desktop/programming/project/runtime/var/pids/ 
nginx.pid; 

events { 
    worker_connections 1024; 
    #server_names_hash_bucket_size: 128; 

} 

http { 
    include  /home/toinbis/Desktop/programming/project/runtime/ 
etc/nginx_conf/mime.types; 
    default_type application/octet-stream; 

    access_log /home/toinbis/Desktop/programming/project/runtime/logs/ 
nginx_access.log; 
    error_log /home/toinbis/Desktop/programming/project/runtime/logs/ 
nginx_error.log; 

    sendfile  on; 
    tcp_nopush  on; 

    #keepalive_timeout 0; 
    keepalive_timeout 2; 
    tcp_nodelay  on; 

    server_names_hash_bucket_size 128; 
    #server_name_hashes 128; 
    gzip on; 
    gzip_comp_level 2; 
    gzip_proxied any; 
    gzip_disable "MSIE [1-6]\.(?!.*SV1)"; #iš ubuntu 
    gzip_types text/plain text/css application/x-javascript text/xml 
application/xml application/xml+rss text/javascript; 

upstream backend { 
    server 127.0.0.1:8001; 

} 

server { 
      listen 8003; 
      server_name localhost; 

      error_log /home/toinbis/Desktop/programming/project/ 
runtime/logs/project_nginx_error.log; 
      access_log /home/toinbis/Desktop/programming/project/ 
runtime/logs/project_nginx_access.log; 

      location/{ 
         proxy_pass http://backend/; 
         include  /home/toinbis/Desktop/programming/ 
project/runtime/etc/nginx_conf/nginx_proxy_1.conf; 
      } 

      location /media/ { 
         root /home/toinbis/Desktop/programming/project/ 
src/tsd/core/; 
      } 

} 
} 

歡呼聲, 到

回答

1

@Eugene Morozov指出了問題的最終結果,但我認爲解決方案更深入。

返回的Location頭是不正確的:

Location: http://127.0.0.1/admin/ 

這顯然是缺失的端口號。不幸的是,很難確切地知道這是從哪裏來的。您可能會遇到Nginx或Apache自動更改Location標題。我建議你做下面的事情,看看問題出在哪裏:

  • 在你每次登錄前清除你的cookies,否則你可能會得到誤報。
  • 直接進入你的Apache實例,看看問題是否存在。
    • http://127.0.0.1:8001/admin/
    • 如果該位置頭不有它的端口:
      • 火了一些隨機端口Django開發服務器(8005爲例),看看問題是否仍然存在:
        • 如果問題仍然存在,那麼在您的代碼中。
        • 如果問題沒有持續存在,Apache可能會做些奇怪的事情,或者WSGI/Django沒有獲取確定端口號所需的全部信息。
          • 確保wsgi腳本和django應用程序都可以在環境中看到端口號。
    • 如果位置標頭中有一個端口:
      • Nginx的被汽提其關閉出於某種原因。
      • 嘗試將Apache從循環中刪除,您可能不需要它。
        • 啓動Django作爲FastCGI服務器,並將Nginx連接到Apache而不是Apache。
          • 這實際上會降低服務器上的一些開銷(較少的請求傳遞,額外的線程,內存使用等)。
          • 相當不錯的設置指南over here

忍者編輯!
不知道這是否會有所幫助,但Nginx似乎有一個選項可以忽略重定向中的端口號。該URL已經死了,所以我從over here上粘貼了這個。

http://wiki.codemongers.com/NginxHttpCoreModule#port_in_redirect

syntax: port_in_redirect [ on|off ] 
default: port_in_redirect on 
context: http, server, location 

指令允許或阻止端口在由 nginx的處理重定向 指示。

+0

哇,很好的回答!是「作爲FastCGI服務器啓動Django並將Nginx連接到Apache而不是Apache」。部署的全面報價?任何測試顯示可以通過使用fastcgi而不是apache_modwsgi保存多少開銷?會讓你知道問題的追蹤是怎麼回事。 – toinbis 2010-02-01 19:07:40

+1

我不知道任何基準,只是常識。如果你不需要,爲什麼要運行兩個完整的Web服務器? (假設你的項目不是很大,在這種情況下有理由這樣做。) – 2010-02-01 20:03:49

+0

Apache只能正常工作,沒關係,所以「Nginx由於某種原因將其剝離」是一個較低層次的原因。我深入瞭解nginx配置......再次感謝! – toinbis 2010-02-01 20:37:46

1

您的設置不正確。 Django的認爲,在端口運行在第一HTTP響應80.看這句話:

Location: http://127.0.0.1/admin/ 

不幸的是,我現在不能爲什麼會這樣理解。在這種情況下,我更願意使用調試器逐步完成相關的Django代碼。

+0

尤金,謝謝你的幫助。我現在正在嘗試調試...開發服務器似乎在相同的設置下運行良好... – toinbis 2010-02-01 16:45:25

1

Euge,詹姆斯,

非常感謝您的幫助再次!

解決方案竟然被描述爲here:將proxy_set_headerHost $host;更改爲proxy_set_headerHost $host:$server_port;訣竅!