Ein LAMP Server (Linux Apache2 Mysql PHP) Server ist oft bereits bekannt, doch gibt es auch Alternativen, die sowohl Vorteile als auch Nachteile haben. Je nach Usecase kann es aber durchaus effizienter sein, eine Alternative zu nutzen.

In diesem Anleitung zeige ich dir Schritt für Schritt wie du LEMP auf deinem Ubuntu Server installierst.

Schritt 0: Server vorbereiten

Mit folgendem Befehl kann der Server auf den neuesten Stand gebracht werden. Die Installation von Updates ist nicht nur für die Sicherheit und Stabilität wichtig, manche Installationen funktionieren nicht ohne die aktuelle Paketliste – beispielsweise bei neu hinterlegten Repositorys. APT, der Paketmanager unter auf Debian basierenden Distributionen, übernimmt den Großteil der Arbeit.

Der folgenden Befehl startet den Vorgang:

sudo -s
apt-get update; apt-get upgrade -y;

Schritt 1: Fail2ban installieren und Firewall aktivieren

apt-get install -y fail2ban ufw
ufw allow 21
ufw allow 50000:50099/tcp
ufw allow out 20/tcp
ufw allow 22
ufw allow 80
ufw allow 443
ufw --force enable

Als nächstes fügen wir einige PPAs hinzu, um auf dem neuesten Stand zu bleiben.

apt-get install -y software-properties-common
apt-add-repository ppa:nginx/development -y
apt-add-repository ppa:ondrej/apache2 -y
apt-add-repository ppa:ondrej/nginx-mainline -y
apt-add-repository ppa:ondrej/php -y

Schritt 2: MariaDB-Repositories einrichten

apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
add-apt-repository 'deb [arch=amd64] http://mariadb.mirror.nucleus.be/repo/10.4/ubuntu bionic main' -y

Schritt 3: Basispakete installieren

Nun installieren wir einige Basispakete die für den Betrieb eines LEMP wichtig sind.

apt-get update; apt-get install -y build-essential curl nano wget lftp unzip bzip2 arj nomarch lzop htop openssl gcc git binutils libmcrypt4 libpcre3-dev make python3 python3-pip supervisor unattended-upgrades whois zsh imagemagick uuid-runtime

Schritt 4: Die Zeitzone auf MEZ einstellen

ln -sf /usr/share/zoneinfo/Europe/Berlin /etc/localtime

Schritt 5: Installation von PHP7.4 und allgemeine PHP-Pakete

apt-get install -y php7.4-cli php7.4-dev php7.4-pgsql php7.4-sqlite3 php7.4-gd php7.4-curl php-memcached php7.4-imap php7.4-mysql php7.4-mbstring php7.4-xml php-imagick php7.4-zip php7.4-bcmath php7.4-soap php7.4-intl php7.4-readline php7.4-common php7.4-pspell php7.4-tidy php7.4-xmlrpc php7.4-xsl php7.4-opcache php-apcu

Schritt 6: Composer und Memcached installieren

Composer:

curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer

Memcached:

apt-get install -y memcached
sed -i 's/-l 0.0.0.0/-l 127.0.0.1/' /etc/memcached.conf
systemctl restart memcached

Schritt 7: PHP CLI-Konfiguration aktualisieren

sed -i "s/error_reporting = .*/error_reporting = E_ALL/" /etc/php/7.4/cli/php.ini
sed -i "s/display_errors = .*/display_errors = On/" /etc/php/7.4/cli/php.ini
sed -i "s/memory_limit = .*/memory_limit = 512M/" /etc/php/7.4/cli/php.ini
sed -i "s/;date.timezone.*/date.timezone = UTC/" /etc/php/7.4/cli/php.ini

Konfigurieren und setze anschließend die Berechtigungen für das Sitzungsverzeichnis

chmod 733 /var/lib/php/sessions
chmod +t /var/lib/php/sessions

Schritt 8: Nginx und PHP-FPM installieren; Konfigurieren

apt install -y nginx php7.4-fpm

Generiere jetzt eine dhparam-Datei zur Erhöhung der Nginx-SSL-Sicherheit

openssl dhparam -out /etc/nginx/dhparams.pem 2048

PHP-FPM-Einstellungen Optimieren:

Bitte beachte: Wir werden die Ausgabe von PHP-Fehlern hier unterbinden, indem wir diese Optionen auf Produktionswerte setzen

