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:
- Wijzig de root directory
- Voeg index.php toe aan de index lijn.
- Verander de server_name in je IP adres van je server
- 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:
- Inleiding: De gids: een VPS opzetten van A tot Z
- Welke VPS provider te kiezen
- VPS opzetten bij RamNode
- DNS instellen voor de VPS
- Installeren van Postfix
- Installeren van DKIM icm Postfix
- Installeren van de webserver Nginx, PHP en MySQL
- SFTP server via SSH
- Toegangsbeveiliging met Fail2ban op de VPS
- Monitoren van de VPS server
- Nieuwe website aanmaken in Nginx