サイトのアクセス解析で 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に新しいのが入ってるみたいなので、
で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 | 
と同じエラーがでる。
現実は厳しい。挑戦は続く。
- 続き

 
     
     
     
     
     
     
     
     
    