Nginx (Mini How-to)
Nginx (Engine-X) is a very light-weight powerful web proxy server and load balancer. This is a quick how-to on configuring a weighted load balancer using Nginx. I’ll skip past the installation on your system. Mine is currently running on an OpenBSD firewall using Packet Filter, and is how I will be covering the configuration. Nginx is available and work on both Unix and Linux.
Configuring Nginx to start on system boot:
# vi /etc/rc.local
# start nginx if [ -x /usr/local/sbin/nginx ]; then echo -n ' nginx'; /usr/local/sbin/nginx fi
Load balance configuration (one public ip -> 3 private servers):
# vi /etc/nginx/nginx.conf
user nobody; worker_processes 2; worker_rlimit_nofile 10240; error_log /var/log/nginx/error.log; events { worker_connections 8192; } http { upstream site { server 192.168.1.100:80 max_fails=2 fail_timeout=15 weight=3; server 192.168.1.101:80 max_fails=2 fail_timeout=15 weight=3; server 192.168.1.102:80 max_fails=2 fail_timeout=15 weight=1; } upstream site_ssl { server 192.168.1.100:443 max_fails=2 fail_timeout=15 weight=3; server 192.168.1.101:443 max_fails=2 fail_timeout=15 weight=3; server 192.168.1.102:443 max_fails=2 fail_timeout=15 weight=1; } server { listen AAA.BBB.CCC.DDD:80; location / { access_log off; proxy_connect_timeout 15; 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_pass http://site; } } server { listen AAA.BBB.CCC.DDD:443; ssl on; ssl_certificate /etc/ssl/ssl.cert/site.com.crt; ssl_certificate_key /etc/ssl/ssl.key/site.com.key; server_name site.com; location / { access_log off; proxy_connect_timeout 15; 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_PROTO https; proxy_pass http://site_ssl; } } }
Should you have a chain file you need to add it to the end of the certificate file as such:
# cat /path/to/chain.file >> /etc/ssl/ssl.cert/site.com.crt
Packet Filter Firewall Rules:
# vi /etc/pf.conf
site_ext="AAA.BBB.CCC.DDD" site_int1="192.168.1.100" site_int2="192.168.1.101" site_int3="192.168.1.102" pass in quick log on $ext_if inet proto tcp from any to $site_ext port 80 keep state pass in quick log on $ext_if inet proto tcp from any to $corp_ext port 443 keep state pass out quick log on $int_if inet proto tcp from any to $site_int1 port 80 keep state pass out quick log on $int_if inet proto tcp from any to $site_int1 port 443 keep state pass out quick log on $int_if inet proto tcp from any to $site_int2 port 80 keep state pass out quick log on $int_if inet proto tcp from any to $site_int2 port 443 keep state pass out quick log on $int_if inet proto tcp from any to $site_int3 port 80 keep state pass out quick log on $int_if inet proto tcp from any to $site_int3 port 443 keep state
Helpful Nginx server management commands:
Test Nginx Config file:
# nginx -t -c /etc/nginx/nginx.conf
Restart Nginx server:
# kill -HUP `cat /var/run/nginx.pid`
Stop Nginx server:
# kill -QUIT `cat /var/run/nginx.pid`
If your like me and want to keep tabs on the load balancing (as in ipvsadm for Linux ldirectord) you can add a label to the end of each of your firewall rules:
label “[some unique label for this rule]” (i.e. label “site-ext”)
Then using pftop -v label you will see:
RULE LABEL PKTS BYTES STATES MAX ACTION DIR .... 16 site-ext 867991 630495K 11833 Pass In ... 17 site-ext-ssl 29427 13315230 847 Pass In ... 18 site-int-1 13761450 6842062 813483 Pass Out ... 19 site-int-1-ssl 234678 12345 12344 Pass Out ... ....
Here at work we’ve recently been moving off of a Linux/IPTables firewall setup to an OpenBSD/PF firewall. Well, anyone who has worked with firewalls knows the fun time you have with getting FTP to work through them. This includes client and server side. Well, this is my little ‘how-to’ on doing just that with PF and PureFTP.