Linux Web Server Setup: Complete Apache & Nginx Guide

Master Linux web server setup with our comprehensive guide covering Apache and Nginx installation, SSL configuration, and security best practices.

How to Set Up a Web Server on Linux: Complete Apache & Nginx Guide

Meta Description: Learn how to set up a Linux web server with Apache and Nginx. Complete guide with installation, SSL configuration, security tips, and troubleshooting for web hosting.

Setting up a web server on Linux is a fundamental skill for developers, system administrators, and anyone looking to host websites or web applications. This comprehensive guide will walk you through the process of installing and configuring both Apache and Nginx web servers on Linux, covering everything from basic setup to advanced security configurations.

Table of Contents

1. [Understanding Linux Web Servers](#understanding-linux-web-servers) 2. [Apache Web Server Setup](#apache-web-server-setup) 3. [Nginx Web Server Setup](#nginx-web-server-setup) 4. [SSL Certificate Configuration](#ssl-certificate-configuration) 5. [Security Best Practices](#security-best-practices) 6. [Performance Optimization](#performance-optimization) 7. [Troubleshooting Common Issues](#troubleshooting-common-issues) 8. [FAQ](#faq)

Understanding Linux Web Servers

A Linux web server is a computer system that runs Linux and serves web content to clients over the internet. The two most popular web server software options are Apache HTTP Server and Nginx, each with distinct advantages:

Apache is feature-rich, highly configurable, and supports a wide range of modules. It's ideal for complex hosting environments and offers excellent .htaccess support.

Nginx excels in performance, particularly for serving static content and handling concurrent connections. It's lightweight and perfect for high-traffic websites.

System Requirements

Before setting up your Linux web server, ensure your system meets these minimum requirements: - Ubuntu 20.04 LTS or CentOS 8+ (or similar distributions) - 1GB RAM (2GB+ recommended) - 20GB available disk space - Root or sudo access - Stable internet connection

Apache Web Server Setup

Installing Apache on Ubuntu/Debian

First, update your package manager and install Apache:

`bash

Update package index

sudo apt update

Install Apache

sudo apt install apache2 -y

Start and enable Apache

sudo systemctl start apache2 sudo systemctl enable apache2

Check Apache status

sudo systemctl status apache2 `

Installing Apache on CentOS/RHEL

`bash

Update system packages

sudo yum update -y

Install Apache (httpd)

sudo yum install httpd -y

Start and enable Apache

sudo systemctl start httpd sudo systemctl enable httpd

Check Apache status

sudo systemctl status httpd `

Configuring Apache

#### Basic Apache Configuration

The main Apache configuration file is located at: - Ubuntu/Debian: /etc/apache2/apache2.conf - CentOS/RHEL: /etc/httpd/conf/httpd.conf

Create your first virtual host:

`bash

Create a new virtual host file

sudo nano /etc/apache2/sites-available/yourdomain.com.conf `

Add the following configuration:

`apache ServerName yourdomain.com ServerAlias www.yourdomain.com DocumentRoot /var/www/yourdomain.com/html ErrorLog ${APACHE_LOG_DIR}/yourdomain.com_error.log CustomLog ${APACHE_LOG_DIR}/yourdomain.com_access.log combined Options Indexes FollowSymLinks AllowOverride All Require all granted `

Enable the site and restart Apache:

`bash

Create document root directory

sudo mkdir -p /var/www/yourdomain.com/html

Set proper permissions

sudo chown -R www-data:www-data /var/www/yourdomain.com/html sudo chmod -R 755 /var/www/yourdomain.com

Enable the site

sudo a2ensite yourdomain.com.conf

Restart Apache

sudo systemctl restart apache2 `

Testing Apache Installation

Create a test HTML file:

`bash sudo nano /var/www/yourdomain.com/html/index.html `

Add this content:

`html

Apache Web Server Successfully Configured!

Your Linux web server with Apache is running correctly.

`

Nginx Web Server Setup

Installing Nginx

#### Ubuntu/Debian Installation

`bash

Update package index

sudo apt update

Install Nginx

sudo apt install nginx -y

Start and enable Nginx

sudo systemctl start nginx sudo systemctl enable nginx

Check Nginx status

sudo systemctl status nginx `

#### CentOS/RHEL Installation

`bash

Install EPEL repository

sudo yum install epel-release -y

Install Nginx

sudo yum install nginx -y

Start and enable Nginx

sudo systemctl start nginx sudo systemctl enable nginx

Open firewall ports

sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --permanent --add-service=https sudo firewall-cmd --reload `

Configuring Nginx

#### Basic Nginx Configuration

Create a server block configuration:

`bash sudo nano /etc/nginx/sites-available/yourdomain.com `

Add this configuration:

`nginx server { listen 80; listen [::]:80; server_name yourdomain.com www.yourdomain.com; root /var/www/yourdomain.com/html; index index.html index.htm index.nginx-debian.html; location / { try_files $uri $uri/ =404; } # Logging access_log /var/log/nginx/yourdomain.com.access.log; error_log /var/log/nginx/yourdomain.com.error.log; # Security headers add_header X-Frame-Options "SAMEORIGIN" always; add_header X-XSS-Protection "1; mode=block" always; add_header X-Content-Type-Options "nosniff" always; } `

Enable the configuration:

`bash

Create symbolic link

sudo ln -s /etc/nginx/sites-available/yourdomain.com /etc/nginx/sites-enabled/

Test Nginx configuration

sudo nginx -t

Reload Nginx

sudo systemctl reload nginx `

SSL Certificate Configuration

Installing Let's Encrypt SSL Certificate

#### For Apache

`bash

Install Certbot

sudo apt install certbot python3-certbot-apache -y

Obtain SSL certificate

sudo certbot --apache -d yourdomain.com -d www.yourdomain.com

Test automatic renewal

sudo certbot renew --dry-run `

#### For Nginx

`bash

Install Certbot for Nginx

sudo apt install certbot python3-certbot-nginx -y

Obtain SSL certificate

sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com

Verify automatic renewal

sudo certbot renew --dry-run `

Manual SSL Configuration

If you have your own SSL certificates, configure them manually:

#### Apache SSL Configuration

`apache ServerName yourdomain.com DocumentRoot /var/www/yourdomain.com/html SSLEngine on SSLCertificateFile /path/to/your/certificate.crt SSLCertificateKeyFile /path/to/your/private.key SSLCertificateChainFile /path/to/your/ca_bundle.crt # Security headers Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" Header always set X-Frame-Options DENY Header always set X-Content-Type-Options nosniff `

#### Nginx SSL Configuration

`nginx server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name yourdomain.com www.yourdomain.com; root /var/www/yourdomain.com/html; ssl_certificate /path/to/your/certificate.crt; ssl_certificate_key /path/to/your/private.key; # SSL configuration ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512; ssl_prefer_server_ciphers off; # Security headers add_header Strict-Transport-Security "max-age=63072000" always; } `

Security Best Practices

Firewall Configuration

Configure UFW (Uncomplicated Firewall) for basic protection:

`bash

Enable UFW

sudo ufw enable

Allow SSH (if using remote access)

sudo ufw allow ssh

Allow HTTP and HTTPS

sudo ufw allow 'Apache Full' # For Apache

OR

sudo ufw allow 'Nginx Full' # For Nginx

Check firewall status

sudo ufw status `

Securing Apache

Create a security configuration file:

`bash sudo nano /etc/apache2/conf-available/security.conf `

Add these security directives:

`apache

Hide Apache version

ServerTokens Prod ServerSignature Off

Prevent access to .htaccess files

Require all denied

Disable server-side includes

Options -Includes Options -ExecCGI

Prevent clickjacking

Header always append X-Frame-Options SAMEORIGIN

XSS Protection

Header set X-XSS-Protection "1; mode=block" `

Enable the security configuration:

`bash sudo a2enconf security sudo systemctl restart apache2 `

Securing Nginx

Add security configurations to your Nginx server block:

`nginx

Hide Nginx version

server_tokens off;

Rate limiting

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; limit_req zone=one burst=5;

Block common attack patterns

location ~* \.(php|asp|aspx|jsp)$ { deny all; }

Prevent access to sensitive files

location ~ /\. { deny all; access_log off; log_not_found off; } `

Performance Optimization

Apache Performance Tuning

Edit the Apache configuration:

`bash sudo nano /etc/apache2/mods-available/mpm_prefork.conf `

Optimize for your server resources:

`apache StartServers 4 MinSpareServers 5 MaxSpareServers 10 MaxRequestWorkers 150 MaxConnectionsPerChild 0 `

Enable compression:

`bash sudo a2enmod deflate sudo systemctl restart apache2 `

Nginx Performance Tuning

Optimize Nginx configuration:

`bash sudo nano /etc/nginx/nginx.conf `

Add performance optimizations:

`nginx worker_processes auto; worker_connections 1024;

Enable gzip compression

gzip on; gzip_vary on; gzip_min_length 1024; gzip_types text/plain text/css application/json application/javascript;

Browser caching

location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { expires 1y; add_header Cache-Control "public, immutable"; } `

Troubleshooting Common Issues

Apache Troubleshooting

Check Apache error logs:

`bash

View error logs

sudo tail -f /var/log/apache2/error.log

Test Apache configuration

sudo apache2ctl configtest

Check which ports Apache is listening on

sudo netstat -tlnp | grep apache `

Nginx Troubleshooting

Diagnose Nginx issues:

`bash

Check Nginx error logs

sudo tail -f /var/log/nginx/error.log

Test Nginx configuration

sudo nginx -t

Check Nginx processes

sudo ps aux | grep nginx `

Common Solutions

Port already in use: `bash

Find process using port 80

sudo lsof -i :80

Kill the process if necessary

sudo kill -9 `

Permission denied errors: `bash

Fix ownership

sudo chown -R www-data:www-data /var/www/

Fix permissions

sudo chmod -R 755 /var/www/ `

FAQ

Q: Which is better for hosting - Apache or Nginx?

A: Both have their strengths. Apache is better for shared hosting and complex configurations with .htaccess support. Nginx excels in performance, especially for high-traffic sites and serving static content. Choose based on your specific needs.

Q: How do I check if my Linux web server is running?

A: Use these commands: - For Apache: sudo systemctl status apache2 (Ubuntu) or sudo systemctl status httpd (CentOS) - For Nginx: sudo systemctl status nginx - Check listening ports: sudo netstat -tlnp | grep :80

Q: Can I run both Apache and Nginx on the same server?

A: Yes, but they need to use different ports or you can configure Nginx as a reverse proxy for Apache. This setup can combine Nginx's performance with Apache's features.

Q: How often should I update my web server?

A: Check for security updates weekly and apply them promptly. Major version updates should be planned carefully and tested in a staging environment first.

Q: What's the difference between a web server and web hosting?

A: A web server is the software (Apache/Nginx) that serves web content, while web hosting refers to the service of providing server space and resources to host websites.

Q: How do I backup my web server configuration?

A: Create regular backups of: `bash

Apache

sudo cp -r /etc/apache2/ ~/apache-backup-$(date +%Y%m%d)

Nginx

sudo cp -r /etc/nginx/ ~/nginx-backup-$(date +%Y%m%d)

Website files

sudo tar -czf ~/website-backup-$(date +%Y%m%d).tar.gz /var/www/ `

Conclusion

Setting up a Linux web server with Apache or Nginx provides a robust foundation for web hosting. Whether you choose Apache for its flexibility or Nginx for its performance, following this guide ensures a secure, optimized server configuration. Remember to regularly update your system, monitor logs, and implement security best practices to maintain a reliable web hosting environment.

The key to successful Linux web server administration is continuous learning and staying updated with security patches. Start with the basic configuration outlined in this guide, then gradually implement advanced features as your hosting needs grow.

Tags

  • Apache
  • SSL
  • Web Hosting
  • nginx
  • server-configuration

Related Articles

Popular Technical Articles & Tutorials

Explore our comprehensive collection of technical articles, programming tutorials, and IT guides written by industry experts:

Browse all 8+ technical articles | Read our IT blog

Linux Web Server Setup: Complete Apache & Nginx Guide