Installera och konfigurera Nginx för WordPress

Installera och konfigurera Nginx för WordPress

NginxJag har nyligen gått över till att använda Nginx som webbserver på min VPS istället för Apache. Anledningen till att jag bytte är att Nginx är betydligt snålare med resurser, och betydligt snabbare än Apache. Dessutom kan du relativt enkelt konfigurera och optimera Nginx för webbplatser som drivs med WordPress, så att dessa blir riktigt snabba.

Jag vill poängtera att jag inte är någon expert på webbservrar, men har av eget intresse lärt mig en del under åren. Det jag beskriver här nedanför är resultat av mina erfarenheter. Det finns säkert saker och ting som kan göras annorlunda och bättre. Har du synpunkter blir jag glad om du delar med dig av dessa i kommentarerna.

Nginx är snål och snabb

Min Nginx-server drar ca. 40% av 512 Mb ram. Apache drog med samma antal webbplatser och konfigurerad med fast-cgi ca 55% av 1 Gb ram. Som jag sa tidigare så laddar sidorna mycket snabbare också, dubbelt så snabbt faktiskt på de enstaka tester jag gjort hittills. Jag använder en VPS hos GleSYS som jag är mycket nöjd med så här långt. Som OS på servern använder Debian 6 32-bit. Vid ett belastningstest jag gjorde så fick jag enligt kunnig person, bra resultat. Ni hittar testet här!

Hur man sätter upp en VPS hos GleSYS och hur du installerar Debian tänker jag inte gå igenom här. En mycket bra videoguide för detta hittar du hos Webbkillen. I Webbkillens video installerar han Debian 5, jag rekommenderar att du installerar Debian 6 32-bitars. Jag förutsätter att du också har installerat MySQL samt pekat en domän mot det IP-nummer du valde när du skapade din VPS. Om inte, gör det innan du fortsätter.

I konfigurationsexemplen använder jag benämningar som ”webplatsnamn” och ”exempeldomän”. Dessa ska du naturligtvis ersätta med det som gäller för din konfiguration.

Installera Nginx

Då jag använder Debian 6 så är också de kommandon jag visar Debian-kommandon. Ni som använder andra distar av Linux vet nog hur ni ska göra.

Till att börja med ska vi lägga till Dotbebs repositorier för att få tillgång till de senaste högprestandapaketen. Du öppnar /etc/apt/sources.list och lägger till nedanstående repositorier.

nano /etc/apt/sources.list
deb http://packages.dotdeb.org stable all
deb-src http://packages.dotdeb.org stable all

Efter detta uppdaterar du repositorierna.

apt-get update

Nu har vi kommit dit där det är dags att installera Nginx, PHP-FPM, MySQL och APC.
Detta gör du genom nedanstående kommando.

apt-get install nginx-full php5-fpm php5 php5-mysql php5-apc php5-mysql php5-xsl php5-xmlrpc php5-sqlite php5-snmp php5-curl

Du får frågan om du vill installera och det är bara att acceptera. Sedan ser apt-get till att alla beroenden blir installerade. När installationen kommer till MySQL blir du tillfrågad att sätta ett lösenord för root, se till att du gör det.

Konfigurera Nginx och PHP-FPM

Innan du konfigurerar Nginx måste du bestämma var du vill att dina webbplatser ska placeras på servern. Jag använder /var/www/webbplatsnamn/public_html. Filerna i root för webbplatsen måste köras av samma användare och grupp som Nginx, som med Debian är www-data. Du skapar nödvändiga kataloger och sätter ägare och grupp med nedanstående kommandon.

mkdir /var/www /var/www/webbplatsnamn /var/www/webbplatsnamn/public_html
chown www-data:www-data /var/www/webbplatsnamn/public_html -R

Nu har vi kommit till nästa steg som är att konfigurera Nginx. Konfigurationsfilen för Nginx finns här /etc/nginx/nginx.conf.
Jag har använt mig av de konfigurationsexempel som finns hos WordPress Codex.
Du öppnar konfigurationsfilen och ersätter den med nedanstående kod.

nano /etc/nginx/nginx.conf
# Generic startup file.
user www-data www-data;
worker_processes  6;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

# Keeps the logs free of messages about not being able to bind().
#daemon     off;

events {
	worker_connections  6144;
}

