オタク日記
(Mac と Linux, 2018Q4)

目次

2018-11-07 (Wed): 宅外サーバ (その 2)—Apache+mod_wsgi
2018-10-31 (Wed): 宅外サーバ (その 1)—Ubuntu-18.04

古い日記:
2018Q3   2018Q2   2018Q1  
2017Q4   2017Q3   2017Q2   2017Q1  
2016Q4   2016Q3   2016Q2   2016Q1  
2015Q4   2015Q3   2015Q2   2015Q1  
2014Q4   2014Q3   2014Q2   2014Q1  
2013Q4   2013Q3   2013Q2   2013Q1  
2012 年   2011 年   2010 年   2009 年   2008 年   2007 年  
2006 年   2005 年   2004 年   2003 年   2002 年   2001 年


2018-11-07 (Wed): 宅外サーバ (その 2)—Apache+mod_wsgi

さて、サーバ機能を digoc02 から、digoc03 に移すのであるが、 そのうちウェブサイト (httpd = Apache) を移すのは簡単だろう、と思っていた。 が、Django + mod_wsgi がからむと、そうは問屋が……

とは言え、18.04 は Python-3.6 がディフォルトであるので、大分楽になっている。

PyVenv で Djnago + mod_wsgi

なにはともあれ、venv を整えなければいけない。既にやっている (ssh の設定を アプリ名でやるために) が、ここで

fukuda@digoc03:~% sudo apt install python3-venv, python3-dev, apache2, apache2-dev
fukuda@digoc03:~% sudo apt install libapache2-mod-wsgi-py3

が済んでいる事が大前提。(libapache2-.... は先週の記事から漏れていた。) これから

fukuda@digoc03:~% python3 -m venv pve36
fukuda@digoc03:~% cd pve36
fukuda@digoc03:~/pve36% . bin/activate
(pve36) fukuda@digoc03:~/pve36% cat requirements.in
django
mod-wsgi
ipython
numpy
matplotlib
simplejson
(pve36) fukuda@digoc03:~/pve36% pip-compile 
.....
django==2.1.3
ipython-genutils==0.2.0   # via traitlets
ipython==7.1.1
.....
matplotlib==3.0.1
mod-wsgi==4.6.5
numpy==1.15.4
.....
(pve36) fukuda@digoc03:~/pve36% pip-sync
.....
Successfully installed django-2.1.3 numpy-1.15.4 prompt-toolkit-2.0.7 pyparsing-2.3.0 

無事、iPython も django, mod-wsgi もインストールできているようだ。 (先の libapache2-mod-wsgi-py3 が欠けていると、pip-compile でエラーとなるが、その error message からは、このモジュールが欠けている事は想像がつかない……)

さらにここで、mod_wsgi の言わば dev server である mod_wsgi-express を使って動作確認をしておく。

(pve36) fukuda@digoc03:~/pve36% mod_wsgi-express start-server   
Server URL         : http://localhost:8000/
Server Root        : /tmp/mod_wsgi-localhost:8000:1000
Server Conf        : /tmp/mod_wsgi-localhost:8000:1000/httpd.conf
Error Log File     : /tmp/mod_wsgi-localhost:8000:1000/error_log (warn)
Request Capacity   : 5 (1 process * 5 threads)
Request Timeout    : 60 (seconds)
Startup Timeout    : 15 (seconds)
Queue Backlog      : 100 (connections)
Queue Timeout      : 45 (seconds)
Server Capacity    : 20 (event/worker), 20 (prefork)
Server Backlog     : 500 (connections)
Locale Setting     : en_US.UTF-8

ここで、waremo.mine.nu:8000 にアクセスすると、 下のような表示が得られて mod_wsgi のインストール・設定を確認できる:

mod_wsgi testing on digoc03
mod_wsgi-express を使って、mod_wsgi をテスト

CPU, Network 性能

ここで、iPython も入った事だし、ちょっとパフォーマンスを確かめておく。

(pve36) fukuda@digoc03:~% wget http://www.python.org/ftp/python/3.6.2/Python-3.6.2.tar.xz
URL transformed to HTTPS due to an HSTS policy
.....
Python-3.6.2.tar.xz.6     100%[===================================>]  16.12M  --.-KB/s    in 0.1s    
.....
2018-11-01 10:57:09 (146 MB/s) - ‘Python-3.6.2.tar.xz.6’ saved [16907204/16907204]
(pve36) fukuda@digoc03:~/pve36% ipython
Python 3.6.6 (default, Sep 12 2018, 18:26:19) 
Type 'copyright', 'credits' or 'license' for more information
IPython 7.1.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import numpy as np                                                                            