sed -i "s/error_reporting = .*/error_reporting = E_ALL \& ~E_NOTICE \& ~E_STRICT \& ~E_DEPRECATED/" /etc/php/7.4/fpm/php.ini
sed -i "s/display_errors = .*/display_errors = Off/" /etc/php/7.4/fpm/php.ini
sed -i "s/memory_limit = .*/memory_limit = 512M/" /etc/php/7.4/fpm/php.ini
sed -i "s/upload_max_filesize = .*/upload_max_filesize = 256M/" /etc/php/7.4/fpm/php.ini
sed -i "s/post_max_size = .*/post_max_size = 256M/" /etc/php/7.4/fpm/php.ini
sed -i "s/;date.timezone.*/date.timezone = Europe/Berlin" /etc/php/7.4/fpm/php.ini

PHP-FPM-Pool-Einstellungen abstimmen:

sed -i "s/;listen\.mode.*/listen.mode = 0666/" /etc/php/7.4/fpm/pool.d/www.conf
sed -i "s/;request_terminate_timeout.*/request_terminate_timeout = 60/" /etc/php/7.4/fpm/pool.d/www.conf
sed -i "s/pm\.max_children.*/pm.max_children = 70/" /etc/php/7.4/fpm/pool.d/www.conf
sed -i "s/pm\.start_servers.*/pm.start_servers = 20/" /etc/php/7.4/fpm/pool.d/www.conf
sed -i "s/pm\.min_spare_servers.*/pm.min_spare_servers = 20/" /etc/php/7.4/fpm/pool.d/www.conf
sed -i "s/pm\.max_spare_servers.*/pm.max_spare_servers = 35/" /etc/php/7.4/fpm/pool.d/www.conf
sed -i "s/;pm\.max_requests.*/pm.max_requests = 500/" /etc/php/7.4/fpm/pool.d/www.conf

Nginx-Einstellungen optimieren:

sed -i "s/worker_processes.*/worker_processes auto;/" /etc/nginx/nginx.conf
sed -i "s/# multi_accept.*/multi_accept on;/" /etc/nginx/nginx.conf
sed -i "s/# server_names_hash_bucket_size.*/server_names_hash_bucket_size 128;/" /etc/nginx/nginx.conf
sed -i "s/# server_tokens off/server_tokens off/" /etc/nginx/nginx.conf

Wenn du XDebug benötigst – installiere es und folge den Anweisungen auf dem Bildschirm:

pecl install xdebug

Schritt 8: Gzip für Nginx konfigurieren

Führe den folgenden Befehl aus, um Gzip zu konfigurieren:

cat > /etc/nginx/conf.d/gzip.conf << EOF
gzip_comp_level 5;
gzip_min_length 256;
gzip_proxied any;
gzip_vary on;

gzip_types
application/atom+xml
application/javascript
application/json
application/rss+xml
application/vnd.ms-fontobject
application/x-web-app-manifest+json
application/xhtml+xml
application/xml
font/otf
font/ttf
image/svg+xml
image/x-icon
text/css
text/plain;
EOF

Schritt 9: Aktuelle NodeJS LTS installieren

curl --silent --location https://deb.nodesource.com/setup_12.x | bash -; apt-get update; apt-get install -y nodejs;

Schritt 10: MariaDB installieren (MySQL)

Vergiss nicht, dir dein Passwort zu notieren, du wirst es in einer Minute brauchen.

apt-get install -y mariadb-server;

Nach der Installation sollte MariaDB mit dem mysql_secure_installation Tool abgesichert werden.

Mit folgenden Befehl kannst du dieses tun.

mysql_secure_installation

Schritt 11: phpMyAdmin installieren

Wir werden phpMyAdmin mit dem Composer installieren, da die Ubuntu-Pakete nicht mehr gepflegt werden.

cd /var/www
composer create-project phpmyadmin/phpmyadmin
cp /var/www/phpmyadmin/config.sample.inc.php /var/www/phpmyadmin/config.inc.php
mysql -u root -pYOUR_ROOT_PASSWORD < /var/www/phpmyadmin/sql/create_tables.sql
sed -i "s/\$cfg\['blowfish_secret'\] = '';.*/\$cfg\['blowfish_secret'\] = '$(uuidgen)';/" /var/www/phpmyadmin/config.inc.php
mkdir /var/www/phpmyadmin/tmp; chown www-data:www-data /var/www/phpmyadmin/tmp;

Verknüpfung von phpMyAdmin, Erstellen des Log-Verzeichnisses und setzen von Berechtigungen und Eigentumsverhältnissen auf /var/www

ln -s /var/www/phpmyadmin/ /var/www/html/phpmyadmin;  mkdir /var/www/logs;  chown www-data:www-data /var/www/html; chown www-data:www-data /var/www/logs; chown www-data:www-data /var/www; chmod -R g+rw /var/www;

