Difference between revisions of "Nginx"

From HackerNet
Jump to: navigation, search
Tag: visualeditor
 
(25 intermediate revisions by 2 users not shown)
Line 1: Line 1:
nginx är en lättviktig webbserver och proxy.
+
[[Category:Guider]]
 +
Nginx används som webbserver av mer än 60% av världens top 100,000 hemsidor. Men Nginx kan vara mycket mer än bara en webbserver.
 +
Ett litet urval vad Nginx kan användas som:
 +
* Reverse proxy
 +
* Load balancer
 +
* HTTP Cache
 +
* RTMP Server
  
Installation
+
=Installation=
 +
<ul class="nav nav-tabs">
 +
  <li class="active"><btn data-toggle="tab" class="">#tab1|CentOS 7</btn></li>
 +
  <li><btn data-toggle="tab" class="">#tab2|Ubuntu 16.04</btn></li>
 +
</ul>
  
  sudo add-apt-repository ppa:nginx/stable && sudo apt-get update && sudo apt-get install nginx
+
  <div class="tab-content">
 +
  <div id="tab1" class="tab-pane fade in active">
 +
Börja med att installera epel-repot:
 +
yum install epel-release:
 +
Installera Nginx:
 +
yum install nginx
 +
Starta Nginx:
 +
systemctl start nginx
 +
Gör så Nginx startar automatiskt vid reboot:
 +
systemctl enable nginx.service
 +
Lägg till firewalld regler om det behövs.
 +
firewall-cmd --permanent --zone=public --add-service=http
 +
firewall-cmd --permanent --zone=public --add-service=https
 +
firewall-cmd --reload
 +
  </div>
 +
  <div id="tab2" class="tab-pane fade">
 +
Installera Nginx:
 +
apt-get update
 +
apt-get -y install nginx
 +
Kolla så Nginx körs:
 +
systemctl status nginx
 +
  </div>
 +
</div>
 +
=Kommandon=
 +
*Testa om det är en giltig konfiguration innan man startar om nginx:<code>nginx -t</code>
 +
*Ladda om confen utan att starta om nginx:<code>nginx -s reload</code>
  
== Tips n Trix ==
+
=Konfiguration=
Innan en reload/restart av nginx kör följande kommando för att testa om det är en giltig konfiguration:
 
/etc/init.d/nginx configtest
 
Alternativt lägg till en alias för detta:
 
alias configtest='/etc/init.d/nginx configtest'
 
 
==Reverse Proxy==
 
==Reverse Proxy==
 
Nginx fungerar utmärkt som en reverse proxy för webbtrafik.
 
Nginx fungerar utmärkt som en reverse proxy för webbtrafik.
Line 21: Line 52:
 
   include /etc/nginx/proxy_params;
 
   include /etc/nginx/proxy_params;
 
     }
 
     }
 +
  }
 +
==Rewrite & Redirect==
 +
 +
===Tabort www===
 +
Om man inte vill ha www i sin URL så skapar man 2 servrar som man sedan kör en redirect till.
 +
<source lang=bash>
 +
server {
 +
    listen 80;
 +
    server_name domän.se;
 +
}
 +
server {
 +
    listen 80;
 +
    server_name www.domän.se;
 +
    return 301 $scheme://domän.se$request_uri;
 +
}
 +
</source>
 +
 +
===Redirect HTTP till HTTPS===
 +
Här behöver man också skapa 2st server delar.
 +
<source lang=bash>
 +
server {
 +
  listen      80;
 +
  server_name domän.se;
 +
  return 301  https://domän.se$request_uri;
 +
}
 +
server {
 +
  listen      443 ssl;
 +
 +
  # let the browsers know that we only accept HTTPS
 +
  add_header Strict-Transport-Security max-age=2592000;
 +
}
 +
 +
</source>
 +
===Redirect HTTP till HTTPS, ej standardport===
 +
Nginx har en egen HTTP-statuskod för detta.
 +
 +
  server {
 +
  listen      1234 ssl;
 +
  server_name sub.domän.se;
 +
  ...
 +
  error_page  497 https://$host:1234$request_uri;
 +
  ...
 
   }
 
   }
  
 
==HTTPS==
 
==HTTPS==
Konfigurationsexempel med säkerhet i fokus
+
Konfigurationsexempel med säkerhet i fokus.
 +
