Installera och konfigurera Nginx för WordPress

Jag 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+x, y 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!
Nybloggat! Installera och konfigurera Nginx för WordPress http://t.co/wGMEDzjF #wpse #svseo #affiliatese
@a_bergman och @webbkillen ni har blivit omnämnda i http://t.co/wGMEDzjF 🙂
Jag måste först avinstallera virtualmin innan jag kör igenom detta?
Annars verkar ju detta bra då prestandan var dålig i virtualmin.
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.
Tack Stefan för guiden, nu kör jag Nginx. Jag ser fram emot fler artiklar inom ämnet!
Hej Benny!
Roligt att du hade nytta av guiden!
Det kommer med största sannolikhet fler artiklar i ämnet, jag bara vet inte när. 🙂
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 🙂
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?
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.