我想要在共享主機上部署應用程序。它使用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 flask
,pip install sqlalchemy
,pip install psycopg2
手動安裝的依賴關係。 ..)。由於該應用程序在沒有apache/fcgi的情況下工作,我認爲python應用程序中的所有內容都已正確設置。
Apache(2.2)使用mod_fcgid和suexec。難道是apache會通過一些環境變量或其他東西強迫一個不同的libpg.so?
你如何將項目部署到遠程? – hd1
@ hd1 python文件通過scp手動複製。 apache是全局安裝的(2.2版本),使用mod_fcgid和suexec(這樣fcgi腳本就可以用用戶權限執行)。我沒有使用apache或fcgi進行驗證,所以如果我缺少重要信息,請告訴我。 – syntonym