https://syslink.pl/cipherlist/
  
 
   server {
 
   server {
Line 40: Line 114:
 
   ...
 
   ...
 
   }
 
   }
 +
Generera DH-parametrar med tidtagning. Det tar lång tid!
 +
time openssl dhparam -out /path/to/dhparam.pem 4096
  
===Redirect HTTP till HTTPS===
+
===Nyckelsäkerhet===
 
+
Av säkerhetsskäl bör endast root har rätt att läsa de privata nycklarna. Nginx processer fungerar default enligt:
  server {
+
* 1 nginx master process körs som root
  listen      80;
+
* x nginx workers körs som www-data
  server_name domän.se;
+
Nginx master process läser SSL-nycklarna, inte worker-processerna. Därför fungerar det utmärkt att köra följande.
 
+
  sudo chown root:root certificate.key
  # 301 = permanent redirect, 302 = temporary redirect
+
sudo chmod 400 certificate.key
  return 301 https://domän.se$request_uri;
 
  }
 
  
===Redirect HTTP till HTTPS, ej standardport===
+
===SPDY===
Nginx har en egen HTTP-statuskod för detta.
+
SPDY är ett protokoll utvecklat av Google för att göra HTTPS-handskakning lite snabbare. Alla moderna webbläsare har stöd för det.<br/>
 
+
Din nginx måste vara kompilerad med –with-http_spdy_module.
  server {
+
nginx -V
  listen     1234 ssl;
+
sudo sed -i -r 's/listen 443 ssl/listen 443 ssl spdy/g' /etc/nginx/sites-available/dinSSLsite
  server_name sub.domän.se;
+
sudo service nginx reload
  ...
+
http://SPDYCheck.org
  error_page  497 https://$host:1234$request_uri;
 
  ...
 
  }
 
  
 
== RTMP ==
 
== RTMP ==
Line 68: Line 139:
  
 
  apt-get update && apt-get install build-essential libpcre3 libpcre3-dev libssl-dev
 
  apt-get update && apt-get install build-essential libpcre3 libpcre3-dev libssl-dev
 +
 
Hämta hem senaste versionen av nginx och rtmp modulen.
 
Hämta hem senaste versionen av nginx och rtmp modulen.
 +
 
  wget http://nginx.org/download/nginx-1.7.9.tar.gz
 
  wget http://nginx.org/download/nginx-1.7.9.tar.gz
 +
wget https://github.com/arut/nginx-rtmp-module/archive/master.zip
  
wget https://github.com/arut/nginx-rtmp-module/archive/master.zip
 
 
Packa upp filerna
 
Packa upp filerna
 
  tar -zxvf nginx-1.7.9.tar.gz
 
  tar -zxvf nginx-1.7.9.tar.gz
 
 
  unzip master.zip
 
  unzip master.zip
 +
cd nginx-1.7.9
  
cd nginx-1.7.9
 
 
Lägg sedan till rtmp modulen i nginx.
 
Lägg sedan till rtmp modulen i nginx.
 
  ./configure --add-module=../nginx-rtmp-module-master
 
  ./configure --add-module=../nginx-rtmp-module-master
 
 
  make
 
  make
 +
make install
  
make install
 
 
Om du inte fått några error så är nginx med rtmp modulen installerade.
 
Om du inte fått några error så är nginx med rtmp modulen installerade.
  
Line 103: Line 174:
 
  /usr/local/nginx/sbin/nginx
 
  /usr/local/nginx/sbin/nginx
 
För att stoppa nginx servern.
 
För att stoppa nginx servern.
  /usr/local/nginx/sbin/nginx
+
  /usr/local/nginx/sbin/nginx -s
  
 
Ställ in din klient att streama mot rtmp://<ip>/stream
 
Ställ in din klient att streama mot rtmp://<ip>/stream
 +
 +
==PHP==
 +
För att kunna visa PHP sidor behövs PHP-FastCGI.
 +
apt-get install php5-cli php5-cgi spawn-fcgi php-pear
 +
wget -O /usr/bin/php-fastcgi http://www.linode.com/docs/assets/1548-php-fastcgi-deb.sh && chmod +x /usr/bin/php-fastcgi
 +
wget -O /etc/init.d/php-fastcgi http://www.linode.com/docs/assets/1549-init-php-fastcgi-deb.sh && chmod +x /etc/init.d/php-fastcgi && update-rc.d php-fastcgi defaults
 +
/etc/init.d/php-fastcgi start
 +
 +
Lägg till följande i din conf fil.
 +
<syntaxhighlight lang=apache>
 +
    location ~* \.php$ {
 +
        include fastcgi_params;
 +
        try_files $uri =404;
 +
        fastcgi_pass 127.0.0.1:9000;
 +
        fastcgi_param SCRIPT_FILENAME $request_filename;
 +
    }
 +
</syntaxhighlight>
 +
 +
skapa en php info fil i din rooten på webbservern för att testa din php conf.
 +
<syntaxhighlight lang=php>
 +
echo "<?php phpinfo(); ?>" > info.php
 +
</syntaxhighlight>
 +
 +
==Naxsi==
 +
Third party Nginx-modul, motsvarighet till [[ModSecurity]]. Går att köra i learning mode.
 +
sudo apt-get install nginx-naxsi
 +
 +
 +
= Tips n Trix =
 +
==Fail2ban==
 +
sudo nano /etc/fail2ban/jail.conf
 +
[nginx-http-auth]
 +
enabled = true
 +
 +
==Enable directory listing==
 +
Om du vill att nginx ska lista filerna i en mapp som inte har någon index fil. Lägg följande under
 +
<code>location</code> som du vill lista.
 +
autoindex on;
 +
 +
==Rate Limit==
 +
Man kan begränsa bandbredden för en viss IP eller subnät.
 +
<source lang=bash>
 +
location / {
 +
  if ( $remote_addr ~* 192.100.20.0/24 ) {
 +
    limit_rate 5k;
 +
  }
 +
}
 +
</source>

Latest revision as of 20:34, 21 March 2022

Nginx används som webbserver av mer än 60% av världens top 100,000 hemsidor. Men Nginx kan vara mycket mer än bara en webbserver. Ett litet urval vad Nginx kan användas som:

  • Reverse proxy
  • Load balancer
  • HTTP Cache
  • RTMP Server

Installation

Börja med att installera epel-repot:

yum install epel-release:

Installera Nginx:

yum install nginx

Starta Nginx:

systemctl start nginx

Gör så Nginx startar automatiskt vid reboot:

systemctl enable nginx.service

Lägg till firewalld regler om det behövs.

firewall-cmd --permanent --zone=public --add-service=http 
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload

Installera Nginx:

apt-get update
apt-get -y install nginx

Kolla så Nginx körs:

systemctl status nginx

Kommandon

  • Testa om det är en giltig konfiguration innan man startar om nginx:nginx -t
  • Ladda om confen utan att starta om nginx:nginx -s reload

Konfiguration

Reverse Proxy

Nginx fungerar utmärkt som en reverse proxy för webbtrafik.

Exempel

 server {
 listen 80;
 server_name sub.domän.se;
 location / {
 proxy_pass http://10.0.0.10:3000;
 include /etc/nginx/proxy_params;
    }
 }

Rewrite & Redirect

Tabort www

Om man inte vill ha www i sin URL så skapar man 2 servrar som man sedan kör en redirect till.

server {
    listen 80;
    server_name domän.se;
}
 server {
    listen 80;
    server_name www.domän.se;
    return 301 $scheme://domän.se$request_uri;
 }

Redirect HTTP till HTTPS

Här behöver man också skapa 2st server delar.

server {
  listen      80;
  server_name domän.se;
  return 301  https://domän.se$request_uri;
}
server {
  listen      443 ssl;

  # let the browsers know that we only accept HTTPS
  add_header Strict-Transport-Security max-age=2592000;
}

Redirect HTTP till HTTPS, ej standardport

Nginx har en egen HTTP-statuskod för detta.

 server {
 listen      1234 ssl;
 server_name sub.domän.se;
 ...
 error_page  497 https://$host:1234$request_uri;
 ...
 }

HTTPS

Konfigurationsexempel med säkerhet i fokus.

https://syslink.pl/cipherlist/
 server {
 listen 443 ssl;
 server_name secure.domän.se;
 add_header Strict-Transport-Security max-age=15768000;
 add_header X-Frame-Options DENY;
 add_header X-Content-Type-Options nosniff;
 ssl_certificate         /path/to/cert.crt;
 ssl_certificate_key     /path/to/key.pem;
 ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
 ssl_ciphers 'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!DSS:!RC4';
 ssl_prefer_server_ciphers on;
 ssl_dhparam /path/to/dhparam.pem;
 ...
 }

Generera DH-parametrar med tidtagning. Det tar lång tid!

time openssl dhparam -out /path/to/dhparam.pem 4096

Nyckelsäkerhet

Av säkerhetsskäl bör endast root har rätt att läsa de privata nycklarna. Nginx processer fungerar default enligt:

  • 1 nginx master process körs som root
  • x nginx workers körs som www-data

Nginx master process läser SSL-nycklarna, inte worker-processerna. Därför fungerar det utmärkt att köra följande.

sudo chown root:root certificate.key
sudo chmod 400 certificate.key

SPDY

SPDY är ett protokoll utvecklat av Google för att göra HTTPS-handskakning lite snabbare. Alla moderna webbläsare har stöd för det.
Din nginx måste vara kompilerad med –with-http_spdy_module.

nginx -V
sudo sed -i -r 's/listen 443 ssl/listen 443 ssl spdy/g' /etc/nginx/sites-available/dinSSLsite
sudo service nginx reload

http://SPDYCheck.org

RTMP

Nginx rtmp modul fungerar utmärkt om man vill kunna streama något till 2 platser samtidigt tex till Twitch och Hitbox utan att behöva ha igång 2 instanser av tex OBS/Xsplit.

För att få in RTMP modulen så måste man compilera nginx från början.

apt-get update && apt-get install build-essential libpcre3 libpcre3-dev libssl-dev

Hämta hem senaste versionen av nginx och rtmp modulen.

wget http://nginx.org/download/nginx-1.7.9.tar.gz
wget https://github.com/arut/nginx-rtmp-module/archive/master.zip

Packa upp filerna

tar -zxvf nginx-1.7.9.tar.gz
unzip master.zip
cd nginx-1.7.9

Lägg sedan till rtmp modulen i nginx.

./configure --add-module=../nginx-rtmp-module-master
make
make install

Om du inte fått några error så är nginx med rtmp modulen installerade.

Ändra och lägg till följande rader i din conf fil. /usr/local/nginx/conf/nginx.conf

rtmp {
	server {
		listen 1935;
		chunk_size 8192;

		application stream {
			live on;
			meta copy;
			push rtmp://live-ams.twitch.tv/app/live_XYZ_ZXY;
			push rtmp://live.hitbox.tv/push/username?key=XYZ;
		}
	}
}

För att starta nginx server skriv

/usr/local/nginx/sbin/nginx

För att stoppa nginx servern.

/usr/local/nginx/sbin/nginx -s

Ställ in din klient att streama mot rtmp://<ip>/stream

PHP

För att kunna visa PHP sidor behövs PHP-FastCGI.

apt-get install php5-cli php5-cgi spawn-fcgi php-pear
wget -O /usr/bin/php-fastcgi http://www.linode.com/docs/assets/1548-php-fastcgi-deb.sh && chmod +x /usr/bin/php-fastcgi
wget -O /etc/init.d/php-fastcgi http://www.linode.com/docs/assets/1549-init-php-fastcgi-deb.sh && chmod +x /etc/init.d/php-fastcgi && update-rc.d php-fastcgi defaults
/etc/init.d/php-fastcgi start

Lägg till följande i din conf fil.

    location ~* \.php$ {
        include fastcgi_params;
        try_files $uri =404;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $request_filename;
    }

skapa en php info fil i din rooten på webbservern för att testa din php conf.

echo "<?php phpinfo(); ?>" > info.php

Naxsi

Third party Nginx-modul, motsvarighet till ModSecurity. Går att köra i learning mode.

sudo apt-get install nginx-naxsi


Tips n Trix

Fail2ban

sudo nano /etc/fail2ban/jail.conf
[nginx-http-auth] 
enabled = true

Enable directory listing

Om du vill att nginx ska lista filerna i en mapp som inte har någon index fil. Lägg följande under location som du vill lista.

autoindex on;

Rate Limit

Man kan begränsa bandbredden för en viss IP eller subnät.

 location / {
  if ( $remote_addr ~* 192.100.20.0/24 ) {
    limit_rate 5k;
  }
 }