http {
#	rewrite_log on;

	include mime.types;
	default_type       application/octet-stream;
	access_log         /var/log/nginx/access.log;
	sendfile           on;
#	tcp_nopush         on;
	keepalive_timeout  3;
#	tcp_nodelay        on;
#	gzip               on;
	client_max_body_size 13m;
	index              index.php index.html index.htm;

	# Upstream to abstract backend connection(s) for PHP.
	upstream php {
		server unix:/tmp/php-fpm.sock;
#		server 127.0.0.1:9000;
	}

	include /etc/nginx/sites-enabled/*;
}

Sedan trycker du ctrl+xy och enter för att spara filen.

När det gäller worker_processes och worker_connections så är standardvärdet för worker_processes 2 och för worker_connections 1024. En worker process är enkeltrådsprocess. Du sätter antal worker_processes efter hur många CPU eller kärnor som din VPS har. Den server jag använder har 1 CPU med 6 kärnor, därför har jag satt worker_processes 6;. Worker connection är det antal klienter som kan ansluta till en enkeltrådad process. För att få detta rätt tar du standardvärdet 1024 gånger antalet worker processes du har. I mitt fall 6 * 1024 = 6144.

Du kan enkelt kolla hur många CPU eller kärnor din VPS har genom nedanstående kommando.

cat /proc/cpuinfo

Vi ska också skapa en fil med parametrar för fastcgi.

nano /etc/nginx/fastcgi_params

Placera nedanstående kod i filen.

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

Sedan ska vi göra en ändring i php.ini. Långt ner i filen under ”Paths and Directories” hittar vi ;cgi.fix_pathinfo = 1 som är bortkommenterad. Ta bort semikolonet framför och ändra 1 till 0. Spara sedan filen.

nano /etc/php5/fpm/php.ini

Du måste även redigera filen /etc/php5/fpm/pool.d/www.conf. Den filen ska ha följande innehåll:

; Start a new pool named 'www'.
; the variable $pool can we used in any directive and will be replaced by the
; pool name ('www' here)
[www]

; listen = 127.0.0.1:9000
listen = /tmp/php-fpm.sock
listen.backlog = -1
listen.owner = www-data
listen.group = www-data
listen.mode = 0666
user = www-data
group = www-data
pm = dynamic
pm.max_children = 10
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 2
pm.max_requests = 50
request_slowlog_timeout = 60s
slowlog = /var/log/php-fpm.log.slow

Spara filen och starta om php vilket vi gör med nedanstående kommando.

/etc/init.d/php5-fpm restart

Webbplatskonfiguration

Nu har vi kommit till konfiguration av webbplats. Detta ska vi göra på lite annorlunda sätt än de flesta Nginx-konfigurationer. Vi kommer att göra det enligt Ubuntu/Debian med sites-available och sites-enabled. Det blir lite mer jobb till att börja med, men det blir enklare att hantera webbplatser sedan.

Nästa steg är att skapa konfigurationsfilen för den första webbplatsen.

nano /etc/nginx/sites-available/webbplatsnamn

I konfigurationsfilen för webbplatsen placerar du följande kod.

# Redirect everything to the main site.
server {
	server_name exempeldoman.se *.exempeldoman.se;
	root /var/www/webbplatsnamn/public_html;

	if ($http_host != "exempeldoman.se") {
		rewrite ^ http://exempeldoman.se$request_uri permanent;
	}

	include global/restrictions.conf;

	# Additional rules go here.

	# Only include one of the files below.
	include global/wordpress.conf;
#	include global/wordpress-ms-subdir.conf;
#	include global/wordpress-ms-subdomain.conf;
}

Nästa steg är att länka filen du nyss skapade till /etc/nginx/sites-enabled. I och med att du gör detta kan du behålla konfigurationsfilen för en webbplats även om du vill ta den offline. Du raderar bara länken i sites-enabled. Du skapar en länk genom nedanstående kommando.

ln -s /etc/nginx/sites-available/webbplatsnamn /etc/nginx/sites-enabled/webbplatsnamn

Konfigurationsfiler för WordPress

Nu är det dags att skapa konfigurationsfilerna för WordPress. Först ska vi skapa en ny katalog där vi ska placera konfigurationsfilerna. Vi skapar katalogen /etc/nginx/global.

mkdir /etc/nginx/global

Där skapar vi först filen restrictions.conf

nano /etc/nginx/global/restrictions.conf

I denna fil placerar du följande kod.

# Global restrictions configuration file.
# Designed to be included in any server {} block.</p>
location = /favicon.ico {
	log_not_found off;
	access_log off;
}

location = /robots.txt {
	allow all;
	log_not_found off;
	access_log off;
}

# Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac).
location ~ /\. {
	deny all;
	access_log off;
	log_not_found off;
}

Spara filen och skapa sedan wordpress.conf.

nano /etc/nginx/global/wordpress.conf

Placera nedanstående kod i filen.

# WordPress single blog rules.
# Designed to be included in any server {} block.

# This order might seem weird - this is attempted to match last if rules below fail.
# http://wiki.nginx.org/HttpCoreModule
location / {
	try_files $uri $uri/ /index.php?$args;
}

# Add trailing slash to */wp-admin requests.
rewrite /wp-admin$ $scheme://$host$uri/ permanent;

# Directives to send expires headers and turn off 404 error logging.
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
	expires 24h;
	log_not_found off;
}

