最近在項目中需要使用PyV8,調用JS庫進行一些函數的處理,PyV8在Windows也就是我的開發環境下安裝異常順利,但是移植到Linux後各種報錯,而且我的測試機使用CentOS,而上線伺服器使用基于Debian的Docker,調試着實費了一番功夫,現将問題和解決方案整理。
目前實作環境:
作業系統:Docker Debian GNU/Linux 9 (stretch)
資料庫:mariaDB 10.2.7
Python版本:2.7 64位
PyV8版本:最新版,位址https://github.com/emmetio/pyv8-binaries/raw/master/pyv8-linux64.zip
目前一些小的問題:
1. PyV8如果實時調用,有一定機率直接崩潰,無論是Windows還是Linux都會這樣,主要表現在斷點調試過程中或調用逾時,Docker直接崩了,日志沒有記錄,但是如果使用緩存進行Cache就沒問題,若調用PyV8不同時調用浏覽器DOM則無問題,目前直接使用背景調用。
2. 在Linux上通過浏覽器請求同時多次調用PyV8會逾時,但是Windows請求或者背景直接請求則沒有問題,檢視資料未見異常,原因不明,如果把多次請求改成一次請求則可以,個人認為可能是多次請求鎖了檔案,但是增加sleep函數每次請求後暫停也不正常,目前隻能使用背景調用的方式。
PyV8在Docker中的安裝
網上有多種方式進行PyV8的安裝,無非以下幾種方式:
1. pip install安裝
2. 拷貝編譯好的PyV8的binary檔案到Python目錄,同時修改環境變量
3. 下載下傳源檔案,編譯安裝
在Docker中1肯定是行不通,各種報錯,3理論上可以,但是編譯報錯也很多,最好是使用編譯好的檔案,查詢Docker Hub有例子,直接wget後解壓然後拷貝,參考:
https://hub.docker.com/r/lolikiller/pyv8/~/dockerfile/
部分Dockerfile(已脫敏),注意标紅部分
FROM docker.xxx.domain:80/runtime/debian9/python
RUN apt-get install -y cron libldap2-dev gcc libsasl2-dev vim rsyslog libboost-all-dev aptitude scons libboost-python-dev wget unzip
RUN pip install pyldap \
&& pip install fluent-logger \
&& pip install gunicorn \
&& pip install bottle \
&& pip install requests \
&& pip install PyMySQL \
&& pip install mako \
&& pip install jinja2 \
&& pip install python-memcached \
&& pip install pandas \
&& pip install xlsxwriter \
&& pip install sqlalchemy \
&& pip install ipython==5.7.0 \
&& pip install altair \
&& pip install pdvega \
&& ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN wget https://github.com/emmetio/pyv8-binaries/raw/master/pyv8-linux64.zip \
&& unzip pyv8-linux64 \
&& cp _PyV8.so /usr/local/lib/python2.7/site-packages/ \
&& cp PyV8.py /usr/local/lib/python2.7/site-packages/
RUN apt-get clean \
&& apt-get autoclean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
EXPOSE 80
COPY src/xxx /build/
WORKDIR /build
CMD xxx
注意事項
PyV8使用涉及多個庫,注意apt-get install的标紅部分,wget和unzip主要是下載下傳源檔案用,其中pyv8對應的版本可自行修改,我的是Python64位, 下方标紅部分則是安裝方法,可見也是解壓後拷貝二進制檔案到Python第三方庫中。
至此配置全部完成,背景調用PyV8無任何問題。