投稿

8月, 2020の投稿を表示しています

uWSGI on OpenWrt

OpenWrt ルーターに Django を導入したいと思ったので、それにあたってはその下準備として、アプリケーションサーバーを整えておく必要がある。Python 系のアプリケーションサーバーとしては uWSGI が定番のようなので、まずここでは uWSGI 環境の構築について一通り行いたいと思う。luci-ssl-nginxOpenWrt では luci-ssl-nginx というパッケージがあり、これを導入するとデフォルトの uHTTPd 環境の LuCI に代えて、NGINX(かつ SSL)環境の LuCI が動くようになる。この環境において、Lua プログラムである LuCI に NGINX が CGI としてリレーするために、uWSGI が使われている。この場合は、uWSGI はあくまでも CGI を扱うためのアプリケーションサーバーの一種として使われているだけで、Python 固有の WSGI サーバーとして使われているわけではないが、それでも NGINX ⇔ uWSGI 間のプロトコルは uwsgi プロトコルが使われている点は特筆すべき点だろう(NGINX は uwsgi プロトコルにネイティブ対応している)。NGINX が uwsgi プロトコルを使うということは、設定ファイル中で uwsgi_* プレフィックスを使った設定が行え、uwsgi_pass でソケットを通じて uWSGI にリレーできることを意味している。例えば、OpenWrt の luci-ssl-nginx を入れた状態では uWSGI 関連の設定は次のようになっている。/etc/nginx/luci_uwsgi.conf(/etc/nginx/nginx.conf からインクルードされている) location /cgi-bin/luci { index index.html; include uwsgi_params; uwsgi_param SERVER_ADDR $server_addr; uwsgi_modifier1 9; uwsgi_pass unix:////var/run/luci-webui.socket; } location ~ /cgi-bin/cgi-(backup|download|upload|exec) { includ…

ASCII の IPv6 の記事

NGINX を Drupal 用に設定する

とりあえず Drupal のインストールは成功したが、処理時間の設定を除き、特に Drupal 用の設定を何も行っていないので、現状では少々問題が残っている。この記事ではより細かい設定を行って行こうと思う。NGINX 公式の Drupal 用設定例👉 NGINX 公式の Drupal 用設定例 server { server_name example.com; root /var/www/drupal8; ## <-- Your only path reference. location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { allow all; log_not_found off; access_log off; } # Very rarely should these ever be accessed outside of your lan location ~* \.(txt|log)$ { allow 192.168.0.0/16; deny all; } location ~ \..*/.*\.php$ { return 403; } location ~ ^/sites/.*/private/ { return 403; } # Block access to scripts in site files directory location ~ ^/sites/[^/]+/files/.*\.php$ { deny all; } # Allow "Well-Known URIs" as per RFC 5785 location ~* ^/.well-known/ { allow all; } # Block access to "hidden&quo…

Drupal を低スペック OpenWrt ルーターにインストール

イメージ
Buffalo WZR-HP-AG300HCPU: 680MHz; ROM: 32MB; RAM: 128MBaOpenWrt19.07.3HTTPdNGINX (with SSL) 1.17.7PHP7.2.31 (FPM)SQLitephp7-mod-pdo-sqlite 3.31.1Drupal8.9.3(最新は 9.0 だが、OpenWrt の最新の 19.07 では PHP 9.2 のため、要件にギリギリ届かない)USB フラッシュドライブ、NGINX + PHP (FPM) のセットアップWordPress のインストール(👉 WordPress を低スペック OpenWrt ルーターにインストール)で行った作業に準ずるものとする。SQLite のセットアップ👉 core/INSTALL.sqlite.txt単独の SQLite は不要。PHP の SQLite 関連モジュールだけで良い。 opkg update opkg install php7-mod-pdo-sqliteファイルの置き場には、インストール過程でデフォルトとして示される ./sites/default/files/.ht.sqlite をそのまま使うものとする。留意しなければならないのは、デフォルトのパスを使うにせよ、フォルダーとファイル自身が書き込み可にパーミッションを変更しておかなければならない点である。このパーミッション変更を忘れていると、インストール自体が無事終ってから、最初にサイトの画面を表示する段階でデータベースエラーが発生する。特に、インストーラーが自前で作成する .ht.sqlite までもがパーミッション変更が必要なことに気付くまで、当初はエラーの原因がわからずに悩む羽目になった。インストーラーが自分で作成できるのだから、こちらでパーミッションを変更せずとも、どうとでもなるんじゃないかと思うのだが、インストーラーと、インストール後の Drupal 本体では、セキュリティ的に権限が違っているからだろう。PHP の調整PHP 側の処理が重く時間がかかり過ぎると、NGINX が 504 Gateway Time-out にする場合があるので、関連する時間制限の設定を一律 10 分(600 秒)に拡大した。/etc/php.ini - max_execution_ti…

WordPress を低スペック OpenWrt ルーターにインストール

イメージ
Buffalo WZR-HP-AG300H に OpenWrt をセットアップし、WordPress をインストールしてみる。 Buffalo WZR-HP-AG300HCPU: 680MHz; ROM: 32MB; RAM: 128MBOpenWrt19.07.3HTTPdNGINX (with SSL) 1.17.7PHP7.2.31 (FPM)MySQLMariaDB 10.2WordPress5.4.2USB フラッシュドライブ今回は 8GB のフラッシュドライブを使った。256MB を swap 用に割り当て、残りをデータ用(/mnt/data)に使い、続く作業で nginx の Web ルート、MariaDB のインストール場所として割り当てるために利用する。👉 OpenWrt での USB フラッシュドライブWeb サーバーの NGINX 化と、PHP 7(FPM)との連携WordPress をインストールする前提として、Web サーバーを通じて PHP 7 が使える環境を整えておく必要がある。ここでは Web サーバー(HTTPd)としてNGINX(SSL 対応版)を使い、PHP は FPM で NGINX と連携させた。👉 OpenWrt で NGINX と PHP 7(FPM)環境を整えるMariaDB のインストール本当は SQLite3 にしたかったが、WordPress の SQLite 用プラグイン(sqlite-integration)が開発が停止したままとなっていて将来性が不透明なため、素直に MySQL 互換の MariaDB を使うことにする(MariaDB にするとサイズ的に 6.6MB と比較的大きいので、可能であれば避けたかったが)。MariaDB を適切にセットアップ(👉 OpenWrt で MariaDB を使えるようにする)した後、例えば、データベース名:wordpress;ユーザー名:wordpress;パスワード:******** で WordPress 用のデータベースを用意する。そのためには下のようにする(👉 WordPress 公式)。 CREATE DATABASE wordpress; GRANT ALL PRIVILEGES ON wordpress.* TO "wordpress&q…

OpenWrt で MariaDB を使えるようにする

イメージ
WordPress をインストールするために、MySQL 互換で MySQL よりは軽量の(とはいってもそれなりに ROM 容量は食うが)MariaDB を使えるようにする。前提状況:USB フラッシュドライブデータ領域として USB フラッシュの外部ドライブを用意(👉 OpenWrt での USB フラッシュドライブ)し、/mnt/data にマウントしていることを前提としている。アプリケーション自体(MariaDB)のインストール opkg install mariadb-server設定は /etc/mysql にあるmy.cnf はサーバー・クライアントに共通のグローバル設定用conf.d/50-server.cnf はサーバー専用のグローバル設定conf.d/60-galera.cnf は Galera Cluster 用のグローバル設定(Galera Cluster を使わない限り無関係)ユーザー別のローカル設定用は ~/.my.cnf を作成するということなので、基本的に /etc/mysql/conf.d/50-server.cnf を編集して設定を調整することになる。MariaDB の設定デフォルトの /etc/mysql/conf.d/50-server.cnf(抜粋) # # * Basic Settings # user = mariadb pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock port = 3306 basedir = /usr # Don't put this on flash memory # Figure out where you are going to put the databases and run # mysql_install_db --force datadir = /mnt/data/mysql # tmpdir should also not go on flash memory tmpdir = /tmp lc-messages-dir = /usr/share/mariadb skip-external-locking # Instead of skip-networkin…

OpenWrt での uHTTPd 設定

USB フラッシュドライブを前提として、uHTTPd がそのマウントされた外部領域を使うように設定することにする。やったことは以下で、SSH で設定ファイルを直接編集して行なった。(参考 👉 uHTTPd Web Server Configuration)uHTTPd 用に /etc/config/uhttpd の option home を linux home パーティションのマウントポイント(/mnt/data)下に指定する。/www/luci-static, /www/cgi-bin/luci のコピーを /mnt/data 下の対応する場所に置くあとは、index.html を自前のものに変更するなりして、動作を確認した。デフォルトの index.html は、LuCI の管理画面である、/cgi-bin/luci にリダイレクトされるようになっているので、この index.html を別のものに変更してしまったとしても、直接 /cgi-bin/luci にアクセスすればちゃんと管理画面に入ることができるので、何も問題はない。CGIちなみに、/etc/config/uhttpd を見ると、PHP や Perl は cgi-bin 以外の場所でも実行可能なように設定できるようだが、Python ではできないようだった(設定してみても、無効のようだった)。その他試しに uHTTPd の代わりに Apache を入れようとしたが、正常に動かすことができなかった。現在(OpenWrt 19.07)では、NGINX の環境が整っており、自分の場合は uHTTPd はアンインストールして使わず、LuCI も含めて SSL 対応版の NGINX で使っている(👉 OpenWrt で NGINX と PHP 7(FPM)環境を整える)。

OpenWrt で NGINX と PHP 7(FPM)環境を整える

イメージ
例えば WordPress をインストールするためには PHP 7 が Web サーバーと連携して使える状態(FastCGI)を整えておく必要がある。この文書では、WordPress のことはとりあえずおいておいて、一般的に OpenWrt に Web サーバーとして NGINX(SSL 版)を利用し、PHP 7 を FPM(FastCGI Process Manager)で連携する方法について記す。 前提状況:USB フラッシュドライブWWW 用のデータを置く場所として USB フラッシュの外部ドライブを用意(👉 OpenWrt での USB フラッシュドライブ)し、/mnt/data にマウントしていることを前提としている。LuCI もろとも Web サーバー(HTTPd)を SSL 対応 NGINX 化する以前の OpenWrt 18.x とは飛躍的に進歩して、19.07 では SSL 対応版の NGINX が opkg として用意されている(以前は自前で Linux ソースコードからモジュールをビルドする必要があった)のみならず、NGINX 版 LuCI がセットアップされている opkg すら用意されており、OpenWrt コミュニティの旺盛な活動を感じる(👉 LuCI on other web servers > LuCI on nginx)。 opkg update opkg install luci-ssl-nginx opkg remove luciデフォルトでインストールされている LuCI/uHTTPd の方は不要になるのでアンインストールした。用意した USB の外部領域(/mnt/data)があるので、デフォルトの Web ルート(/www 以下)を /mnt/data/www/default 以下にコピー。 mkdir -p /mnt/data/www/default cp -rp /www/* /mnt/data/www/defaultそれに連動して /etc/nginx/nginx.conf の設定を変更して、Web ルートが /mnt/data/www/default を指し示すように修正する。ただし、元々の root オプションが http ブロック直下にあったのを、2 番目の ssl 用の server ブロック内に新…

OpenWrt での USB フラッシュドライブ

イメージ
(公式ガイド:👉 Using storage devices)関連パッケージのインストール opkg install kmod-usb-storage opkg install usbutils opkg install block-mount opkg install gdisk opkg install f2fs-tools opkg install kmod-fs-f2fsUSB ドライバーは kmod-usb-storage のみusbutils はコマンド lsusb -t を使って USB メモリーが接続されているかどうかを調べるため(オプショナル)block-mount はコマンド block info を使ってパーティション情報を表示するため(shell だけでなく LuCI の Mount Points のためにも必要)gdisk はパーティション操作のため(後述)f2fs-tools と kmod-fs-f2fs が USB メモリーフラッシュ用のファイルシステムのためのドライバー 不良セクターの検査(オプショナル)念のために USB フラッシュドライブの不良セクターを調べておきたい場合には、badblocks コマンドを(インストールして)使う。 opkg install badblocksbadblocks コマンド自体は例えば次のような感じで使う(書き込みを伴う破壊的検査): badblocks -w -s -v /dev/sda0101010101、10101010、00000000、11111111 の 4 パターンについてそれぞれ書き込み・読み出しでチェックする。gdisk によるパーティション操作今回は 2GB の USB フラッシュドライブを使い、そのうち 256MB を swap パーティションに、残り 1.6GB をデータ用パーティションにした。gdisk コマンドでデバイス(/dev/sd*)を指定して実行すれば、あとは対話形式でパーティションデザインを行う形となる。 Disk /dev/sda: 3915776 sectors, 1.9 GiB Model: Storage Media Sector size (logical/physical): 512/512 bytes Disk identifier (GU…

複式簿記システムの構築

イメージ
[STEP 1] Google SpreadSheets に蓄積した仕訳を SQLite + Python で処理するシステムの確立個人的に青色申告による複式簿記が必要なので、そのための必要十分なシステムを構築する。
(市販の会計ソフトは決して「必要十分」ではなく、単なる「十分」(つまり不必要な余計な要素を過剰に備えている)ので、論外。)おおまかなイメージとしては:逐次発生する会計イベントは人手によって「仕訳」してデータを入力し、1 年を通じてデータベース(仕訳帳)に蓄積する年間の蓄積された仕訳帳に基く年度末の「総勘定元帳の集計」と「決算整理仕訳」と「損益計算書の作成」は、Python プログラムで自動化する。具体的には:仕訳帳は Google SpreadSheets を利用して家族で共有集計・決算整理・損益計算は、Google SpreadSheets から TSV をダウンロードして、SQLite にインポートし、Python で SQL を駆動してそれらの定型化された作業を行い、結果を複数の TSV としてアウトプットする。最後にそれら TSV を単一の .xlsx ファイルにマージして一つの総勘定元帳として得る。仕訳帳のスキーマ(Google SpreadSheets) create table Journal ( id integer primary key, parent_id integer, date date, amount integer, debit text, credit text, description text ); ID は Google SpreadSheets 上では、単に「行番号+1」の計算式を使っただけのもの。親IDは、借方 or 貸方が諸口(複数科目)となる場合の「一対多」または「多対多」の仕訳のために用意した要素。グルーピングするエントリーのIDを親ID として指し示す。通常の一対一の仕訳「ID」「日付」「金額」「借方科目」「貸方科目」を示し、「親ID」は NULL一対多(または多対多)の仕訳の親エントリー「ID」「日付」を示し、「親ID」は NULL
「金額」「借方科目」「貸方科目」は両方とも「諸口」の場合は NULL だが、片方が単一の場合は、そのままその科目…