# Uncomment one of the lines below for the appropriate caching plugin (if used).
#include global/wordpress-wp-super-cache.conf;
include global/wordpress-w3-total-cache.conf;

# Pass all .php files onto a php-fpm/php-fcgi server.
location ~ \.php$ {
	# Zero-day exploit defense.
	# http://forum.nginx.org/read.php?2,88845,page=3
	# Won't work properly (404 error) if the file is not stored on this server, which is entirely possible with php-fpm/php-fcgi.
	# Comment the 'try_files' line out if you set up php-fpm/php-fcgi on another machine.  And then cross your fingers that you won't get hacked.
	try_files $uri =404;

	fastcgi_split_path_info ^(.+\.php)(/.+)$;
	include fastcgi_params;
	fastcgi_index index.php;
	fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#	fastcgi_intercept_errors on;
	fastcgi_pass php;
}

Spara filen.

Utöver detta använder jag även W3 Total Cache. Om du vill använda det också skapar du filen wordpress-w3-total-cache.conf. Om du inte kommer att använda W3 Total Cache måste du kommentera bort include global/wordpress-w3-total-cache.conf; i ovanstående fil.

nano /etc/nginx/global/wordpress-w3-total-cache.conf

I denna fil placerar du följande kod.

# BEGIN W3TC Browser Cache
gzip on;
gzip_types text/css application/x-javascript text/richtext image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon;
location ~ \.(css|js)$ {
    expires 31536000s;
    add_header Pragma "public";
    add_header Cache-Control "max-age=31536000, public, must-revalidate, proxy-revalidate";
    add_header X-Powered-By "W3 Total Cache/0.9.2.3";
}
location ~ \.(html|htm|rtf|rtx|svg|svgz|txt|xsd|xsl|xml)$ {
    expires 180s;
    add_header Pragma "public";
    add_header Cache-Control "max-age=180, public, must-revalidate, proxy-revalidate";
    add_header X-Powered-By "W3 Total Cache/0.9.2.3";
}
location ~ \.(asf|asx|wax|wmv|wmx|avi|bmp|class|divx|doc|docx|exe|gif|gz|gzip|ico|jpg|jpeg|jpe|mdb|mid|midi|mov|qt|mp3|m4a|mp4|m4v|mpeg|mpg|mpe|mpp|odb|odc|odf|odg|odp|ods|odt|ogg|pdf|png|pot|pps|ppt|pptx|ra|ram|swf|tar|tif|tiff|wav|wma|wri|xla|xls|xlsx|xlt|xlw|zip)$ {
    expires 31536000s;
    add_header Pragma "public";
    add_header Cache-Control "max-age=31536000, public, must-revalidate, proxy-revalidate";
    add_header X-Powered-By "W3 Total Cache/0.9.2.3";
}
# END W3TC Browser Cache
# BEGIN W3TC Skip 404 error handling by WordPress for static files
if (-f $request_filename) {
    break;
}
if (-d $request_filename) {
    break;
}
if ($request_uri ~ "(robots\.txt|sitemap(_index|[0-9]+)?\.xml(\.gz)?)") {
    break;
}
if ($request_uri ~* \.(css|js|html|htm|rtf|rtx|svg|svgz|txt|xsd|xsl|xml|asf|asx|wax|wmv|wmx|avi|bmp|class|divx|doc|docx|exe|gif|gz|gzip|ico|jpg|jpeg|jpe|mdb|mid|midi|mov|qt|mp3|m4a|mp4|m4v|mpeg|mpg|mpe|mpp|odb|odc|odf|odg|odp|ods|odt|ogg|pdf|png|pot|pps|ppt|pptx|ra|ram|swf|tar|tif|tiff|wav|wma|wri|xla|xls|xlsx|xlt|xlw|zip)$) {
    return 404;
}
# END W3TC Skip 404 error handling by WordPress for static files

