2015-08-31 32 views
0

我想要在共享主機上部署應用程序。它使用psycopg2,並通過flipflop通過apache作爲fcgi應用進行部署。在測試或手動調用時,即使在生產服務器上,一切都可以正常工作。這意味着我能做到在生產服務器上執行以下操作:如果通過fcgi調用psycopg2錯誤

$ source env/bin/activate 
$ python myapp.py 
>>> from myapp import Post 
>>> Post.query.all() 
[<Post1>, <Post2>, ...] 

但是,如果通過Apache服務器,以通過FCGI訪問(例如訪問mysite.com/all_posts這是爲了顯示所有的職位)的阿帕奇拋出一個500和下面的錯誤是記錄:

ImportError: /home/syntonym/project/env/lib/python3.4/site-packages/psycopg2/_psycopg.cpython-34m.so: undefined symbol: lo_truncate64 

的psycopg2常見問題有一個提示:

如果消息報告未定義的符號:lo_truncate64這意味着Psycopg與大的物體64建成比特API支持(即在編譯時使用的libpq至少爲9.3),但是在運行時找到一個較舊的libpq動態庫。

,避免這一問題:

您可以使用: $ ldd /path/to/packages/psycopg2/_psycopg.so | grep libpq 找到什麼是在運行時使用libpq的動態庫。

您可以通過在安裝時使用相同版本的pg_config和運行時使用libpq來避免此問題。

$ ldd /home/syntonym/project/env/lib/python3.4/site-packages/psycopg2/_psycopg.cpython-34m.so | grep libpq 
libpq.so.5 => /package/host/localhost/postgresql-9.3/lib/libpq.so.5 (0x00007fc4f7b30000) 
$ pg_config 
LIBDIR = /package/host/localhost/postgresql-9.3.2-1/li2b 

我也試圖編譯psycopg2與LD_LIBRARY_PATH="/package/host/localhost/postgresql-9.3.2-1/lib"ldd然後顯示與pg_config完全相同的庫,但同樣的錯誤仍然存​​在。

的fgci腳本如下:

#!/home/syntonym/project/env/bin/python3.4 

import sys 
sys.path.insert(0, "/home/syntonym/project") 
print(sys.path) 

from flipflop import WSGIServer 
from myapp import app 

if __name__ == "__main__": 
    WSGIServer(app).run() 

我自己的文件(myapp.py)通過SCP複製,我在虛擬ENV通過PIP(pip install flaskpip install sqlalchemypip install psycopg2手動安裝的依賴關係。 ..)。由於該應用程序在沒有apache/fcgi的情況下工作,我認爲python應用程序中的所有內容都已正確設置。

Apache(2.2)使用mod_fcgid和suexec。難道是apache會通過一些環境變量或其他東西強迫一個不同的libpg.so?

+0

你如何將項目部署到遠程? – hd1

+0

@ hd1 python文件通過scp手動複製。 apache是​​全局安裝的(2.2版本),使用mod_fcgid和suexec(這樣fcgi腳本就可以用用戶權限執行)。我沒有使用apache或fcgi進行驗證,所以如果我缺少重要信息,請告訴我。 – syntonym

回答

0

suexec不承載任何環境變量。一種解決方案是使另一個FCGI腳本和源極的bashrc:

#!/etc/bin/env bash 
source path/to/home/.bashrc 
exec real_fcgi_script 

或插入路徑手動libpg(即在python經由ENVIRON)。

0

如果您有C代碼(包括psycopg2),只需簡單地複製python文件將不起作用。作爲解決類似的問題,你可以使用純Python pg8000或:

  1. 使用virtualenv env創建virtualenv
  2. 在所說的virtualenv中安裝psycopg2 - env/bin/pip install psycopg2
  3. 生成requirements.txt - env/bin/pip freeze > requirements.txt
  4. 複製requirements.txt到您的部署服務器,如果你使用版本控制,你應該也檢查這個文件。
  5. 在部署服務器上重複步驟1,而不是步驟2,鍵入pip install -r requirements.txt
  6. 在virtualenv中執行您的Python腳本./env/bin/python foo.py

希望有所幫助。如果您還有其他問題,請留下評論。

+0

對不起,我說的是不完整的。我只通過scp複製了我的燒瓶應用程序,然後我用'python -m venv env'創建了一個virtualenv,然後我手動安裝了我的需求(輸入'source env/bin/activate'' pip install flask' ...'pip安裝psycopg2')。之後沒有解決,我得到了[psycopg2的源代碼](http://initd.org/psycopg/download/),並通過'python setup.py make'和'python setup.py install'來自venv的python)。錯誤仍然是一樣的。 – syntonym

+0

這需要添加到您的問題 – hd1