In [2]: A = np.random.rand(1024, 1024)                                          

In [3]: %timeit B = np.linalg.inv(A)            
92.7 ms ± 4.41 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [4]: %timeit C = np.fft.fft2(A)           
60.3 ms ± 1.55 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
(pve36) fukuda@falcon:~% ping waremo.mine.nu                         
PING waremo.mine.nu (178.128.88.253): 56 data bytes
64 bytes from 178.128.88.253: icmp_seq=0 ttl=50 time=80.492 ms
64 bytes from 178.128.88.253: icmp_seq=1 ttl=50 time=79.828 ms
64 bytes from 178.128.88.253: icmp_seq=2 ttl=50 time=79.728 ms
64 bytes from 178.128.88.253: icmp_seq=3 ttl=50 time=85.569 ms
64 bytes from 178.128.88.253: icmp_seq=4 ttl=50 time=80.900 ms
64 bytes from 178.128.88.253: icmp_seq=5 ttl=50 time=79.828 ms
64 bytes from 178.128.88.253: icmp_seq=6 ttl=50 time=79.489 ms
^C
--- waremo.com ping statistics ---
7 packets transmitted, 7 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 79.489/80.833/85.569/1.986 ms

これらを digioc02 と比較しておく。

CPU/Network 性能比較
Droplet linalg.inv()
(ms)
fft.fft2()
(ms)
Transfer Rate
(Mbps)
Turnaround Time
(ms)
digoc02145 8231179.6 ± 1.5
digoc0392.7 60.3 113979.5 ± 2.0
digoc04146 61.3115279.7 ± 2.4

ちなみに、digoc04 は、当初採用しようとしていた "2 GB / 50 GB Disk /SGP1" で、$10/Mo. これだけ見ていると waremo.com なんかには、これで十分だったかな、と。

wrm_dms2

Django-2.x 用の Waremo DMS (wrm_dms2) は、github から取って来る。 一方、db.sqlite3files/(upload したファイル) は、現行のサーバ(waremo.com)から rsync で取ってくる。

fukuda@digoc03:~% git clone https://github.com/waremo/wrm_dms2.git 
fukuda@digoc03:~% sudo rsync -Cuav \
     fukuda@waremo.com:wrm_dms2/db.sqlite3 wrm_dms2/    #1)
fukuda@digoc03:~% ls -l wrm_dms2/db.sqlite3 
-rw-rw-r-- 1 fukuda www-data 12561408 Nov  6 00:07 wrm_dms2/db.sqlite3
fukuda@digoc03:~% sudo rsync -Cuav \
     fukuda@waremo.com:wrm_dms2/index/files/ wrm_dms2/index/files
fukuda@digoc03:~% recent wrm_dms2/index/files          #2)
total 1198432
-rw-r--r-- 1 www-data www-data   193341 Nov  4 03:31 WAD-ART18-0023_A.pdf
-rw-r--r-- 1 www-data www-data 37814372 Nov  2 08:48 WAD-TEM18-0004_A.pdf
-rw-r--r-- 1 www-data www-data 15749940 Nov  2 08:47 WAD-TEM18-0004_A.tar.xz
-rw-r--r-- 1 www-data www-data  1008891 Oct 31 08:01 WAD-ART18-0022_A.tar.gz
-rw-rw-r-- 1 fukuda   fukuda    2024709 Oct 31 02:00 WAD-ART18-0005_A.pdf
  1. #1) sudo で super-user permission を与え、waremo.com には fukuda でログインする……waremo.com が root の login を許さない条件の下で、owner:group を保存するためにこうした。
  2. #2) files/ 下に、これらのファイルを持ってくる方法によって、 permission と owner:group が区々になっている。

ここまでで、「ポーティング」は完了、data base (db.sqlite3) を

fukuda@digoc03:~/wrm_dms2% . ../pve36/bin/activate
(pve36) fukuda@digoc03:~/wrm_dms2% python manage.py makemigration
Unknown command: 'makemigration'. Did you mean makemigrations?
Type 'manage.py help' for usage.
(pve36) fukuda@digoc04:~/wrm_dms2% python manage.py makemigrations
Migrations for 'index':
  index/migrations/0002_auto_20181106_1828.py
    - Alter field cannot_delete on document
    - Alter field current on document
    - Alter field date_issued_temp on document
    - Alter field is_public on document
(pve36) fukuda@digoc03:~/wrm_dms2% python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, index, sessions, users
Running migrations:
  Applying index.0002_auto_20181106_1828... OK
(pve36) fukuda@digoc03:~/wrm_dms2% python manage.py runserver 0:8000
Performing system checks...

