Create an nginx load balancer

I wanted to play with a simple load balancer with powerful implications. A load balancer using nginx as the front end and two apache servers on the backend.

server1 – apache – 192.168.1.89 (CentOS 6)

yum -y install httpd
echo server1 /var/www/html/index.html
lokkit -s http -s https
chkconfig httpd on && service httpd restart

server2 – apache -192.168.1.90 (CentOS 6)

yum -y install httpd
echo server2 /var/www/html/index.html
lokkit -s http -s https
chkconfig httpd on && service httpd restart

load balancer – nginx – 192.168.1.88 (CentOS 6/7/8)

Add the nginx repository (CentOS 6/7)

echo '[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1' > /etc/yum.repos.d/nginx.repo

Install nginx (CentOS 6/7/8)

yum install nginx

Apply Firewall Rules (CentOS 6/7/8)

# CentOS 6
lokkit -s http -s https

# CentOS 7/8 (The following approach will not disrupt the firewalld service)
firewall-cmd --permanent --add-service={http,https} 
firewall-cmd --add-service={http,https} 

SELinux may reap havoc, an boolean needs to be enabled.

setsebool -P httpd_can_network_connect on

Backup the default.conf file. (CentOS 6/7)

cp /etc/nginx/conf.d/default.conf{,.original}

Modify the default.conf file.

vi /etc/nginx/conf.d/default.conf

Add to the top the upstream section and under location below the two proxy* lines.

upstream web_backend {
#       ip_hash;
        server 192.168.1.89;
        server 192.168.1.90;
        }

server {
    listen       80;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://web_backend;
    }

Or a more automated approach. Not pretty but works.

sed -i.original'/\ \ \ \ \ \ \index/a\ \ \ \ \ \ \ \ \proxy_pass http://web_backend;' /etc/nginx/conf.d/default.conf
sed -i '/\ \ \ \ \ \ \index/a\ \ \ \ \ \ \ \ \proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;' /etc/nginx/conf.d/default.conf

cat > /tmp/default /dev/stdin /etc/nginx/conf.d/default.conf << EOF
upstream web_backend {
        server 192.168.1.89;
        server 192.168.1.90;
        }
		
EOF
/bin/cp /tmp/default /etc/nginx/conf.d/default.conf

Restart nginx.

# CentOS 6
chkconfig nginx on && service nginx start

# CentOS 7/8
systemctl enable --now nginx
nginx-load-balancer

Using your favorite web-browser, type in http://192.168.1.88 and refresh the page a few times to see the text change from server1 to server2.

Source(s)

  • https://www.nginx.com/resources/admin-guide/reverse-proxy/
  • https://www.nginx.com/resources/wiki/start/topics/tutorials/install/
  • http://think-devops.blogspot.com/2013/03/nginx-crumbs.html
  • https://unix.stackexchange.com/questions/99350/how-to-insert-text-before-the-first-line-of-a-file