Schritt 12: Mongodb; Redis installieren

MongoDB:

apt-get install -y libcurl4-openssl-dev pkg-config libssl-dev mongodb
pecl install mongodb

hinzufügen extension=mongodb.so zur PHP-fpm und PHP-cli Konfiguration:

echo "extension=mongodb.so" > /etc/php/7.4/fpm/conf.d/30-mongodb.ini
echo "extension=mongodb.so" > /etc/php/7.4/cli/conf.d/30-mongodb.ini

Redis:

apt install redis-server -y;
sed -i "s/supervised.*/supervised systemd/" /etc/redis/redis.conf; systemctl restart redis.service;

Schritt 13: Virtuelle Nginx-Host-Konfiguration erstellen

Erstelle die Datei /etc/nginx/sites-available/default.domain.conf und gib folgendes ein

nano /etc/nginx/sites-available/default.domain.conf
server {
        listen 80 default_server;
        listen [::]:80 default_server;

        root /var/www/html;
        client_max_body_size 256M;

        # Add index.php to the list if you are using PHP
        index index.html index.htm index.php;

        #Which domain names will this vhost respond to
        server_name  _;

        location / {
            # First attempt to serve request as file, then
            # as directory, then fall back to displaying a 404.
            try_files $uri $uri/ /index.php?$query_string;
        }

        location = /favicon.ico { access_log off; log_not_found off; }
        location = /robots.txt  { access_log off; log_not_found off; }
        access_log /var/www/logs/access.log;
        error_log  /var/www/logs/error.log error;
        error_page 404 /index.php;

        location ~ \.php$ {
          fastcgi_split_path_info ^(.+\.php)(/.+)$;
          fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
          fastcgi_index index.php;
          include fastcgi_params;
          fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
          fastcgi_intercept_errors off;
          fastcgi_buffer_size 16k;
          fastcgi_buffers 4 16k;
          fastcgi_connect_timeout 600;
          fastcgi_send_timeout 600;
          fastcgi_read_timeout 600;
        }

    location ~ /\.ht {
        deny all;
    }
    
    # Deny access to any git repository
    location ~ /\.git {
        deny all;
    }
    
    # Deny access to xmlrpc.php - a common brute force target against WordPress
    location = /xmlrpc.php {
        deny all;
        access_log off;
        log_not_found off;
        return 444; 
    }    
    

}

Deaktiviere nun den Default und erstelle ein Symlink in deiner Konfiguration

rm /etc/nginx/sites-enabled/default
ln -s /etc/nginx/sites-available/default.domain.conf /etc/nginx/sites-enabled

Schritt 14: Letsencrypt Certbot Installation

add-apt-repository ppa:certbot/certbot -y; apt-get update; apt-get install -y python-certbot-nginx;

Schritt 15: PHP-FPM und Nginx neu starten

systemctl restart php7.4-fpm; systemctl restart nginx;

Schritt 16: Logrotate für die Nginx-Protokolle einrichten

Führe folgendes aus, um die Log-Rotationskonfiguration für Nginx zu erstellen – dadurch erhält man 10 Tage lang täglich rotierende Logs

cat > /etc/logrotate.d/vhost << EOF
/var/www/logs/*.log {
 rotate 10
 daily
 compress
 delaycompress
 sharedscripts
 
 postrotate
 systemctl reload nginx > /dev/null
 endscript
}
EOF

Schritt 17: Unbeaufsichtigte Sicherheitsupgrades einrichten

cat > /etc/apt/apt.conf.d/50unattended-upgrades << EOF
Unattended-Upgrade::Allowed-Origins {
"Ubuntu bionic-security";
};
Unattended-Upgrade::Package-Blacklist {
//
};
EOF
cat > /etc/apt/apt.conf.d/10periodic << EOF
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::AutocleanInterval "7";
APT::Periodic::Unattended-Upgrade "1";
EOF

Starte nun deinen Server neu

Vergewissere dich, dass alle Dienste ordnungsgemäß funktionieren. Du kannst sehen, welche Dienste auf welchen Ports auf deinem Server lauschen, indem du folgenden Befehl eingibst:

netstat -tapn

Herzlichen Glückwunsch. Alle Dienste sollten nun zur Verfügung stehen und du hast einen produktionsfertigen Webserver-Stack laufen. Du kannst deine Webserver- und PHP-FPM-Einstellungen weiter optimieren, je nachdem, ob du eine Webseite mit hohem oder niedrigem Traffic hast, hauptsächlich statische oder dynamische Inhalte anbietest.