System check identified no issues (0 silenced).
November 06, 2018 - 18:30:46
Django version 2.1.3, using settings 'mysite.settings'
Starting development server at http://0:8000/
Quit the server with CONTROL-C.
[06/Nov/2018 18:36:03] "GET / HTTP/1.1" 200 12135
[06/Nov/2018 18:36:03] "GET /static/default.css HTTP/1.1" 200 4284
[06/Nov/2018 18:36:03] "GET /static/favicon.ico HTTP/1.1" 200 1150

この時、http://dms.waremo.mine.nu:8000 にアクセスすると、下のようなレスポンスが得られる。

wrm_dns2 on digoc03
digoc03 上の Django dev-server による wrm_dns2

Apache2

上記までで、Django App の wrm_dms2 と、mod_wsgi がどちらもちゃんと動いている事が確認できたので、wrm_dms2 を mod_wsgi と apache2 を使って公開する設定にかかる。

あらましは:

これらをより確実に指定できるように、pip install した mod_wsgi モジュールは、そのためのコマンド mod_wsgi-express を持っていて、 それによって

(pve36) fukuda@digoc03:~/pve36% mod_wsgi-express module-config
LoadModule wsgi_module \
    "/home/fukuda/pve36/lib/python3.6/site-packages/mod_wsgi/server/\
    mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so"
WSGIPythonHome "/home/fukuda/pve36"

この結果を用いて、mod_wsgi.so を変更し、また wrm_dms2.conf を作製する。

(pve36) fukuda@digoc03:/etc/apache2% cat mods-available/wsgi.load 
#LoadModule wsgi_module /usr/lib/apache2/modules/mod_wsgi.so
LoadModule wsgi_module /home/fukuda/pve36/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so
(pve36) fukuda@digoc03:/etc/apache2% cat sites-available/wrm_dms2.conf 
<VirtualHost *:80>
  ServerName dms.waremo.com
  ServerAlias dms.waremo.mine.nu               #1)
  WSGIScriptAlias / /home/fukuda/wrm_dms2/mysite/wsgi.py
#  WSGIApplicationGroup %{GLOBAL}
  WSGIDaemonProcess dms.waremo.com\            #2)
     python-path=/home/fukuda/wrm_dms2:/home/fukuda/pve36/lib/python3.6/site-packages
  WSGIProcessGroup dms.waremo.com
  Alias /static/ /home/fukuda/wrm_dms2/htdocs/
  Alias /favicon.ico /home/fukuda/wrm_dms2/htdocs/img/favicon.ico
  <Directory /home/fukuda/wrm_dms2/htdocs>
   	 Require all granted
  </Directory>
  <Directory /home/fukuda/wrm_dms2/mysite >
    <Files wsgi.py>
      Require all granted
    </Files>
  </Directory>
	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>
(pve36) fukuda@digoc03:/etc/apache2% sudo a2enmod wsgi
(pve36) fukuda@digoc03:/etc/apache2% sudo a2ensite wrm_dms2
(pve36) fukuda@digoc03:/etc/apache2% sudo systemctl reload apache2
  1. #1) テスト用の server name はここに書いておくと、 他を一切触らなくても、dms.waremo.com からもアクセスが可能に
  2. #2) 一応、wsgi を daemon-mode で働かせているつもり……未確認

こうしておいて、http://dms.waremo.mine.nu:80 にアクセスすると、 上の図のような表示が得られる筈。 さらに、DynDNS で、waremo.com を digoc03 の IP address に向けると、http://dms.waremo.com で wrm_dns2 にアクセスできるようになる。

この間、10 日程実稼働させているが、特に問題は見付かっていない。


2018-10-31 (Wed): 宅外サーバ (その 1)—Ubuntu-18.04

かつては、自宅サーバを立ち上げ、それをメンテナンスする事に血道を上げていた…… 最初は自作の PC Linux と Red Hat だったが、後には何代かの ThinkPad に Ubuntu に移行した。 それはそれで面白かったし勉強にもなったが、 いかんせん時間を食い過ぎ——主に H/W の問題に悩まされた。

DigitalOcean VPS 讃

なんとかせねば、という事で、思い立ったのが、自宅サーバを、宅外サーバ (VPS) に移す事。これで、少くとも H/W にかける手間暇はかなり省けるだろうと目論んだのだった。

大まかには

  1. VPS は DigitalOcean: 2GB/40GB の "droplet" で $20/Mo. 月間の最大データ転送量は、2TB で、それを超えると、 追加料金となるが、残念ながらそれを請求される事は終ぞなかった。
  2. OS は Ubuntu の LTS: Ubuntu 14.04/16.04 LTS. 2 年間はその版を使い続ける。

という方針。やってみたら、誠に具合が良い。

