お一人様用Misskeyを立てて、お仕事備忘録を実現するマイクロブログSNSを作る – 3. nginxインストール編

お一人様用Misskeyを立てて、お仕事備忘録を実現するマイクロブログSNSを作る – 3. nginxインストール編

前回(お一人様用Misskeyを立てて、お仕事備忘録を実現するマイクロブログSNSを作る – 2. Misskeyインストール編)の続きで、リバースプロキシの役割をもつnginxのセットアップ他、必須となる設定を行います。

 

nginxのセットアップ

リバースプロキシとしての役割を担うnginxは、Ubuntu OS上に直接インストールします。

Docker版にしようかなとも思ったのですが、設定がややこしくなるので却下。あくまでリバプロとしてのnginxは設定や証明書が触りやすいOS直インストールして、MisskeyはDocker版を使うことで複数インスタンスも立てられるように、という感じで使い分けします。

nginxのGPGキーのインポート

$ sudo apt update
$ sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring

$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

$ gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg
※GPGキーがインポートされたことを確認
pub rsa2048 2011-08-19 [SC] [有効期限: 2024-06-14]
573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62
uid nginx signing key <signing-key@nginx.com>

※安定版のレポジトリを使う
$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list

※nginxレポジトリをピン留めする
$ echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
| sudo tee /etc/apt/preferences.d/99nginx

nginxのインストール

$ sudo apt update
$ sudo apt install nginx

Dockerfileの作成

$ sudo apt update
$ sudo apt install nginx

nginxのコンフィグファイル作成

nginxの設定ファイルは以下公式ページのものを参考に少し修正して利用する。

$ vi /etc/nginx/conf.d/misskey.conf
※以下を追記
# For WebSocket
map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

proxy_cache_path /tmp/nginx_cache levels=1:2 keys_zone=cache1:16m max_size=1g inactive=720m use_temp_path=off;

server {
    listen 80;
    listen [::]:80;
    server_name hoge.com; #★アクセス用URLに修正

    # For SSL domain validation
    root /var/www/html;
    location /.well-known/acme-challenge/ { allow all; }
    location /.well-known/pki-validation/ { allow all; }
    location / { return 301 https://$server_name$request_uri; }
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name hoge.com; #★アクセス用URLに修正

    ssl_session_timeout 1d;
    ssl_session_cache shared:ssl_session_cache:10m;
    ssl_session_tickets off;

    # To use Let's Encrypt certificate
    #★オレオレ証明書を利用する(外部公開しないためLet's Encryptの証明書がない)ためコメントにする
    #ssl_certificate     /etc/letsencrypt/live/example.tld/fullchain.pem; #★必要に応じてアクセス用URLに修正
    #ssl_certificate_key /etc/letsencrypt/live/example.tld/privkey.pem; #★必要に応じてアクセス用URLに修正

    # To use Debian/Ubuntu's self-signed certificate (For testing or before issuing a certificate)
    #★オレオレ証明書を利用するためコメントアウト
    ssl_certificate     /etc/ssl/certs/ssl-cert-snakeoil.pem;
    ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;

    # SSL protocol settings
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;
    ssl_stapling on;
    ssl_stapling_verify on;

    # Change to your upload limit
    client_max_body_size 80m;

    # Proxy to Node
    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_http_version 1.1;
        proxy_redirect off;

        # If it's behind another reverse proxy or CDN, remove the following.
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;

        # For WebSocket
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;

        # Cache settings
        proxy_cache cache1;
        proxy_cache_lock on;
        proxy_cache_use_stale updating;
        proxy_force_ranges on;
        add_header X-Cache $upstream_cache_status;
    }
}

作成したコンフィグファイルの確認

以下コマンドで、作成したコンフィグが間違っていないか確認する。

warnが出ているが、オレオレ証明書を利用していることに起因するもののため、ここでは無視する。

$ sudo nginx -t
nginx: [warn] "ssl_stapling" ignored, issuer certificate not found for certificate "/etc/ssl/certs/ssl-cert-snakeoil.pem"
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

nginxの起動

$ sudo systemctl restart nginx

Misskeyアクセスの確認

アクセス用URL(ここまでの話で言う所の「hoge.com」)に対してアクセスする。(Misskeyインストール直後のアクセス確認のときのように、「:3000」を付けなくても正常にアクセス出来ることを確認する)

