Installeren van de webserver Nginx, PHP en MySQL (VPS deel 6)

NGINX-logo

Als webserver gebruiken we Nginx, deze is duidelijk sneller dan Apache2 en gebruikt minder resources.

MySQL

Maar eerst gaan we de MySQL database installeren, d.m.v. het volgende commando:

$ apt-get install mysql-server

Met dit commando activeren we de database:

$ mysql_install_db

Security van de MySQL nalopen (root wachtwoord hoeft niet veranderd te worden en alle default waardes kunnen gebruikt worden):

$ /usr/bin/mysql_secure_installation

Installeren van nginx

Nginx installeren we met het volgende commando:

$ apt-get install nginx

Start nginx met:

$ service nginx start

Maak de website directory aan:

$ mkdir /var/www

Open de default virtual host file en voer de volgende wijzigingen door:

  1. Wijzig de root directory
  2. Voeg index.php toe aan de index lijn.
  3. Verander de server_name in je IP adres van je server
  4. Wijzig de location sectie toe, zoals hieronder:

Open de default file met vi:

$ vi /etc/nginx/sites-available/default
server {
  listen 80;

  access_log /var/log/nginx/access-example.com.log;
  error_log /var/log/nginx/error-example.com.log error;
  root /var/www/example.com;
  index index.php index.html index.htm;

  server_name 12.23.34.45;

  location / {
    try_files $uri $uri/ /index.html;
  }

  error_page 404 /404.html;

  error_page 500 502 503 504 /50x.html;
  location = /50x.html {
    root /usr/share/nginx/www;
  }
  location ~ \.php$ {
    try_files $uri =404;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php; 
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    include fastcgi_params;
  }
}
[...]

Installeren van PHP

Installeer het volgende:

$ apt-get install php5-fpm php5-mysql php5-curl

Kleine security wijziging in php.ini

$ vi /etc/php5/fpm/php.ini
cgi.fix_pathinfo=0

Mogelijk nog een kleine wijzing, maar kan ook al gewijzigd zijn. Zoek naar “listen =” en wijzig “listen = 127.0.0.1:9000” in:

$ vi /etc/php5/fpm/pool.d/www.conf
listen = /var/run/php5-fpm.sock

Herstart php-fpm:

$ service php5-fpm restart

Testen van de webserver

Maak een phpinfo.php file:

$ echo '<?php phpinfo(); ?>' > /var/www/example.com/phpinfo.php

Herstart nginx:

$ service nginx restart

Test het geheel met: http://example.com/phpinfo.php

Installeren van PHPmyAdmin

Installeren van PHPmyAdmin gaat als volgt: Let op! Geen webserver aanvinken, alleen ok drukken

$ apt-get install phpmyadmin

Kopieer PHPmyAdmin naar de gewenste directory, bijv.:

$ mkdir -p /var/www/example.com/phpmyadmin/
$ cp -R /usr/share/phpmyadmin /var/www/example.com/phpmyadmin/

WWW-directory klaar maken voor gebruik

Nu nog alleen de onderliggende directory’s in www execute vlaggen geven met:

$ find /var/www -type f -exec chmod 664 {} + -o -type d -exec chmod 775 {} +

Om PHP applicaties (zoals Wordpress), ook files te kunnen laten creëeren, doen we het volgende:

$ chown -R www-data:www-data /usr/share/nginx/www/*

Hoe je een website op de server moet zetten met Nginx, zie je hier: www.digitalocean.com/community/tutorials/how-to-set-up-nginx-virtual-hosts-server-blocks-on-ubuntu-12-04-lts–3

Tunen

Nginx tunen

Default staat nginx ingesteld op 4 work_processes, dat is niet altijd nodig. 1 proces / processor is voldoende.

Tel het aantal processors met het volgende commando:

$ grep processor /proc/cpuinfo | wc -l
1

Het aantal gelijktijdige Worker_connecties, kan niet hoger zijn dan het aantal mogelijke filedescriptors.Controleer nu het maximum aantal open file descriptors met:

$ ulimit -n
1024

Wijzig deze waardes in nginx.conf:

$ vi /etc/nginx/nginx.conf
worker_processes 1;
events {
 worker_connections 1024;
 # multi_accept on;
}

In dit voorbeeld hebben we theoretisch 1024 webserver connecties. In de praktijk zullen er wat minder filedescriptors beschikbaar zijn.

Optioneel: Nginx tweaks

Hieronder nog andere mogelijke tweaks, maar dat kan ook later.

Buffers, timeouts en gzip compressie

Voeg de volgende waardes toe aan de http settings in nginx.conf:

$ vi /etc/nginx/nginx.conf
[...]
http {
client_body_buffer_size 10K;
client_header_buffer_size 1k;
client_max_body_size 8m;
large_client_header_buffers 2 1k;

client_body_timeout 12;
client_header_timeout 12;
keepalive_timeout 15;
send_timeout 10;

gzip on;
gzip_comp_level 2;
gzip_min_length 1000;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain application/x-javascript text/xml text/css application/xml;
[...]

Access logging uit

Access logging is niet nodig als je deze niet gebruikt, dus als je Fail2ban niet gebruikt (verderop beschreven) dan kun je deze uitschakelen. In het server segment staat de parameter access_log, zet de logging als volgt uit:

$ vi /etc/nginx/sites-available/default
server {
  listen 80;

  access_log off;
  error_log /var/log/nginx/error.log error;
[...]

Access logging in per virtual host in aparte logfile

In het server segment staat de parameter access_log en error_log. De laatst parameter error geeft het loggingsnivo aan.

$ vi /etc/nginx/sites-available/default
server {
  listen 80;

  access_log /var/log/nginx/access-example.com.log;
  error_log /var/log/nginx/error-example.com.log error;
[...]

File caching

Voeg het volgende aan het server segment toe aan /etc/nginx/sites-available/default

$ vi /etc/nginx/sites-available/default
 location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
 expires 365d;
 }

PHP.ini

Om met PHPmyAdmin grotere files te uploaden, moeten de volgende waarden verhoogd worden:

$ vi /etc/php5/fpm/php.ini
 upload_max_filesize = 50M
 post_max_size = 50M

En moet in nginx.conf wat gewijzigd worden:

$ vi /etc/nginx/nginx.conf
http {
[...]
  client_max_body_size 100m;
[...]
}

Herstart na de wijzigingen nginx en php5-fpm:

$ service php5-fpm restart
$ service nginx restart

Referentie: www.digitalocean.com/community/tutorials/how-to-optimize-nginx-configuration

Optioneel: MySQL tunen

Aan te raden als je een VPS met 128MB RAM hebt, niet nodig als je meer RAM hebt.

Op dit moment zou de webserver gewoon moeten werken, maar kijk maar eens met top:

$ top

En sorteer op geheugengebruik met Shift-M Dan zie je dat MySQL (mysqld) een slordige 15,5% (bij een VPS 256MB) van het geheugen verbruikt.

Hernoem de originele MySQL config file:

$ mv /etc/mysql/my.cnf /etc/mysql/my.cnf.backup

Creëer de config file en zet de daaropvolgende inhoud erin:

$ vi /etc/mysql/my.cnf

# Example MySQL config file for medium systems.
#
# This is for a system with little memory (32M - 64M) where MySQL plays
# an important part, or systems up to 128M where MySQL is used together with
# other programs (such as a web server)
#
# MySQL programs look for option files in a set of
# locations which depend on the deployment platform.
# You can copy this option file to one of those
# locations. For information about these locations, see:
# http://dev.mysql.com/doc/mysql/en/option-files.html
#
# In this file, you can use all long options that a program supports.
# If you want to know which options a program supports, run the program
# with the "--help" option.
#
# The following options will be passed to all MySQL clients
[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock

[mysqld_safe]
socket = /var/run/mysqld/mysqld.sock
nice = 0

# The MySQL server
[mysqld]
user = mysql
port = 3306
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking

#
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address = 127.0.0.1

#
# * Fine Tuning
#
key_buffer_size = 16M
max_allowed_packet = 1M # org: 16M
thread-stack = 192K # tuned was: 256K!
thread-cache-size = 2M # org: 8
myisam-recover = BACKUP
max_connections = 15 # org: 100
#table_cache = 64
#thread_concurrency = 10

#
# * Query Cache Configuration
#
query_cache_limit = 1M
query_cache_size = 2M # org: 16M

# Extra tunings parameters
table_open_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M

skip-innodb
default-storage-engine = MyISAM

slow-query-log
long_query_time = 5

[mysqldump]
quick
quote-names
max_allowed_packet = 16M

[mysql]
# faster start of mysql but no tab completition
no-auto-rehash # Org: commented

[mysqlhotcopy]
interactive-timeout

[isamchk]
key_buffer = 16M

#
# * Logging and Replication
#
# Both location gets rotated by the cronjob.
# Be aware that this log type is a performance killer.
# As of 5.1 you can enable the log at runtime!
#general_log_file = /var/log/mysql/mysql.log
#general_log = 1
#
# Error logging goes to syslog due to /etc/mysql/conf.d/mysqld_safe_syslog.cnf.
#
# Here you can see queries with especially long duration
#log_slow_queries = /var/log/mysql/mysql-slow.log
#long_query_time = 2
#log-queries-not-using-indexes
#
# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
# other settings you may need to change.
#server-id = 1
#log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10
max_binlog_size = 100M
#binlog_do_db = include_database_name
#binlog_ignore_db = include_database_name
#
# * InnoDB
#
# InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/.
# Read the manual for more InnoDB related options. There are many!
#
# * Security Features
#
# Read the manual, too, if you want chroot!
# chroot = /var/lib/mysql/
#
# For generating SSL certificates I recommend the OpenSSL GUI "tinyca".
#
# ssl-ca=/etc/mysql/cacert.pem
# ssl-cert=/etc/mysql/server-cert.pem
# ssl-key=/etc/mysql/server-key.pem

#
# * IMPORTANT: Additional settings that can override those from this file!
# The files must end with '.cnf', otherwise they'll be ignored.
#
!includedir /etc/mysql/conf.d/

Herstart nu MySQL en bekijk het resultaat met top:

$ /etc/init.d/mysql restart

Bij mij was het resultaat van 15,5% naar 4,7%. Dat scheelt!

Bron: keithscode.com/blog/23-running-mysql-on-a-small-128mb-vps.html

De gids “VPS opzetten” bestaat uit de volgende artikelen: