configuratie

By | 2 juli 2012

Virtual hosts

IPv6 en meerdere virtual hosts in nginx

Nginx is standaard al ipv6 ready maar bij het configuren van meerdere virtual hosts en ipv6 loop je soms tegen een foutmelding aan bij een (re)start van nginx: cannot bound.. enz. Dit is op te lossen door een virtual host als de default host te configureren en aan te geven op welke poort en ipadres geluisterd moet worden:

  server {
      listen 	     80;
      listen       [::]:80 default_server ipv6only=on;
      server_name  domain1.com www.domain1.com ;
      ....
      }

  server {
      listen 	     80;
      listen       [::]:80;
      server_name  domain2.com www.domain2.com ;
      ....
      }

Standaard catch-all virtual host

Om requests naar nginx af te vangen voor niet geconfigureerde domeinen kan een de onderstaande configuratie gebruikt worden. Zo kan een soort landingspagina gebruikt worden om dit soort requests op te vangen of automatisch worden doorverwezen naar een default host:

  http {
   index index.html;

  server {
     listen 80 default;
     server_name _;
     access_log logs/default.access.log main;
     server_name_in_redirect off;
     root  /var/www/html/htdocs/catchall;
    }
  }

Directory beveiligen met basic authentication

Nginx werkt niet zoals Apache met .htaccess files maar kan op een gelijksoortige manier die Apache ook kan middels de configuratie van een (virtual) host een directory met een password (basic authentication) beveiligen. Met de htpasswd util kan op dezelfde manier als voor apache file worden aangemaakt met een user en password. In dit voorbeeld wordt het bestand mypassword.txt aangemaakt in de directory /etc/nginx:

  htpasswd -c /etc/nginx/mypassword.txt piet

Als dit bestand er staat en we de directory /downloads willen beveiligen zodat alleen de user piet erbij kan:

  location /downloads {
      index  index.php index.html;
      root   /var/www/html/mydomain;
      auth_basic            Downloads voor piet;
      auth_basic_user_file  /etc/nginx/mypassword.txt;
  }

Automatisch indexeren van een directory

Voorbeeld om de inhoud van een (download) directory automatisch door nginx te indexeren:

  location /downloads {
  root   /var/www/domain1;
  autoindex on;
  }

In dit geval wordt voor de directory /var/www/domain1/downloads automatisch een index aangemaakt op een soort gelijke wijze als de mod_index module voor Apache doet. Uiteraard dient nginx gecompileerd te zijn met de autoindex module, of dat het geval is kan worden opgevraagd met nginx -V

Problemen met uploaden van bestanden

Indien er problemen zijn met het uploaden van bestanden via een form dan moet voor de desbetreffende (virtual) host de client_max_body_size parameter een waarde krijgen van de maximale grootte. Als bijvoorbeeld uploads tot 50MB mogelijk moeten zijn wordt de volgende regel opgenomen:

  client_max_body_size 50m;

PHP

Installeer spawn-fcgi of download de source met wget http://www.lighttpd.net/download/spawn-fcgi-1.6.3.tar.bz2 Na de installatie (of de compilatie en installatie van de source) kan deze gestart worden zoals in onderstaand voorbeeld:

  /usr/local/bin/spawn-fcgi -a 127.0.0.1 -p 53000 -P /var/run/fastcgi-php.pid -- /usr/bin/php-cgi

In de configuratie van nginx worden de volgende regels opgenomen:

  location ~ \.php$ {
  fastcgi_pass 127.0.0.1:53000;
  fastcgi_index index.php;
  fastcgi_param SCRIPT_FILENAME /var/www/html/$fastcgi_script_name;
  include        fastcgi_params

En vervolgens is uiteraard een restart van nginx nodig om de configuratiewijzigingen actief te maken.

NGINX service script voor systemd

Diverse linux distributies gebruiken systemctl om services te stoppen en te starten. Voordeel is dat er in het startup script afhankelijkheden kunnen worden opgegeven. Het opstartscript staat dan niet meer in /etc/init.d maar in /lib/systemd

Volg onderstaande stappen om NGINX te kunnen stoppen/starten via het service commando:

Maak in /lib/systemd/system een tekstbestand aan met als naam nginx.service en met de volgende inhoud:

 [Unit]
 Description=Nginx - a high performance http(s) server
 After=syslog.target network.target

 [Service]
 Type=forking
 ExecStart=/usr/sbin/nginx
 ExecReload=/usr/sbin/nginx -s reload

 [Install]
 WantedBy=multi-user.target

Maak in /etc/systemd/system/multi-user.target.want een static link naar dit bestand met: ln -s /lib/systemd/system/nginx.service nginx.service Geef het commando systemctl