Website-Icon Sugar Camp

Anleitung: Nginx 1.8.0 als Reverse Proxy auf Debian 7/8

Wie versprochen gibt es heute eine weitere Anleitung und zwar mit Nginx 1.8.0 als Reverse Proxy.

Ich muss ehrlich gestehen, dass ich von Nginx fast mehr begeistert bin als von Squid3 aber das liegt vermutlich nur an den gewohnten Konfigurationen.

Aber was ist Nginx eigentlich? Nichts weiter als ein Webserver wie auch Apache und Co. Nur eben schneller und dabei verbraucht er deutlich weniger Ressourcen als Apache. Selbst 10000 Request pro Sekunde machen Ihm nicht wirklich was aus. Dazu könnt Ihr euch bei Wikepedia und auf der Projekthomepage mehr durchlesen.

Architektur Möglichkeiten

 Nginx kompilieren

Nginx ist natürlich auch in den Paketquellen verfügbar allerdings nur in Version 1.2. und da die aktuelle Stable gerade die 1.8. ist kompilieren wir uns die einfach schnell.

Zuerst installieren wir die notwendigen Programme und laden anschließend die aktuelle Version runter und entpacken sie.

[su_note note_color=“#c1c1b6″]

apt-get install -y openssl make devscripts build-essential libssl-dev
wget http://nginx.org/download/nginx-1.8.0.tar.gz
tar -xzvf nginx-1.8.0.tar.gz

[/su_note]

Anschließend wechseln wir in das neue Verzeichnis und führen den configure Befehl aus

[su_note note_color=“#c1c1b6″]

./configure --sbin-path=/usr/sbin/nginx --user=www-data --group=www-data --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_gunzip_module --with-file-aio --with-threads --with-http_spdy_module --with-http_ssl_module

[/su_note]

Es gibt natürlich noch weitere Module und Plugins aber für einfache Sachen reicht das durchaus aus. Man sollte jedoch beachten, dass man bei Nginx nicht einfach Module hinzu fügen kann wie bei Apache. Es muss dann neu kompiliert werden.

Anschließend nur noch ein make und make install ausführen.

Das war es auch schon. Nun kann man mittels /etc/init.d/nginx starten.

Wem das zu viel Aufwand ist oder wer damit Probleme hat kann sich auch hier kompilierte Debian Pakete downloaden.

Nginx-1.8.0 download

In dem Paket sind mehrere Versionen (Full, Light und Normal). Ich empfehle ganz klar die Version mit dem Zusatz Full zu installieren.

Wem die Version egal ist, kann auch einfach via

[su_note note_color=“#c1c1b6″]apt-get install nginx-full[/su_note]

die Version 1.2 aus den Debian Paketquellen installieren.

 

Nginx Konfiguration

Auch hier gehe ich nicht weiter auf genauere Details ein. Wichtig ist nur, dass ihr eure IP anpasst. Ich gehe in diesem Fall davon aus, dass der Apache auf dem gleichen Server läuft.

[su_note note_color=“#c1c1b6″]

user www-data;
group www-data;
worker_processes 4;
pid /var/run/nginx.pid;

events {
 worker_connections 768;
 # multi_accept on;
}

http {
 sendfile on;
 tcp_nopush on;
 tcp_nodelay on;
 keepalive_timeout 65;
 types_hash_max_size 2048;
 server_tokens off;
 proxy_cache_path /home/cache/static levels=1:2 keys_zone=STATIC:10m inactive=24h max_size=2g;
 proxy_temp_path /home/cache/tmp;
 proxy_cache_lock on;
 include /etc/nginx/mime.types;
 default_type application/octet-stream;
 log_format cache '***$time_local '
 '$upstream_cache_status '
 'Cache-Control: $upstream_http_cache_control '
 'Expires: $upstream_http_expires '
 '"$request" ($status) '
 '"$http_user_agent" ';
 log_format main '$remote_addr - $remote_user [$time_local] "$request" '
 '$status $body_bytes_sent "$http_referer" '
 '"$http_user_agent" "$http_x_forwarded_for"';
 access_log off;
 error_log /var/log/nginx/error.log;
 gzip on;
 gzip_disable "msie6";
 gzip_vary on;
 gzip_proxied any;
 gzip_comp_level 6;
 # gzip_buffers 16 8k;
 gzip_http_version 1.1;
 gzip_types application/x-httpd-php text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
map $http_user_agent $shortua {
*default* anybrowser;
*iPhone* iPhone;
*iPod* iPod;
*Android* Android;
*BB10* BB10;
*BlackBerry* Blackberry;
*webOS* webOS;
*IEMobile/7.0* IEMobile/7.0;
*IEMobile/9.0* IEMobile/9.0;
*IEMobile/10.0* IEMobile/10.0;
*MSIE10.0* MSIE10.0;
*iPad* iPad;
*PlayBook* Playbook;
*Xoom* Xoom; 
*P160U* P160U;
*SCH-I800* SCH-I800;
*Nexus7* Nexus7;
*Touch* Touch;
}
 include /etc/nginx/conf.d/*.conf;
 include /etc/nginx/sites-enabled/*;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header User-Agent $http_user_agent;
proxy_set_header Connection "";
add_header X-Cache-Status $upstream_cache_status;
add_header X-Handled-By $proxy_host;
add_header Cache-Control public;
expires modified +48h;
proxy_cache_key "$scheme://$host$request_uri$is_args$args";
server {
 listen 80;
 listen [::]:80; # auskommentieren falls kein ipv6 vorhanden
 server_name www.sugar-camp.com;
 client_max_body_size 20m;
 access_log /var/log/nginx/sugar-camp-access.log;
error_log /var/log/nginx/sugar-camp-error.log;

 location / {
 proxy_pass http://127.0.0.1:81;
 proxy_cache STATIC;
 proxy_cache_valid 200 12m;
 proxy_cache_use_stale error timeout invalid_header updating
 http_500 http_502 http_503 http_504;
 proxy_send_timeout 180s;
 proxy_read_timeout 180s;

       }
    }
server {

 listen 443 ssl;
 server_name www.sugar-camp.com;

 ssl_certificate /home/ssl/crt.pem;
 ssl_certificate_key /home/ssl/private/privatekey.pem;

 ssl on;
 ssl_session_cache builtin:1000 shared:SSL:10m;
 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
 ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
 ssl_prefer_server_ciphers on;
 client_max_body_size 20m;
 access_log /var/log/nginx/ssl-sugar-camp-access.log;
error_log /var/log/nginx/ssl-sugar-camp-error.log;
 location / {

 proxy_set_header Host $host;
 proxy_cache STATIC;
 proxy_cache_valid 200 10m;
 expires 864000;
 proxy_cache_use_stale error timeout invalid_header updating
 http_500 http_502 http_503 http_504;
 proxy_send_timeout 180s;
 proxy_read_timeout 180s;
 proxy_pass https://127.0.0.1:82;
     }
 }

}

[/su_note]

Das war es auch fast. Alles was Rot markiert ist muss von euch angepasst werden.

 

Als nächstes müsst Ihr natürlich eure Apache Konfiguration anpassen und die Default Ports für den Nginx frei machen.

Das ist je nachdem wo eure config liegt immer anders aber es sollte unter /etc/apache2 sein.

Einfach die Listen Einträge anpassen.

Sollte euer Apache auf einem entfernten Host liegen dann müsst Ihr dort noch das Modul rpaf installieren und das Modul aktivieren.

[su_note note_color=“#c1c1b6″]

Root~: apt-get install libapache2-mod-rpaf
root~: a2enmod rpaf

[/su_note]

Nun mit nano /etc/apache2/mods-available/rpaf.conf folgendes eintragen

[su_note note_color=“#c1c1b6″]

<IfModule rpaf_module>
RPAFenable On

# When enabled, take the incoming X-Host header and
# update the virtualhost settings accordingly:
RPAFsethostname On

# Define which IP’s are your frontend proxies that sends
# the correct X-Forwarded-For headers:
RPAFproxy_ips 185.82.23.62
RPAFproxy_ips 127.0.0.1 ::1

# Change the header name to parse from the default
# X-Forwarded-For to something of your choice:
# RPAFheader X-Real-IP
</IfModule>

[/su_note]

Dann ein

[su_note note_color=“#c1c1b6″]

root~: service apache2 restart

[/su_note]

Das sollte es auch bereits gewesen sein. Dieses Modul sorgt dafür, dass Ihr auch die Client IP Adressen im Log habt und nicht nur noch die 127.0.0.1

Die Header und Useragents werden alle korrekt übergeben an den Apache, sodass dort nach wie vor alles wie gewohnt funktioniert.

 

Der Nginx speichert mit dieser config grundsätzlich alles in einem Cache. Der Cache ist 10 Minuten gültig und erneuert sich dann wieder.

Ihr könnt das natürlich einfach ausprobieren

[su_note note_color=“#c1c1b6″]

curl -X GET -I http://eure-domain.com

[/su_note]

Erscheint dort so etwas wie X-Cache-Status: EXPIRED oder X-Cache-Status: HIT oder X-Cache-Status: MISS dann ist alles in Ordnung.

Expired sagt euch, dass der Cache abgelaufen und ungültig ist. Ruft dazu einfach die Seite im Browser erneut auf um den Cache zu aktualisieren. Dann erhaltet ihr auch den HIT Status.

MISS sagt lediglich das die Seite noch nicht im Cache liegt und dort jetzt abgelegt wird.

 

Das wars auch schon. Fast schon zu einfach 😉 

Viel Spaß beim probieren!

Share it!
Die mobile Version verlassen