nginxがリバースプロキシとして正常に動作していれば、http://hoge.com/(デフォルトポート80)または https://hoge.com/(デフォルトポート443)にアクセスすることで、Misskeyの待ち受けているポート3000にリダイレクトされる。

オレオレ証明書を利用する設定にしているので初回アクセス時に警告が出るが、気になるようなら一時的にでもサーバをインターネットに公開してLet’s Encryptで証明書を取得する必要がある。(とはいえ、あくまでお一人様用が前提なのでこの状態でヨシとする。

その他、利用開始前までにやっておくこと

設定変更箇所などのメモ。必要に応じて設定すること。

設定 > プライバシー

アカウントを作成したあとのプロフィール入力画面。

インターネットに公開しない想定のため、フォローされることも無ければクローラーにアクセスされることもないので、デフォルトのままでも良い気もするが、今後何かしらの気の迷いで公開鯖へ変更することがあった際にこのインスタンスのポリシーとして外部へは出さないことを主軸にしているので一応変えておく。

その他、徹底して外部に情報を公開しないように設定する。

今回作るのは、あくまでお一人様用なので。自分だけが参照できれば良い、それ以外へ見せることは一切しないように。

他にも、設定 > モデレーションにある「誰でも新規登録できるようにする」をオフにするなど、ちまちま変更する。(必須ではなく趣味の問題)

ファイルアップロードが出来ない問題に対する対処

ここまでの手順で構築すると、ファイルのアップロード(投稿への画像添付やドライブへの直接アップロードなど)が以下のように失敗する。

※エラーメッセージ
Internal error occurred. Please contact us if the error persists.
INTERNAL_ERROR
5d37dbcb-xxxx-xxxx-xxxx-e690c97775ac

Docker版で展開した際のファイル置き場(オブジェクトストレージではなく、Docker版Misskeyの中にあるディレクトリ)の権限設定がおかしいことが原因の模様。

$ pwd
/home/xxxx/docker-files/misskey

$ sudo chown -hR 991:991 ./files
$ sudo chmod u+x ./files
$ sudo docker compose restart

上記コマンド実行後、再度ドライブにファイルをアップロード(またはテスト投稿に画像を含めるなど)して正常にアップロード出来ることを確認する。

※参考元↓

ノート検索を利用できるようにする

デフォルトだと、以下画像のように検索機能が利用できない。

検索による負荷を考慮してのこと、というのが理由のようだが今構築しているのはお一人様用Misskeyである。多少の負荷がかかったとて利便性を優先する。(ユーザが自分だけなので、負荷という負荷にすらならない気もする)

ベースロールに対して、検索機能の利用権限を付与する必要がある。上記画像の通り、「ノート検索の利用可否」を有効にして設定を保存する。

$ pwd
/home/xxxx/docker-files/misskey
$ sudo docker compose restart

Misskeyを再起動(しなくても適用される?すぐに適用されなかったので、再起動した)すると検索が利用できるようになっている。

2023/09/13 追記

検索するにはmeilisearchが必須なんだと思ってインストール進めてたんですが、この時点でうまく検索が動作しませんでした。

前回の以下記事でmeilisearch関連のところをスルーして(meilisearchを導入しない状態)、上記のロール設定を変更すると検索が正常に動作します。

「デフォルトの検索と、meilisearchを使った検索ではサーバ負荷が異なっていてmeilisearchのほうが負荷軽減されてる」とかあるんだろうか…?あるかもしれないけれど、今回はお一人様サーバなのでその辺は全く問題ないので、デフォルト(meilisearchに関する設定を修正しない)でのやり方にしたいと思います。

※↑meilisearch関連の設定を取っ払った上でdocker compose stop → down → build → up -d って流れで再ビルド(DB初期化なし)をすることで、インデックス再作成等もせずに検索機能が利用できるようになりました。(修正後の前回記事をベースに、meilisearch未導入の場合、この辺の再ビルドは不要)

何か情報あれば追記/修正します。

ドライブ容量を拡張する

デフォルトだとユーザあたりのドライブ容量が100MBになっている。すぐにいっぱいになりそう&自分しか使わないのである程度広げておく。

とりあえず10GB(10240MB)に設定した。

その他参考にしたサイトのメモ(順不同)

以下、構築時に参考になったサイトのメモ。

サーバ関連カテゴリの最新記事