はじめに
前の記事でオンプレミスなFedora 31でGROWIを起動したところまでをメモ書きしてみました。
この記事では、GROWIで記事を書くために必要な設定と、HTTPS経由で接続させるための設定について書きます。
GROWIで記事を書くために必要な設定
管理者の設定
インストールした直後のGROWIにはユーザは定義されていません。最初に定義したユーザが管理者となります。
- ユーザID
- 名前
- メールアドレス
- パスワード
を入力し、「作成」ボタンを押すと…
ユーザが管理者として作成されて、「アプリ設定」画面が表示されます。
サイトの設定
この記事で設定中のGROWIサーバは管理者以外のユーザを追加することは想定していないため、必要最低限の設定を行います。したがって、メールを送信するための設定は行っていません。
まず、「アプリ設定」画面の「アプリ設定」のセクションでは、以下の項目のみを設定します。
- サイト名
- コンフィデンシャル表示
どちらもお好みっぽいですが、空欄だとカッコ悪そうなので設定します。
設定が終わったら、「ファイルアップロード」の項目の直後にある「更新」ボタンを押します。
すると、画面の上にメッセージが表示されますが、更新には時間を要する場合がありますので、そのメッセージが消えるのを待ちます。メッセージの表示中にページを切り替えたりすると設定内容が反映されない場合があるようです。
メッセージが消えたら更新完了です。
「アプリ設定」のセクションの設定が終わったら、画面を下にスクロールすると…
「サイトURLの設定」のセクションが現れます。
スポンサーリンク
Warningメッセージの表示の方法が今風な感じですが、「Database」の項にGROWIサイトの外部からのアクセス用のURLを指定します。
しかしながら、URLを指定する際には以下の点に注意が必要です。
- URLの末尾のスラッシュはつけない(例: https://pandanote.info … 正, https://pandanote.info/ … 誤)。
- 外部からのアクセス用のURLはHTTPS接続を受け付けるWebサーバ(この記事ではnginxを使用します。)から転送を行う設定ができるものを指定します。URLによってはバーチャルホストの設定やTLS証明書の取得(後述)だけではなく、DNSの設定なども必要になる可能性があります。
設定が終わったら、「Database」の項目の直後にある「更新」ボタンを押します。
メッセージが消えたら更新完了です。
nginxからの転送のための設定
nginx.confに以下の設定を追加します。ホスト名および端末名については実際の設定値ではなくダミーの値に置き換えています。また、TLS証明書についてはLet’s encryptから取得したものを使用しています。
# ドル記号の前のバックスラッシュはpanda大学習帳(https://pandanote.info/)での表示用のものです。 | |
# nginxの設定として使用する場合には、ドル記号の前のスラッシュは削除が必要です。 | |
http { | |
(中略) | |
map $remote_addr $allowed { | |
~aa.bb.cc. allow; | |
~2aaa:bbbb:cccc:dd: allow; | |
pp.qqq.rr.s allow; | |
127.0.0.1 allow; | |
default deny; | |
} | |
server { | |
listen 80; | |
listen [::]:80; | |
server_name growi.example.com; | |
return 301 https://$host$request_uri; | |
root /var/www/wiki; | |
# Load configuration files for the default server block. | |
include /etc/nginx/default.d/*.conf; | |
location / { | |
} | |
error_page 404 /index.php?error=404; | |
location = /40x.html { | |
} | |
error_page 500 502 503 504 /50x.html; | |
location = /50x.html { | |
} | |
} | |
server { | |
listen 443 ssl http2; | |
listen [::]:443 ssl http2; | |
server_name growi.example.com; | |
root /var/www/wiki; | |
access_log /var/log/nginx/access_wiki.log main; | |
ssl_certificate "/etc/letsencrypt/live/growi.example.com/fullchain.pem"; | |
ssl_certificate_key "/etc/letsencrypt/live/growi.example.com/privkey.pem"; | |
ssl_session_cache shared:SSL:10m; | |
ssl_session_timeout 10m; | |
ssl_protocols TLSv1.3 TLSv1.2; | |
ssl_prefer_server_ciphers on; | |
client_max_body_size 50M; | |
if ($http_user_agent ~ (terminal1|terminal2)) { | |
set $allowed allow; | |
} | |
if ($allowed = deny) { | |
return 404; | |
} | |
location / { | |
proxy_pass http://127.0.0.1:3000/; | |
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | |
proxy_set_header Host $http_host; | |
} | |
location /socket.io/ { | |
proxy_http_version 1.1; | |
proxy_set_header Upgrade $http_upgrade; | |
proxy_set_header Connection "Upgrade"; | |
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | |
proxy_cache_bypass $http_upgrade; | |
proxy_set_header Host $host; | |
proxy_pass http://127.0.0.1:3000/socket.io/; | |
} | |
index index.html; | |
} | |
} |
上記の設定を行うことで、以下の処理をnginxが行っています。
- mapディレクティブ(この記事参照。)の設定(3-9行目)を行うことにより、変数allowedを使ってUser agent及びIPアドレスによるアクセス制御を行うことができます。
- HTTP接続によるリクエストを無条件でHTTPS接続用のURLへリダイレクトしています(15行目)。
- HTTPS接続の際の暗号化方式にはTLSv1.3またはTLSv1.2のみを使用し、それ以外のバージョンの暗号化方式による接続を拒否しています。
- socket.ioの設定を行います(次節参照)。
socket.ioの設定[2022/02/18補足]
GROWIはsocket.ioを利用しているので、URLに”socket.io”が含まれていた場合にそれに対応するための以下の設定を追加します([1]参照)。
- HTTPのバージョンを1.1にするための設定(64行目)
- Upgradeヘッダ(65行目)
- Connectionヘッダ(66行目)
- リバースプロキシの転送先のURLとしてhttp://127.0.0.1:<GROWIが使用しているポート番号>/socket.io/を設定(70行目,[2]参照)。
上記の設定が適切に行われていないと、Nginxのアクセスログに以下のようなメッセージが大量に出力されます(「(IPアドレス)」及び「(referer)」の部分は省略しています。また、”t=”以降もちょっと編集しています。特に「(referer)」の部分は長くなりがちなので、より大量にログが出力されているように見えます)。
(IPアドレス) [18/Feb/2022:00:00:16 +0900] "POST /socket.io/?EIO=3&transport=polling&t=abcdefg HTTP/2.0" 404 129 (referer)
SELinuxの設定
nginxなどのWebサーバからリバースproxyを使って接続する場合で、かつSELinuxを有効に設定している場合、Webサーバから他のサーバ(この記事においてはGROWIサーバが該当します。)への接続がデフォルトではできない設定になっています。
そこで、root権限で以下のコマンドを実行し、Webサーバから他のサーバへの設定を許可するよう設定します。
外部からのGROWI用のポートへのアクセスの遮断
firewall-cmd等を用いてGROWI用のポートに対して外部からのアクセスができないように設定されていることを確認します。
動作確認
ここまでの設定等が終わったら、モダンなブラウザを使ってGROWIサーバ用のためのHTTPS接続を受け付けるためのURLにアクセスしてみます。
すでに各種設定を終えていますので、インストーラページではなく、ログインページが表示されます。下図の(a)の部分には「アプリ設定」画面の「アプリ設定」のセクションで設定したサイト名が表示されます。
ログインページのバックグラウンドの色遣いもおしゃれです。映えますね。
ログインページにこの記事で設定したユーザIDとパスワードを入力し、ログインができれば動作確認完了です。
GROWIの使用感
MediaWikiにはプレビュー機能がなかったので、レイアウトの出来具合等を確認するためには編集した文書をいったん保存する必要がありました。
一方、GROWIには編集中の文書をリアルタイムでプレビューできるので、文書の出来具合等を確認するための特別な操作が不要になるので、文書の出来具合が気にならなくなる分だけ文書の編集に集中できます。
これだけでも使用感はかなり上がりますね。
まとめ
MongoDBとMariaDBがメモリがイマイチ多くない同一サーバに同居していることと、
Node.jsがインストール前の予想以上にメモリを消費しているため、リソース的には少々心配な構成ではあります。
今のところMongoDB,MariaDB及びNode.jsのいずれかがOOM killer先生のターゲットになっているというような気配はないようなので、この記事の構成でしばらく運用して様子を見たいと思います。
この記事は以上です。