小さなサーバでDockerによるウェブサービスを複数起動する

2023年1月13日

この問題の検討理由としては以下である。

  • ネット上に小さなVPSを借りている
  • その中に複数のウェブサービスをDockerで起動したい
  • これらのウェブサービスには、対してアクセスは無いと予想されるので、リクエスト処理は遅くて良い。混んできた時に改めて考えることにする。

前提条件としては以下。

  • Dockerでインストールすると、それぞれのコンテナに、それぞれのApacheなりnginxなりが起動してしまう。
  • そのデフォルトの設定値が「大きい」ため、放っておくとリクエスト処理プロセスが増加してメモリを圧迫してしまう。

Apache2編

nginxについてはまだ見ていない。とりあえず、Apache2の設定値を変更する。最近のコンテナでApacheを使用しているものは、おおよそApache2.4以上のようで、この設定の変更は、どれも同じやり方である。

Apache2の変更のしかた

docker-compose.ymlと同じ場所で以下を行う。

docker cp コンテナ名:/etc/apache2 ./apache2

これで/etc/apache2の内容が./apache2にコピーされる。docker-compose.ymlには、例えば以下を追加する。

  wordpress:
    image: wordpress:6.0.2
    container_name: cc
    volumes:
      - ./html:/var/www/html
      - ./apache2:/etc/apache2 # これを追加

設定を変更する。

./apache2/mods-available/mpm_prefork.confが以下の記述になっている。

<IfModule mpm_prefork_module>
        StartServers                     5
        MinSpareServers           5
        MaxSpareServers          10
        MaxRequestWorkers         150
        MaxConnectionsPerChild   0
</IfModule>

この意味としては、常に起動しているリクエスト処理プロセスが5~10個である。一時的に忙しい時には、150個まで許されるが、それが終わると10個に戻る。

ということは、実際的には、常に10個のリクエスト処理プロセスが意味もなく存在していると考えて良い。これはいかにも無駄である。

これを以下のように変更する。本当は、5,5,5,50,0あたりが適切かと思われる。なぜなら、ある一つのクライアントがウェブページを表示しようとする場合、その同じ一つのクライアントから同時に複数のリクエストが来るのが普通だからだ。しかしここでは、あえて厳し目の設定にしている。

<IfModule mpm_prefork_module>
        StartServers                     1
        MinSpareServers           1
        MaxSpareServers          1
        MaxRequestWorkers         50
        MaxConnectionsPerChild   0
</IfModule>

Apache2を使用しているコンテナ例

  • mailuのmailu_webmail_1コンテナ、ただし、UIとしてroundcubeを選択した場合。rainloopの場合はnginxかもしれない。
  • nextcloud
  • wordpress

nginx編

未検討

nginxを使っていると思われるもの

  • jitsi

node.jsによるhttpsサーバと思われる

  • nodebb

不明

  • portainer
  • traefik

未分類

Posted by ysugimura