Nginx でホストしたローカルの MediaWiki をポート開放せずに公開する

# 初めに
運営している Minecraft サーバーの情報をまとめる Wiki のセットアップをしたので、振り返りがてら書いてみました。

# 環境
- OS: Ubuntu 22.04 (Proxmox 上の LXC コンテナ)
- Web サーバー: Nginx (1.18)
- Wiki ソフト: MediaWiki (1.42.1)
- プロキシ: Cloudflared (2024.8.3)
- データベース: Maria DB
- PHP: version 8.1

# パッケージのインストール、セットアップ
## インストール
`apt update`, `apt upgrade` などで普通に更新しつつ、 `nginx`, `mariadb`, `php` 関連のパッケージもインストールする。

```shell
apt install mariadb-server php php-intl php-mbstring php-xml php-apcu php-curl php-mysql
apt install php-intl php-mbstring php-xml php-apcu php-curl
apt install git unzip # unzip は必要な場合のみ
```

落として来たら nginx と mariadb を自動的で起動するようにする。
```
systemctl enable nginx
systemctl enable mariadb
```

---

## Maria DB
mariadb はここからデータベースの設定を行う。
```
mysql_secure_installation
```

```shell
# パスワードは変更しないので Enter キーを押して次へ
Enter current password for root (enter for none): 

# unix_socket に変更すると面倒らしい[1]ので n を入力して次へ
Switch to unix_socket authentication [Y/n]: n

# 変更しない方が良いと思います。n を入力して次へ
Change the root password? [Y/n]: n

# 匿名ユーザーは必要ないので y を入力して次へ
Remove anonymous users? [Y/n]: y

# 今回は DB と Nginx を同じマシンで動かすのでリモートからのルートログインを許可しない。 y を入力して次へ。
Disallow root login remotely? [Y/n]: y

# テスト用のデータベースを削除するので y を入力して次へ。
Remove test database and access to it? [Y/n]: y

# 設定を反映するために今すぐリロードするので y を入力して終わり
Reload privilege tables now? [Y/n]: y
```

Maria DB のデータベース、データベースユーザーを作成する。
```
mysql -u root -p

CREATE DATABASE データベース名;
CREATE USER 'ユーザー名'@'localhost' IDENTIFIED BY 'パスワード';
GRANT ALL PRIVILEGES ON データベース名.* TO 'ユーザー名'@'localhost';
FLUSH PRIVILEGES;
EXIT;
```
今回は Nginx と Maria DB を同じマシンで動かすので、場所を 'localhost' にする。

---

## Nginx
MediaWiki 用の Nginx サーバーブロックを設定する。
`/etc/nginx/sites-available/` に `mediawiki` を作成する。
(`/etc/nginx/sites-available/mediawiki`)
```
# mediawiki

server {
    listen 80;
    server_name ドメインかIP; # 例: wiki.example.com

    root /var/www/html/mediawiki;
    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
        try_files $uri /index.php;
        expires max;
        log_not_found off;
    }
}

```

保存して終了し、`/etc/nginx/sites-enabled/` にシンボリックリンクを作成、作成したコンフィグのテストを行いエラーが出なければ Nginx をリロードする。
```
ln -s /etc/nginx/sites-available/mediawiki /etc/nginx/sites-enabled/
nginx -t # コンフィグのテスト
systemctl reload nginx
```
コンフィグのテストで `[warn]` や `[emerg]` と表示されたら構文ミスや記載事項に過不足があるので、それらが表示されなくなるまで修正とテストを繰り返す。

---

## Nginx その 2
ここまでの設定では、 Nginx のログに利用者の IP アドレスではなくループバックアドレスが記録されてしまう。そこで以下の設定を `/etc/nginx/nginx.conf` に追記し、正しいアドレスを記録するようにする。

```/etc/nginx/nginx.conf
http {
        # http ディレクティブに追記する
        
        ## cloudflared settings
        set_real_ip_from 127.0.0.1/32;
        set_real_ip_from ::1/64;
        real_ip_header CF-Connecting-IP;
}
```

追記したら、保存して Nginx を再起動する。

---

## Cloudflared
[ここ](https://github.com/cloudflare/cloudflared/releases) から利用するサーバーマシンのアーキテクチャに合ったパッケージをダウンロードする。今回は Intel CPU を搭載した Linux マシンで動かすので、`cloudflared-linux-amd64.deb` を落とす。
ディレクトリはどこでもよい。

```
wget https://github.com/cloudflare/cloudflared/releases/download/2024.8.3/cloudflared-linux-amd64.deb
```

.deb ファイルを落として来たら `apt install` を実行してインストールする。
```
apt install ./cloudflared-linux-amd64.deb
```

インストールしたら Cloudflare のアカウントと紐づける。
```
cloudflared tunnel login
```
上記のコマンドを実行すると認証用の URL が表示されるので、クリックして認証を済ませる。
次に Cloudflare Zero trust のダッシュボードでトンネルを作成する。
"+ Create tunnel" をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2403016/9b8ebfd6-a6bf-74df-32fc-046088816e4d.png)

---

Cloudflared を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2403016/50cc894c-a388-a8ef-1e14-44ce1391224b.png)

---

トンネル名を入力。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2403016/18cf0568-2f5a-f420-7470-64ae5c2ef70d.png)

ホスト名はご自由に(例: `wiki.example.com`)
サービスは `http://localhost:80` とする。

作成すると起動スクリプトを cloudflared に登録するコマンドが表示されるので、コピーして実行する。
(clouflared は既にインストールしてあるので、インストールスクリプトが省かれた小さいボックスの方をコピる)

自動で起動してくるように設定される。

---

## MediaWiki
[ここ](https://www.mediawiki.org/wiki/Download) から tar ファイル、もしくは zip ファイルをダウンロードして、 `/var/www` に配置し、解凍する。
(`バージョン` はその時の Mediawiki のバージョン)

```
# tar
tar -zxvf mediawiki-バージョン.tar

# zip
unzip mediawiki-バージョン.zip
```

`mediawiki-バージョン` を `mediawiki` に改名する。
```
mv mediawiki-バージョン mediawiki
```

/var/www/mediawiki 配下のコンテンツを全てデフォルトの Web サーバー用ユーザー `www-data` が所有するようにする。
```
chown -R www-data:www-data /var/www/mediawiki
```

/var/www/mediawiki 配下のすべてのコンテンツのパーミッションを 755 にする。(オーナー以外の書き込みを禁止)
```
chmod -R 755 /var/www/mediawiki
```

---

ここまで来てようやく MediaWiki の設定に取り掛かることができる。

`http://設定したドメイン` へアクセスして初期設定を行う。
[手順など](https://www.mediawiki.org/wiki/Manual:Config_script/ja)

すべての設定が終了すると、設定していたブラウザで `LocalSettings.php` がダウンロードされるのでサーバーの `/var/www/mediawiki/` に配置する。
(`touch LocalSettings.php` でファイルを作成して内容をコピペするなど)

この際、所有権を `www-data:www-data` に、パーミッションを `600` に設定しておく。
```
chown www-data:www-data LocalSettings.php
chmod 600 LocalSettings.php
```


# 終わりに
1 日溶かしました。403, 503, 1033......

# 参考ページ
[1]

https://hp.ofuton.org/61/

https://www.mediawiki.org/wiki/Manual:Installation_requirements/ja

https://www.mediawiki.org/wiki/Manual:Config_script/ja