NextcloudサーバをApacheからNginxに変更 Cubieboard5

先日、Cubieboard5でNextcloudサーバを構築してみました。

ハードウェア構成、動作速度ともに特に問題ありませんが、気になるのは取り扱えるファイルサイズが2GBに制限されていることです。

ファイルシステムはext4を使用していますので、HDDまたはSSDに2GB以上のファイルを格納することは可能です。

シングルボードコンピュータのNextcloudで2GBの壁を超えられないかどうか試したい理由から、WebサーバをApacheからNginxに変更してみました。手順を記録しておこうと思います。


Cubieboard5にNginx版Nextcloudをインストール

php-fpm起動設定

前回ビルド・インストールしたphp 7.2.4のphp-fpm用設定ファイルを作成します。

  1. /opt/php7.2.4/etc/php-fpm.confファイルを作成します。
    [global]
    include=/opt/php7.2.4/etc/php-fpm.d/*.conf
  2. /opt/php7.2.4/etc/php-fpm.d/www.confファイルを作成します。
    [www]
    prefix = /opt/www/html
    user = www-data
    group = www-data
    listen = 127.0.0.1:9000
    listen.owner = www-data
    listen.group = www-data
    pm = dynamic
    pm.max_children = 5
    pm.start_servers = 2
    pm.min_spare_servers = 1
    pm.max_spare_servers = 3
    env[HOSTNAME] = $HOSTNAME
    env[PATH] = /opt/php7.2.4/bin:/usr/local/bin:/usr/bin:/bin
    env[TMP] = /opt/tmp
    env[TMPDIR] = /opt/tmp
    env[TEMP] = /opt/tmp
  3. テンポラリディレクトリを作成します。
    mkdir /opt/tmp
    chown www-data:www-data /opt/tmp
    chmod 1777 /opt/tmp
  4. /opt/php7-fpm-checkconfファイルを作成します。
    #!/bin/sh
    set -e
    errors=$(/opt/php7.2.4/sbin/php7-fpm --fpm-config /opt/php7.2.4/etc/php-fpm.conf -t 2>&1 | grep "\[ERROR\]" || true);
    if [ -n "$errors" ]; then
        echo "Please fix your configuration file..."
        echo $errors
        exit 1
    fi
    exit 0
  5. /etc/init/php7-fpm.confファイルを作成します。
    # php7-fpm - The PHP FastCGI Process Manager
    description "The PHP FastCGI Process Manager"
    start on runlevel [2345]
    stop on runlevel [016]
    pre-start exec /opt/php7-fpm-checkconf
    respawn
    exec /opt/php7.2.4/sbin/php7-fpm --nodaemonize --fpm-config /opt/php7.2.4/etc/php-fpm.conf
  6. /etc/init.d/php7-fpmファイルを作成します。php5-fpmのスクリプトをベースにさせて頂きました。
    #!/bin/sh
    ### BEGIN INIT INFO
    # Provides:          php7-fpm
    # Required-Start:    $remote_fs $network
    # Required-Stop:     $remote_fs $network
    # Default-Start:     2 3 4 5
    # Default-Stop:      0 1 6
    # Short-Description: starts php7-fpm
    # Description:       Starts The PHP FastCGI Process Manager Daemon
    ### END INIT INFO
    
    PATH=/opt/php7.2.4/sbin:/opt/php7.2.4/bin:/sbin:/usr/sbin:/bin:/usr/bin
    DESC="PHP7 FastCGI Process Manager"
    NAME=php7-fpm
    DAEMON=/opt/php7.2.4/sbin/$NAME
    DAEMON_ARGS="--daemonize --fpm-config /opt/php7.2.4/etc/php-fpm.conf"
    PIDFILE=/var/run/php7-fpm.pid
    TIMEOUT=30
    SCRIPTNAME=/etc/init.d/$NAME
    
    [ -x "$DAEMON" ] || exit 0
    
    [ -r /etc/default/$NAME ] && . /etc/default/$NAME
    
    . /lib/init/vars.sh
    
    . /lib/lsb/init-functions
    
    if init_is_upstart; then
        exit 1
    fi
    
    do_check()
    {
        /opt/php7-fpm-checkconf || return 1
        return 0
    }
    
    do_start()
    {
            start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
                    || return 1
            start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
                    $DAEMON_ARGS 2>/dev/null \
                    || return 2
    }
    
    do_stop()
    {
            start-stop-daemon --stop --quiet --retry=QUIT/$TIMEOUT/TERM/5/KILL/5 --pidfile $PIDFILE --name $NAME
            RETVAL="$?"
            [ "$RETVAL" = 2 ] && return 2
            start-stop-daemon --stop --quiet --oknodo --retry=0/30/TERM/5/KILL/5 --exec $DAEMON
            [ "$?" = 2 ] && return 2
            rm -f $PIDFILE
            return "$RETVAL"
    }
    
    do_reload() {
            start-stop-daemon --stop --signal USR2 --quiet --pidfile $PIDFILE --name $NAME
            return 0
    }
    
    case "$1" in
        start)
            [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
            do_check $VERBOSE
            case "$?" in
                0)
                    do_start
                    case "$?" in
                        0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                        2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
                    esac
                    ;;
                1) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
            esac
            ;;
        stop)
            [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
            do_stop
            case "$?" in
                    0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                    2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
            esac
            ;;
        status)
            status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
            ;;
        check)
            do_check yes
            ;;
        reload|force-reload)
            log_daemon_msg "Reloading $DESC" "$NAME"
            do_reload
            log_end_msg $?
            ;;
        reopen-logs)
            log_daemon_msg "Reopening $DESC logs" $NAME
            if start-stop-daemon --stop --signal USR1 --oknodo --quiet \
                --pidfile $PIDFILE --exec $DAEMON
            then
                log_end_msg 0
            else
                log_end_msg 1
            fi
            ;;
        restart)
            log_daemon_msg "Restarting $DESC" "$NAME"
            do_stop
            case "$?" in
              0|1)
                    do_start
                    case "$?" in
                            0) log_end_msg 0 ;;
                            1) log_end_msg 1 ;; # Old process is still running
                            *) log_end_msg 1 ;; # Failed to start
                    esac
                    ;;
              *)
                    # Failed to stop
                    log_end_msg 1
                    ;;
            esac
            ;;
        *)
            echo "Usage: $SCRIPTNAME {start|stop|status|restart|reload|force-reload}" >&2
            exit 1
        ;;
    esac
    
    :
  7. スクリプトを実行可能にします。
    chmod +x /opt/php7-fpm-checkconf
    chmod +x /etc/init.d/php7-fpm
  8. バイナリをphp7-fpmという名称で実行できるようにリンクを作ります。
    cd /opt/php7.2.4/sbin
    ln php-fpm php7-fpm
  9. /opt/php7.2.4/lib/php.iniファイルを変更して、大容量のファイル転送が可能な設定にしておきます。
    [PHP]
    pdo_mysql.default_socket=/var/run/mysqld/mysqld.sock
    zend_extension=opcache
    
    memory_limit = 512M
    post_max_size = 16G
    upload_max_filesize = 16G
    max_input_time = 3600
    max_execution_time = 3600
    upload_tmp_dir = /opt/tmp
    output_buffering = 0
    default_charset = 'UTF-8'
    
    [opcache]
    opcache.enable=1
    opcache.enable_cli=1
    opcache.interned_strings_buffer=8
    opcache.max_accelerated_files=10000
    opcache.memory_consumption=128
    opcache.save_comments=1
    opcache.revalidate_freq=1
  10. php7-fpmサービスを有効にします。
    update-rc.d php7-fpm defaults
    update-rc.d php7-fpm enable
    service php7-fpm start

これでphp7-fpmがデーモンとして起動しました。ApacheやNginxからモジュールではなくFastCGIとしてPHPを実行できるようになりました。


nextcloudディレクトリ移動

php7-fpmを使う都合から、/opt/nextcloudディレクトリを、/opt/www/html/nextcloudへ移動しようと思います。

  1. /var/wwwディレクトリを/optに移動します。またtar使ってる・・・
    cd /var
    tar c wwww |tar xv -C /opt
    chown -R wwww-data:www-data /opt/www
  2. nextcloudディレクトリを移動します。
    cd /opt
    mv nextcloud www/html/

Apacheからphp7-fpmを利用してみる

WebサーバーをNginxに変更する前に、Apacheもphp-fpmが使用できるようにしてみます。

  1. /etc/apache2/sites-available/nextcloud.confファイルを変更します。
    Alias /nextcloud "/opt/www/html/nextcloud/"
    <Directory /opt/www/html/nextcloud/>
      Options +FollowSymlinks
      AllowOverride All
    
     <IfModule mod_dav.c>
      Dav off
     </IfModule>
    
     SetEnv HOME /opt/www/html/nextcloud
     SetEnv HTTP_HOME /opt/www/html/nextcloud
    
    Satisfy Any
    Require all granted
    </Directory>
  2. /etc/apache2/conf-available/php7-fpm.confファイルを作成します。
    ProxyPassMatch ^(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/opt/www/html/$1
  3. モジュールとコンフィグレーションを有効にします。
    a2enmod proxy_fcgi
    a2enconf php7-fpm
    service apache reload

これでApacheからphp7-fpmが利用できるようになりました。phpinfo.phpのServerAPI欄がFPM/FastCGIに変わりました。

nextcloudもFastCGIで動作するかと思います。

試しにWindows版のNextcloudクライアントから2GBを超えるファイルをアップロードしてみましたがうまく行きませんでした。php-fpm経由ですので、ApacheのPOST最大サイズ2GBの制限は無いはずですが・・・むむむ。


Nginxインストール

php-fpmが動くことを確認しましたので、いよいよNginxをインストールしてみます。基本的にNextcloud 13 Administration Manualをベースに設定しますが、SSLではなくHTTPで設定しています。インターネットに置くサーバ用途ではなく、自宅のようなイントラネットでの利用向けになります。

  1. Apacheを停止して無効にしておきます。
    service apache stop
    update-rc.d apache disable
  2. apt-getでNginxをインストールします。
    apt-get install nginx
  3. /etc/nginx/sites-available/nextcloudファイルを作成します。server_nameは適宜設定して下さい。
    upstream php-handler {
        server 127.0.0.1:9000;
    }
    server {
        listen 80;
        listen [::]:80;
        server_name nextcloud.local;
        add_header X-Content-Type-Options nosniff;
        add_header X-XSS-Protection "1; mode=block";
        add_header X-Robots-Tag none;
        add_header X-Download-Options noopen;
        add_header X-Permitted-Cross-Domain-Policies none;
        root /opt/www/html/;
        location = /robots.txt {
            allow all;
            log_not_found off;
            access_log off;
        }
        location = /.well-known/carddav {
          return 301 $scheme://$host/nextcloud/remote.php/dav;
        }
        location = /.well-known/caldav {
          return 301 $scheme://$host/nextcloud/remote.php/dav;
        }
        location /.well-known/acme-challenge { }
        location ^~ /nextcloud {
            client_max_body_size 512M;
            fastcgi_buffers 64 4K;
            gzip on;
            gzip_vary on;
            gzip_comp_level 4;
            gzip_min_length 256;
            gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
            gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;
            location /nextcloud {
                rewrite ^ /nextcloud/index.php$uri;
            }
            location ~ ^/nextcloud/(?:build|tests|config|lib|3rdparty|templates|data)/ {
                deny all;
            }
            location ~ ^/nextcloud/(?:\.|autotest|occ|issue|indie|db_|console) {
                deny all;
            }
            location ~ ^/nextcloud/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+)\.php(?:$|/) {
                fastcgi_split_path_info ^(.+\.php)(/.*)$;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param PATH_INFO $fastcgi_path_info;
                fastcgi_param modHeadersAvailable true;
                fastcgi_param front_controller_active true;
                fastcgi_pass php-handler;
                fastcgi_intercept_errors on;
            }
            location ~ ^/nextcloud/(?:updater|ocs-provider)(?:$|/) {
                try_files $uri/ =404;
                index index.php;
            }
            location ~ \.(?:css|js|woff|svg|gif)$ {
                try_files $uri /nextcloud/index.php$uri$is_args$args;
                add_header Cache-Control "public, max-age=15778463";
                add_header X-Content-Type-Options nosniff;
                add_header X-XSS-Protection "1; mode=block";
                add_header X-Robots-Tag none;
                add_header X-Download-Options noopen;
                add_header X-Permitted-Cross-Domain-Policies none;
                access_log off;
            }
            location ~ \.(?:png|html|ttf|ico|jpg|jpeg)$ {
                try_files $uri /nextcloud/index.php$uri$is_args$args;
                access_log off;
            }
        }
    }
  4. サイトを有効化、nginxを再起動して設定を反映します。
    cd /etc/nginx/sites-enabled
    ln -s ../sites-available/nextcloud .
    service nginx restart
    update-rc.d nginx enable

これでApacheからNginxへ変更が完了しました。

試しに2GB以上のファイルをアップロードしてみました。Apacheの時と少し挙動が変わったようです。

ファイルのアップロード中は、どうやらNextcloudのuploadフォルダに10MBに細かく分割されたファイルが蓄積されるようです。

アップロードが完了すると、php-fpmプロセスがファイルの結合を開始するようですが・・・・

あれれ?サイズが2113863680バイトになると、結合中のファイルが突然消えてしまいました。

php-fpmプロセスのエラー内容を見ると、ファイルサイズとして-1が返ってるような?

ということで、2GBを超えるファイルのアップロードはできませんでした。残念です。


サイズが大きいファイルを扱う場合、やはり64ビットのCPUとOSが必要なのかもしれません。

こちらの記事でご紹介させて頂きましたが、64ビットに対応したシングルボードコンピュータやOSが登場しつつあるようです。

2017年4月に発売されたFirefly-RK3399は64ビットのARM Cortex-A72 CPUを搭載しています。またRaspberry Pi 3は、実際に64ビット対応Linuxが何種類か公開されているようです。

これらのハードウェアの動向を見ながら、再度、2GB超のシングルボドコンピュータのNextcloudサーバの構築にチャレンジ(リベンジ?)してみたいと思います。

ちなみに、Raspberry PiのNextcloud専用OSであるNextcloudpiは、2GB以上のファイルのアップロードに対応しています。何か独自の工夫をされているのでしょうね。Nextcloudpiのインストール手順はこちらの記事になります。

スポンサーリンク

フォローする

スポンサーリンク