とまあ、殆んど「絶賛」…… :-) でも、それなら、そのまま使い続ければ良いようなものだが、 そうは行かないのがオタクの性で……で、無理に cons を挙げると

という事で、どうしても droplet を作り直さねばならぬ。:-)

新 droplet で、Ubuntu-18.04 LTS を立ち上げる

という訣で、やっぱり DigitalOcean の VPS を使い続ける。 DigitalOcean の Droplet -> Create -> Create Cloud Server の画面に沿って、あらましを示すと

ここに、

  1. #1) 半額の 2GB/1CPU, 50GB にする予定だったが、つい……
  2. #2) 従来通り、Singapore のサイトにした。
  3. #3) ここで SSH Key (local host の id_rsa.pub ) を書き込んでおけば、(仮パスワードのメールでのやりとり無しに) droplet 立ち上げ後、いきなりログインできる筈であるが、 実際には
    .  fukuda@falcon:~% ssh root@178.128.xxx.xxx
      root@178.128.xxx.xxx: Permission denied (publickey). 
    となり、何度やっても上手く行かない。 なので従来通りここを空欄にして、最初は password login で始める。
  4. #4) これが hostname となる。

このページで、[Create] ボタンを押すと、30 秒前後で droplet がインストールされて走り始める。

digoc03 on DigitalOcean
新 droplet, digoc03

最初のログインと初期設定

このサイトはいずれ waremo.com となるのであるが、暫定的に DynDNS にて、waremo.mine.nu を割り当てておく。

同時に、初期 password が登録メールアドレスへ送られてくるので、 次のようにして、root と user の password を設定する。

fukuda@falcon:~% ssh root@waremo.mine.nu
root@waremo.mine.nu's password:
You are required to change your password immediately (root enforced)
Welcome to Ubuntu 18.04.1 LTS (GNU/Linux 4.15.0-36-generic x86_64)
Changing password for root.
(current) UNIX password: 
Enter new UNIX password: 
Retype new UNIX password: 
root@digoc03:~# apt update
root@digoc03:~# apt upgrade
root@digoc03:~# adduser fukuda 
root@digoc03:~# adduser fukuda sudo
root@digoc03:~# exit

ここで、さらに user でログインして、環境設定:

fukuda@falcon:~% ssh fukuda@waremo.mine.nu
fukuda@digoc03:~$ sudo apt install zsh lv apache2 apache2-dev python3-dev python3-venv emacs-nox
fukuda@digoc03:~$ scp otacky.jp:.zshrc .
fukuda@digoc03:~$ rsync -Cuav otacky.jp:.emacs.d .
fukuda@digoc03:~$ chsh fukuda
Password: 
Changing the login shell for fukuda
Enter the new value, or press ENTER for the default
	Login Shell [/bin/bash]: /bin/zsh
fukuda@digoc03:~$ zsh
fukuda@digoc03:~% 

firewall と ssh 設定

fukuda@digoc03:~% sudo ufw limit OpenSSH
fukuda@digoc03:~% sudo ufw enable
fukuda@digoc03:~% sudo ufw allow "Apache Full"
fukuda@digoc03:~% sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    LIMIT       Anywhere                  
Apache Full                ALLOW       Anywhere                  
OpenSSH (v6)               LIMIT       Anywhere (v6)             
Apache Full (v6)           ALLOW       Anywhere (v6)             

fukuda@digoc03:~% ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/fukuda/.ssh/id_rsa): 
Created directory '/home/fukuda/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/fukuda/.ssh/id_rsa.
Your public key has been saved in /home/fukuda/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:0oOT5a1p9bKFey0d5QClxG....xxxx.....ImuijPSaiOP9VTQ fukuda@digoc03
The key's randomart image is:
+---[RSA 2048]----+
|           ..o*o |
|        . ..+o.. |
|        .E ..+ . |
.....
|+ +   ..   =o o  |
|.o ...    o. .   |
+----[SHA256]-----+
fukuda@digoc03:~% cat falcon.id_rsa.pub >> .ssh/authorized_keys
fukuda@digoc03:/etc/ssh% sudo cp sshd_config sshd_config.orig
fukuda@digoc03:~% sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.orig
fukuda@digoc03:~% sudo emacs /etc/ssh/sshd_config 
fukuda@digoc03:~% diff /etc/ssh/sshd_config{,.orig}
33d32
< PermitRootLogin no
fukuda@digoc03:~% sudo systemctl restart ssh 

以上までで、digoc03 の firewall は:


264/1,273,167 Valid CSS! Valid HTML 5.0
Taka Fukuda
Last modified: 2018-11-08 (Thu) 19:52:10 JST