Webserver Tips¶
PHP safe mode¶
PHP safe mode has to be turned off. It is deprecated and has been removed in newer PHP versions. Verify its status with PHP Version and Information, and look for safe_mode on/off. If it is on, then add this line to php.ini to turn it off:
safe_mode = Off
Raise max_file_uploads of PHP¶
The PHP setting max_file_uploads within the php.ini defaults to 20 on most environments which allows that number of simultaneous uploads. Currently the ownCloud sync client is doing 3 parallel uploads which means that at least 6 clients can upload files simultaneously. Depending on your server usage it is recommended to raise this number to a higher value.
Enable the SPDY / http_v2 protocol¶
Your webserver can be configured to use the SPDY / http_v2 protocol which could improve the overall performance of ownCloud. Please have a look at the documentation of your webservers module for more information:
Webserver | Module Name / Link |
---|---|
Apache | mod-spdy |
nginx (<1.9.5) | ngx_http_spdy_module |
nginx (+1.9.5) | ngx_http_http2_module |
Note
If you want to enable SPDY for Apache please note the Known Issues of this module to avoid problems after enabling it.
Note
If you want to use http_v2 for nginx you have to check two things:
1.) be aware that this module is not built in by default due to a dependency to the openssl version used on your system. It will be enabled with the --with-http_v2_module configuration parameter during compilation. The dependency should be checked automatically. You can check the presence of http_v2 with nginx -V 2>&1 | grep http_v2 -o. An example how to compile nginx can be found in section “Configure Nginx with the nginx-cache-purge module” below.
2.) When you have used SPDY before, the nginx config has to be changed from listen 443 ssl spdy; to listen 443 ssl http2;
Apache Tuning¶
Maximum number of Apache processes¶
An Apache process uses around 12MB of RAM. Apache should be configured so that the maximum number of HTTPD processes times 12MB is lower than the amount of RAM. Otherwise the system begins to swap and the performance goes down.
KeepAlive should be configured with sensible defaults¶
The KeepAlive directive enables persistent HTTP connections, allowing multiple requests to be sent over the same TCP connection. This reduces latency by as much as 50%. Especially in combination with the periodic checks of the sync client the following settings are recommended:
KeepAlive On
KeepAliveTimeout 100
MaxKeepAliveRequests 200
mod_gzip¶
mod_gzip should be used because it speeds up the transfer of data and helps to free server memory, and HTTP connections are closed faster.
MPM¶
Apache prefork has to be used. Don’t use threaded mpm with mod_php because PHP is currently not thread safe.
Hostname Lookups¶
# cat /etc/httpd/conf/httpd.conf
...
HostnameLookups off
Log files¶
Log files should be switched off for maximum performance.
Comment out the CustomLog directive. Keep ErrorLog to be able to track down errors.
Nginx: caching ownCloud gallery thumbnails¶
One of the optimizations for ownCloud when using Nginx as the webserver is to combine FastCGI caching with “Cache Purge”, a 3rdparty Nginx module that adds the ability to purge content from FastCGI, proxy, SCGI and uWSGI caches. This mechanism speeds up thumbnail presentation as it shifts requests to Nginx and minimizes php invocations which otherwise would take place for every thumbnail presented every time.
The following procedure is based on an Ubuntu 14.04 system. You may need to adapt it according your OS type and release.
Note
Unlike Apache, Nginx does not dynamically load modules. All modules needed must be compiled into Nginx. This is one of the reasons for Nginx´s performance. It is expected to have an already running Nginx installation with a working configuration set up as described in the ownCloud documentation.
Nginx module check¶
As a first step, it is necessary to check if your Nginx installation has the nginx cache purge module compiled in:
nginx -V 2>&1 | grep ngx_cache_purge -o
If your output contains ngx_cache_purge, you can continue with the configuration, otherwise you need to manually compile Nginx with the module needed.
Compile Nginx with the nginx-cache-purge module¶
- Preparation:
cd /opt
wget http://nginx.org/keys/nginx_signing.key
sudo apt-key add nginx_signing.key
sudo vi /etc/apt/sources.list.d/nginx.list
Add the following lines (if different, replace {trusty} by your distribution
name):
deb http://nginx.org/packages/mainline/ubuntu/ trusty nginx
deb -src http://nginx.org/packages/mainline/ubuntu/ trusty nginx
Then run sudo apt-get update
Note
If you’re not overly cautious and wish to install the latest and greatest Nginx packages and features, you may have to install Nginx from its mainline repository. From the Nginx homepage: “In general, you should deploy Nginx from its mainline branch at all times.” If you would like to use standard Nginx from the latest mainline branch but without compiling in any additional modules, just run sudo apt-get install nginx.
- Download the Nginx source from the ppa repository
cd /opt
sudo apt-get build-dep nginx
sudo apt-get source nginx
- Download module(s) to be compiled in and configure compiler arguments
ls -la
Please replace {release} with the release downloaded:
cd /opt/nginx-{release}/debian
If folder “modules” is not present, do:
sudo mkdir modules
cd modules
sudo git clone https://github.com/FRiCKLE/ngx_cache_purge.git
sudo vi /opt/nginx-{release}/debian/rules
If not present, add the following line at the top under:
#export DH_VERBOSE=1:
MODULESDIR = $(CURDIR)/debian/modules
And at the end of every configure command add:
--add-module=$(MODULESDIR)/ngx_cache_purge
Don’t forget to escape preceeding lines with a backslash \. The parameters may now look like:
--with-cc-opt="$(CFLAGS)" \
--with-ld-opt="$(LDFLAGS)" \
--with-ipv6 \
--add-module=$(MODULESDIR)/ngx_cache_purge
- Compile and install Nginx
cd /opt/nginx-{release}
sudo dpkg-buildpackage -uc -b
ls -la /opt
sudo dpkg --install /opt/nginx_{release}~{distribution}_amd64.deb
- Check if the compilation and installation of the ngx_cache_purge module was successful
nginx -V 2>&1 | grep ngx_cache_purge -o
It should now show: ngx_cache_purge
Show Nginx version including all features compiled and installed:
nginx -V 2>&1 | sed s/" --"/"\n\t--"/g
- Mark Nginx to be blocked from further updates via apt-get
sudo dpkg --get-selections | grep nginx
For every nginx component listed run sudo apt-mark hold <component>
- Regular checks for nginx updates
Do a regular visit on the Nginx news page and proceed in case of updates with items 2 to 5.
Configure Nginx with the nginx-cache-purge module¶
- Preparation Create a directory where Nginx will save the cached thumbnails. Use any path that fits to your environment. Replace {path} in this example with your file path:
sudo mkdir -p /usr/local/tmp/cache
- Configuration
sudo vi /etc/nginx/sites-enabled/{your-ownCloud-nginx-config-file}
Add at the beginning, but outside the server{} block:
fastcgi_cache_path {path} levels=1:2 keys_zone=OWNCLOUD:100m inactive=60m;
Add inside the server{} block, as an example of a configuration:
set $skip_cache 1;
# POST requests and urls with a query string should always go to PHP
if ($request_uri ~* "thumbnail.php")
{ set $skip_cache 0;
}
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
location ~ \.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 HTTPS on;
fastcgi_pass php-handler;
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
fastcgi_cache OWNCLOUD;
fastcgi_cache_valid 60m;
}
- Test the configuration
sudo service nginx restart
- Open your browser and clear your cache.
- Logon to your ownCloud instance, open the gallery app, move thru your folders and watch while the thumbnails are generated for the first time.
- You may also watch with eg. htop your system load while the thumbnails are processed.
- Go to another app or logout and relogon.
- Open the gallery app again and browse to the folders you accessed before. Your thumbnails should appear more or less immediately.
- htop will not show up additional load while processing, compared to the high load before.