サイトのアクセス解析で AWStats をずっと使っていたが、Google Analytics に比べると、余り詳しくないので、別のツールをさがしていたところ、Matomo というオープンソースのものが良さそうだったので、入れてみることにした。前身は Piwik という名称で、Google Analytics はここから派生しているとのこと。PHP と MySQL で稼働する。
インストールはスムーズに行えた。で、Apache のログを食わせようとしたところで問題発生。
1 2 3 4 5 |
% python import_logs.py --url=https://{url} --recorders=4 --enable-http-errors --enable-http-redirects --enable-static --enable-bots /home/michaeluno/log/{log file name} ...(省略)... Fatal error: [Errno 8] _ssl.c:507: EOF occurred in violation of protocol You can restart the import of "/home/{user name}/log/{log file name}" from the point it failed by specifying --skip=0 on the command line. |
エラーメッセージで調べてみると cURL のバージョンに問題があるらしい。以下のモンキーパッチで対応可能とのことだが、import_logs.py の import ssl
をの箇所を書き換えても同じ。
1 2 3 4 5 6 7 8 9 10 11 |
import ssl from functools import wraps def sslwrap(func): @wraps(func) def bar(*args, **kw): kw['ssl_version'] = ssl.PROTOCOL_TLSv1 return func(*args, **kw) return bar ssl.wrap_socket = sslwrap(ssl.wrap_socket) |
Python のバージョンは 2.7.6.
1 2 3 |
% python --version Python 2.7.6 |
で、Python が使用している OpenSSL のバージョンを調べると 0.9.8zf で コマンドで使える OpenSSL は 1.0.2o となっており、Python に関連付けられている OpenSSL のバージョンが古い。
1 2 3 4 5 |
% python -c 'import ssl; print(ssl.OPENSSL_VERSION)' OpenSSL 0.9.8zf 19 Mar 2015 % openssl version OpenSSL 1.0.2o 27 Mar 2018 |
ということで、Python をアップグレードしてみる。2018/11/06 時点で最新は 3.7.1 のようだ。
こちらのサイトを参考にして進めてみる。そのままコンパイルするとやはり SSL 関係のエラーが出る模様。なので OpenSSL からコンパイルする必要がありとのこと。
OpenSSL のコンパイル
現時点での最新版は 1.1.1.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
% mkdir $HOME/tmp % cd $HOME/tmp % wget https://www.openssl.org/source/openssl-1.1.1.tar.gz % tar xvf openssl-1.1.1.tar.gz % cd openssl-1.1.1 % mkdir $HOME/local % ./config --prefix=$HOME/local/openssl Operating system: amd64-whatever-freebsd Configuring OpenSSL version 1.1.1 (0x1010100fL) for BSD-x86_64 Using os-specific seed configuration Creating configdata.pm Creating Makefile ********************************************************************** *** *** *** If you want to report a building issue, please include the *** *** output from this command: *** *** *** *** perl configdata.pm --dump *** *** *** ********************************************************************** % make install ...(omit)... /home/{user name}/local/openssl/share/doc/openssl/html/man7/bio.html /home/{user name}/local/openssl/share/doc/openssl/html/man7/crypto.html /home/{user name}/local/openssl/share/doc/openssl/html/man7/ct.html /home/{user name}/local/openssl/share/doc/openssl/html/man7/des_modes.html /home/{user name}/local/openssl/share/doc/openssl/html/man7/evp.html /home/{user name}/local/openssl/share/doc/openssl/html/man7/ossl_store-file.html /home/{user name}/local/openssl/share/doc/openssl/html/man7/ossl_store.html /home/{user name}/local/openssl/share/doc/openssl/html/man7/passphrase-encoding.html /home/{user name}/local/openssl/share/doc/openssl/html/man7/scrypt.html /home/{user name}/local/openssl/share/doc/openssl/html/man7/ssl.html /home/{user name}/local/openssl/share/doc/openssl/html/man7/x509.html % |
そしてパスを通す。.cshrc
の
1 2 |
set path = (/sbin /bin /usr/sbin /usr/bin /usr/local/sbin /usr/local/bin $HOME/bin) |
を
1 2 |
set path = ($HOME/local/openssl/bin /sbin /bin /usr/sbin /usr/bin /usr/local/sbin /usr/local/bin $HOME/bin) |
に変更し、リログイン。そしてバージョンをみてみると、
1 2 3 |
% openssl version Shared object "libssl.so.1.1" not found, required by "openssl" |
むむ。エラー。libssl.so.1.1 は $HOME/local/openssl/lib/libssl.so.1.1 にある。のに読めていない。
こちら を参考に、
1 2 |
./config --prefix=$HOME/local --openssldir=$HOME/local/openssl/ssl --libdir=lib shared zlib-dynamic -Wl,-R,$HOME/local/openssl/lib -Wl,--enable-new-dtags |
で make すると
1 2 3 4 5 6 7 8 9 |
enc.c:(.text+0xfc7): undefined reference to `BIO_f_zlib' *** [apps/openssl] Error code 1 Stop in /home/{user name}/tmp/openssl-1.1.1. *** [all] Error code 1 Stop in /home/{user name}/tmp/openssl-1.1.1. |
と出る。ちょっと諦めて、すでにインストールされている openssl を指定で Python のコンパイルきないか試してみる。
Python 3.7.1 のコンパイル
こちらを参考に進めていく(3.6だけど)。
1 2 3 4 |
% wget https://www.python.org/ftp/python/3.7.1/Python-3.7.1.tgz % tar xvf Python-3.7.1.tgz % cd Python-3.7.1 |
Modules/setup.dist
1 2 |
#_socket socketmodule.c |
をアンコメント
1 2 3 4 5 |
#SSL=/usr/local/ssl #_ssl _ssl.c \ # -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \ # -L$(SSL)/lib -lssl -lcrypto_ |
をアンコメントし SSL=/usr/local/ssl はそのままにしておく。OpenSSLの個別コンパイルは諦めたので、予め入ってるのを使う。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
% ./configure --prefix=$HOME/local % make ... (omit) ... gcc -pthread -c -fno-strict-aliasing -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -O2 -pipe -std=c99 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -I. -I./Include -DPy_BUILD_CORE -o Programs/_testembed.o ./Programs/_testembed.c gcc -pthread -Wl,--export-dynamic -o Programs/_testembed Programs/_testembed.o libpython3.7m.a -lutil -L/usr/local/ssl/lib -lssl -lcrypto -lm sed -e "s,@EXENAME@,/home/{user name}/local/bin/python3.7m," < ./Misc/python-config.in >python-config.py LC_ALL=C sed -e 's,\$(\([A-Za-z0-9_]*\)),\$\{\1\},g' < Misc/python-config.sh >python-config % make install ... File "/home/{user name}/tmp/Python-3.7.1/Lib/ctypes/__init__.py", line 7, in <module> from _ctypes import Union, Structure, Array ModuleNotFoundError: No module named '_ctypes' *** [install] Error code 1 Stop in /home/{user name}/tmp/Python-3.7.1. |
んー。”ModuleNotFoundError: No module named ‘_ctypes'”で検索すると、libffi-devel
が無いのが原因とのこと。(参考)
こちらのサイトで、
さくらレンタルサーバでは普通にpythonをbuildすると古いopensslにつながってしまうようです。
/usr/local/sslに新しいのが入ってるみたいなので、
1 ./configure CPPFLAGS="-I/usr/local/ssl/include" LDFLAGS="-L/usr/local/ssl/lib"でpythonを作るとよさそうです。
(source: https://kuratsuki.net/archives/1253)
とのことなので、
1 2 3 4 |
% ./configure --prefix=$HOME/local/ CPPFLAGS="-I/usr/local/ssl/include" LDFLAGS="-L/usr/local/ssl/lib" % make % make install |
としてみるも、
1 2 3 4 5 6 7 8 |
... (omit) File "/tmp/tmpga2xugon/pip-10.0.1-py2.py3-none-any.whl/pip/_internal/download.py", line 39, in <module> File "/tmp/tmpga2xugon/pip-10.0.1-py2.py3-none-any.whl/pip/_internal/utils/glibc.py", line 3, in <module> File "/home/{user name}/tmp/Python-3.7.1/Lib/ctypes/__init__.py", line 7, in <module> from _ctypes import Union, Structure, Array ModuleNotFoundError: No module named '_ctypes' *** [install] Error code 1 |
と同じエラーがでる。
現実は厳しい。挑戦は続く。
- 続き