MENU
カテゴリー
アーカイブ

Apache で Nextcloud 用のリバースプロキシを設定

目次

概要

Ubuntu を 20.04 にすると MySQL8.0 が標準になる。
でも Nextcloud は今のところ公式だと MySQL5.7 までしか対応していない。

MySQL8.0 の認証方式 caching_sha2_password を、 5.7 同様に mysql_native_password にして、config.php を少し書き換えてとゴニョゴニョすることで対応可能らしいが、公式非対応だからアプリを含めて問題が生じないとは言い切れない。
で、暫し悩んだ結果、仮想マシンを別に用意して、リバースプロキシで運用することにした。

ちなみに、リバースプロキシに nginx を、バックエンドに Apache で WordPress と Nextcloud という構成もアリとはいえ、所詮は仮想マシンだし、アクセス数は僅かだし、そこまで複雑にする意味もないしということで、 Apache をちょこっ���弄って最小限の設定変更で対応することにした。

構成

こんな感じ。

Client PC —–> (Internet) —–> Server PC —–> Back-end PC

Server_PC の構成

  • IP : 192.168.1.4
  • Ubuntu 20.04
  • MySQL 8.0
  • PHP 7.4
  • Apache 2.4
    • WordPress x 2
    • Reverse proxy

Back-end PC の構成

  • IP : 192.168.1.5
  • Ubuntu 18.04
  • MySQL 5.7
  • PHP 7.2
  • Apache 2.4
    • Nextcloud

Server PC の Apache では公開用・試験用サイトの2つと Reverse proxy の計3つの Virtual Host が動作している。DDNS で取得したドメインは3つ。

Client PC から Server PC への通信は全て https 。https 通信は Server PC で終端させるから、 Server PC ( Reverse proxy )と Back-end PC の間( LAN 内)は http 通信。

Proxy server の設定

何はともあれプロキシを有効にする。

モジュールは初期設定でインストールされているから有効化する。

$ sudo a2enmod proxy
$ sudo a2enmod proxy_http

プロキシ用 Virtual Host の conf ファイル

最初に http 用の設定ファイルを作って a2ensite で有効化しておく。
DocumentRoot はどっちみち Back-end PC に接続するからいらない。当然 <Directory>ディレクティブもいらない。

ProxyPass は Client PC からのアクセス転送用。
ProxyPassReverse はバックエンドのリダイレクトがプロキシを確実に通すために必要な設定。

<VirtualHost *:80>

    ServerName example.dip.jp
    ErrorLog /var/log/apache2/virtual.host.error.log
    CustomLog /var/log/apache2/virtual.host.access.log combined
    LogLevel warn

    ProxyRequests off
    ProxyPass /  http://192.168.1.5/
    ProxyPassReverse / http://192.168.1.5/

</VirtualHost>

続いて https 用の設定。事前に certbot でSSL/TLS 証明書を作っておくと自動で作成される conf ファイルに、 Nextcloud 用の RewriteRule を加える。これが無いと Nextcloud のセットアップ警告メッセージが消えない。

<IfModule mod_ssl.c>
<VirtualHost *:443>

    ServerName example.dip.jp
    ErrorLog /var/log/apache2/virtual.host.error.log
    CustomLog /var/log/apache2/virtual.host.access.log combined
    LogLevel warn

    SSLEngine on
    ProxyPass /  http://192.168.1.5/
    ProxyPassReverse / http://192.168.1.5/

    Include /etc/letsencrypt/options-ssl-apache.conf
    SSLCertificateFile /etc/letsencrypt/live/example.dip.jp/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.dip.jp/privkey.pem

    # Nextcloud 用
    RewriteEngine on
    RewriteRule ^/\.well-known/carddav https://%{SERVER_NAME}/remote.php/dav/ [R=301,L]
    RewriteRule ^/\.well-known/caldav https://%{SERVER_NAME}/remote.php/dav/ [R=301,L]

</VirtualHost>
</IfModule>

最後に Proxy 用の設定ファイルで <Proxy> ディレクティブを有効化する。ProxyRequests は説明のとおりいらない。

$ sudo vi /etc/apache2/mods-enabled/proxy.conf


<IfModule mod_proxy.c>

        # If you want to use apache2 as a forward proxy, uncomment the
        # 'ProxyRequests On' line and the <Proxy *> block below.
        # WARNING: Be careful to restrict access inside the <Proxy *> block.
        # Open proxy servers are dangerous both to your network and to the
        # Internet at large.
        #
        # If you only want to use apache2 as a reverse proxy/gateway in
        # front of some web application server, you DON'T need
        # 'ProxyRequests On'.

        #ProxyRequests On
        <Proxy *>
           AddDefaultCharset off
           Require all denied
           #Require local
        </Proxy>

        # Enable/disable the handling of HTTP/1.1 "Via:" headers.
        # ("Full" adds the server version; "Block" removes all outgoing Via: headers)
        # Set to one of: Off | On | Full | Block
        #ProxyVia Off

</IfModule>

Apache を再起動して Server PC の設定は完了。

Back-end PC の設定

特に変わったと��ろは無く、まずは普通に Apache を有効化する。
Client PC のアドレスを取得できるように RemoteIPHeader と RemoteIPInternalProxy を加える。

まずは remoteip の有効化。

$ sudo a2enmod remoteip 

続いて Apache 設定ファイルに3行を追加。

<VirtualHost *:80>

    ServerName example.dip.jp
    DocumentRoot /var/www/example.dip.jp
    ErrorLog /var/log/apache2/virtual.host.error.log
    CustomLog /var/log/apache2/virtual.host.access.log combined
    LogLevel warn

# 以下を追加
    # リバースプロキシの裏で動作するphpMyAdmin用
    Setenv HTTPS ON
    # アクセス元のIPアドレスがリバースプロキシでなくクライアントになるように記述
    RemoteIPHeader X-Forwarded-For
    RemoteIPInternalProxy 192.168.1.4/24

  <Directory /var/www/example.dip.jp>
    Options FollowSymlinks Includes
    AllowOverride All
    AddType text/html .html
    Require all granted
  </Directory>

</VirtualHost>

次の1行の test.php とかを DocumentRoot に作ってブラウザからアクセスして、接続元 IP アドレスを確認してみる。同じ LAN 内だと WAN に接続しているルーターのアドレスが表示されるけど、スマホ回線からアクセスすればアクセス元の IP アドレスが表示されるハズ。これで、IP アドレスによるアクセス制限なんかも可能になる。

<?php echo getenv('REMOTE_ADDR'); ?>

phpMyAdmin

MySQL の Nextcloud 用ユーザーはリモートログイン可能にすること。
phpMyAdmin からユーザー情報で変更可能。もちろんターミナルで設定しても問題なし。
下の画像はユーザー phpmyadmin の場合。

Nextcloud の config.php に以下を追加

'overwritehost' => 'example.dip.jp',
'overwriteprotocol' => 'https',


書き残したことがあるかもしれないが、だいたいこれくらい。あとは Nextcloud のセットアップ警告メッセージに対応すればいい(後日書き込もう)。

もうすぐ Ubuntu20.04 正式版の配布が始まる。
次は仮想マシン Server PC の OS の更新記録を残そうかな。

コメント

コメントする

目次