Testa servern

Nu är det dags att testa servern. Du börjar med att starta om servern med nedanstående kommando.

touch /var/www/webbplatsnamn/public_html/index.php
echo '<?php echo "<h1>Nginx Baby - It WORKS!</h1>"; ?>' >> /var/www/webbplatsnamn/public_html/index.php
/etc/init.d/nginx start

Om allt är som det ska så har Nginx startat utan att du fått några varningar. Öppna nu en webbläsare och surfa till din domän. Om allt fungerar ska du få upp texten ”Nginx Baby – It WORKS!”.

Fortsättning

Det jag mer har gjort för att förenkla hanteringen av webbplatser är att installera phpMyAdmin för hantering av databaser. Hur du enklast installerar phpMyAdmin på en Nginx-server kan du läsa hos Andreas Bergman. Utöver en guide hur du installerar phpMyAdmin så hittar du många tips för Nginx hos Andreas.

Till att börja med installerade jag vsftpd som är en ftp-server, för att kunna hantera filer på webbservern, men nu använder jag inte ftp längre utan jag använder SFTP som är betydligt säkrare. Tanken är att jag även ska skriva en artikel om hur du använder SFTP och hur du installerar WordPress på din webbserver. Den artikeln kommer så fort jag får tid att skriva den.

Som jag sa i början, hittar ni något som är galet eller som kan göras bättre, berätta gärna det i kommentarerna.

Lycka till!

 

Jag heter Stefan Johansson. Här på StefanJson.se bloggar jag i huvudsak om webb- och IT-relaterat men jag kommer också att skriva om andra ämnen.Follow @smyckenforalla

11 kommentarer på “Installera och konfigurera Nginx för WordPress

    • Virtualmin i sig tror jag inte påverkar prestandan nämnvärt, däremot gör Apache det.
      Jag skulle rekommendera dig att börja om med en ny VPS där du installerar Debian 6 32-bit och sedan Nginx. Då slipper du bland annat avinstallera Apache. Vill du fortsätta med den VPS du har så bör du avinstallera Virtualmin, och sedan även Apache om inte den avinstalleras med Virtualmin.

  1. Tack för denna. Jag har också NGINX på Glesys VPS och det tog ett tag innan jag fick upp den då jag fick söka och använda flera howto’s innan jag fick till det. Såg även ett misstag som jag gjort kring worker_processes där jag satt det till en då jag trodde att jag hade en processor, en tankevurpa helt enkelt. Nu ska jag in och ändra 🙂

  2. Jag ändrade till 6 worker_processes och 6144 worker_connections med då får jag ett varningsmeddelande när jag start nginx

    Starting Web Server: nginxnginx: [warn] 6144 worker_connections are more than open file resource limit: 1024

    Har du någon aning vad det är och hur man får bort det?

    • Hej Jens!

      Ursäkta för sent svar!

      Jag hade samma tillvägagångssätt som dig. Jag rotade runt på internet som den innan jag fick till det. Det är också anledningen till den här bloggposten. Att andra inte ska behöva leta ihjäl sig.

      Ditt problem har jag inte råkat ut för hittills. Har du några begränsningar i /etc/security/limits.conf?

  3. Nä, allt är bortkommenterat i den filen. Jag kollade lite på nätet och det verkar ha nått med nginx att göra men kunde inte hitta någon lösning.

    • Har du tittat i /var/log/nginx/error.log och vad som kan finnas där? Om du vill kan du skicka över logg-filen kan jag ta en titt på den. Du kan maila den till stefan [@] dreamrooms.se.

Lämna ett svar

Din e-postadress kommer inte publiceras.

*