diff --git a/Nginx/5-Load-Balancer.md b/Nginx/5-Load-Balancer.md new file mode 100644 index 0000000..e3e9fbb --- /dev/null +++ b/Nginx/5-Load-Balancer.md @@ -0,0 +1,128 @@ +# Setting Up Load Balancing with Nginx + +Load balancing with Nginx helps distribute incoming traffic across multiple backend servers, improving the performance, reliability, and availability of your applications. This guide provides a step-by-step process to configure a basic round-robin load balancer using Nginx. + +--- + +## Prerequisites + +- **Nginx Installed**: Ensure Nginx is installed on your server. +- **Root or sudo privileges** to edit configuration files and restart Nginx. +- **Multiple Backend Servers**: Two or more backend servers with applications running. In this example, we use `10.10.10.1` and `10.10.10.2`. + +--- + +## Step 1: Create the Load Balancer Configuration File + +1. **Open a new configuration file** for the load balancer in Nginx’s `sites-available` directory: + ```bash + sudo vim /etc/nginx/sites-available/load_balancer.conf + ``` + +2. **Define the Load Balancer Configuration** + Copy the following configuration into the file. Replace the IP addresses (`10.10.10.1` and `10.10.10.2`) with the actual IP addresses of your backend servers. + + ```nginx + # Define the upstream group of backend servers + upstream backend_servers { + server 10.10.10.1; + server 10.10.10.2; + } + + server { + listen 80; + server_name _; # Accept any hostname or specify a domain name if needed + + location / { + proxy_pass http://backend_servers; # Forward requests to the backend servers group + 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 $scheme; + } + + # Log files + access_log /var/log/nginx/load_balancer_access.log; + error_log /var/log/nginx/load_balancer_error.log; + } + ``` + + ### Explanation of Key Directives + - **upstream**: Defines a pool of backend servers to which Nginx will forward traffic. By default, Nginx uses a round-robin algorithm, sending requests to each server in turn. + - **server_name**: Accepts any hostname (`_`) or a specific domain name. + - **proxy_pass**: Specifies the backend server group defined by `upstream`. + - **proxy_set_header**: Passes client information such as the original IP and protocol to the backend servers. + - **access_log** and **error_log**: Directs logs to specified files for easier monitoring and troubleshooting. + +--- + +## Step 2: Enable the Load Balancer Configuration + +1. **Create a symbolic link** to `sites-enabled` to activate the load balancer configuration in Nginx: + ```bash + sudo ln -s /etc/nginx/sites-available/load_balancer.conf /etc/nginx/sites-enabled/load_balancer.conf + ``` + +2. **Verify Nginx Configuration** + Test the Nginx configuration for syntax errors: + ```bash + sudo nginx -t + ``` + +3. **Reload Nginx** to apply the new configuration: + ```bash + sudo systemctl reload nginx + ``` + +--- + +## Step 3: Test the Load Balancer + +To ensure the load balancer is distributing traffic correctly, you can access the Nginx server’s IP address or domain name in your web browser: +``` +http://your-server-ip/ +``` + +You should see responses from the backend servers. Testing multiple times should show responses alternating between `10.10.10.1` and `10.10.10.2`, as Nginx forwards requests in a round-robin fashion. + +--- + +## Optional: Configure Additional Load Balancing Methods + +Nginx supports multiple load balancing algorithms, which you can specify within the `upstream` block: + +- **Round Robin (default)**: Distributes requests evenly across all servers. +- **Least Connections**: Directs traffic to the server with the fewest active connections. + ```nginx + upstream backend_servers { + least_conn; + server 10.10.10.1; + server 10.10.10.2; + } + ``` + +- **IP Hash**: Directs requests from the same client IP to the same backend server, which can help with session persistence. + ```nginx + upstream backend_servers { + ip_hash; + server 10.10.10.1; + server 10.10.10.2; + } + ``` + +--- + +## Troubleshooting Common Issues + +- **Error: 502 Bad Gateway** + - This error often means that the backend server is unreachable or down. Verify the IP addresses and ensure each backend server is running and accessible. + +- **Permission Denied for Log Files** + - Ensure the log file paths are writable by Nginx. Adjust permissions as needed: + ```bash + sudo chown www-data:www-data /var/log/nginx/load_balancer_access.log + ``` + +- **Configuration Errors** + - Always test configuration changes with `sudo nginx -t` before reloading or restarting Nginx. +