先日、Cubieboard5でNextcloudサーバを構築してみました。
ハードウェア構成、動作速度ともに特に問題ありませんが、気になるのは取り扱えるファイルサイズが2GBに制限されていることです。
ファイルシステムはext4を使用していますので、HDDまたはSSDに2GB以上のファイルを格納することは可能です。
シングルボードコンピュータのNextcloudで2GBの壁を超えられないかどうか試したい理由から、WebサーバをApacheからNginxに変更してみました。手順を記録しておこうと思います。
目次
Cubieboard5にNginx版Nextcloudをインストール
php-fpm起動設定
前回ビルド・インストールしたphp 7.2.4のphp-fpm用設定ファイルを作成します。
- /opt/php7.2.4/etc/php-fpm.confファイルを作成します。
[global] include=/opt/php7.2.4/etc/php-fpm.d/*.conf
- /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
- テンポラリディレクトリを作成します。
mkdir /opt/tmp chown www-data:www-data /opt/tmp chmod 1777 /opt/tmp
- /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
- /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
- /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 :
- スクリプトを実行可能にします。
chmod +x /opt/php7-fpm-checkconf chmod +x /etc/init.d/php7-fpm
- バイナリをphp7-fpmという名称で実行できるようにリンクを作ります。
cd /opt/php7.2.4/sbin ln php-fpm php7-fpm
- /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
- 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へ移動しようと思います。
- /var/wwwディレクトリを/optに移動します。またtar使ってる・・・
cd /var tar c wwww |tar xv -C /opt chown -R wwww-data:www-data /opt/www
- nextcloudディレクトリを移動します。
cd /opt mv nextcloud www/html/
Apacheからphp7-fpmを利用してみる
WebサーバーをNginxに変更する前に、Apacheもphp-fpmが使用できるようにしてみます。
- /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>
- /etc/apache2/conf-available/php7-fpm.confファイルを作成します。
ProxyPassMatch ^(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/opt/www/html/$1
- モジュールとコンフィグレーションを有効にします。
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で設定しています。インターネットに置くサーバ用途ではなく、自宅のようなイントラネットでの利用向けになります。
- Apacheを停止して無効にしておきます。
service apache stop update-rc.d apache disable
- apt-getでNginxをインストールします。
apt-get install nginx
- /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; } } }
- サイトを有効化、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のインストール手順はこちらの記事になります。