Magento 2.4 Installation CentOS 8 + PHP 7.4 + MySQL 8 + Elasticsearch + NGINX + Redis + Varnish

Magento 2.4 Installation CentOS 8 + PHP 7.4 + MySQL 8 + Elasticsearch + NGINX + Redis + Varnish

In diesem Artikel installieren wir uns ein voll funktionsfähiges Magento 2.4 Setup auf einem Netcup Root-Server basierend auf CentOS 8 / RedHat Enterprise Linux 8.x (RHEL8). Ich habe mich durch unzählige Dokumentationen durchgewühlt und ausprobiert, bis ich ein funktionierendes Setup hatte, mit dem ich soweit zufrieden war.

Bitte beachten Sie das es WordPress bedingt zu Formatierungsproblemen kommen kann bei manchen Befehlen. Doppel Bindestriche werden vom WordPress Template durch einfache lange ersetzt. Dies gilt es zu beachten.

Die offizielle Magento Dokumentation ist leider etwas unvollständig und leitet oft zu anderen Seiten weiter, damit kann man kein Magento System auf einfache Weise installieren. Es gibt zwar auch automatische Installer Skripte jedoch läuft keiner davon fehlerfrei und bringt immer Probleme mit sich oder sie verlangen die Deaktivierung von Sicherheitssystemen wie SELinux.

Anders als viele Artikel und Tutorials im Internet, lasse ich SELinux an und kümmere mich auch um die Absicherung mittels SELinux. Außerdem versuche ich in diesem Tutorial immer die neuesten Versionen der Services zu nutzen um auf aktuellstem Stand zu bleiben (z.B. PHP 7.4, Redis 6, MySQL 8, e.t.c).

Wenn Sie Interesse an einem Root-Server von Netcup haben, besuchen Sie meine Netcup Gutscheinseite und sichern Sie sich einen Gutschein mit bis zu 30% Rabatt. Zudem unterstützen Sie mich und meine Arbeit damit, wenn Sie einen meiner Gutscheine bei der Netcup Kontoerstellung nutzen.

Um Magento lauffähig zu bekommen müssen wir folgende Reihenfolge beachten:

  1. Firewall Konfiguration + SSH Port Anpassung + SWAP File
  2. NGINX Installation
  3. PHP-FPM Installation
  4. MySQL Installation
  5. Elasticsearch Installation
  6. Magento Installation
  7. Let's Encrypt SSL Zertifikat Installieren
  8. Redis Cache Installieren
  9. Varnish Cache Installieren
  10. RabbitMQ Message Broker Installieren
  11. Optimierungen und Anpassungen
  12. Geführte Installation - Zusehen, Lernen und Fragen Stellen
Fertiger Magento-Shop
So sieht der fertige Magento Shop aus

Selbst installieren, installieren lassen oder geführte Installation

Sie sind sich nicht sicher ob Sie die Installation alleine bewerkstelligen wollen? Sie wollen die Installation einem Profi überlassen und dabei etwas lernen?

Kein Problem, vereinbaren Sie einfach mit mir einen Termin und ich kann für Sie den Server installieren und Ihnen dabei alles wichtige erzählen während wir über Skype oder Zoom verbunden sind. Die geführte Installation für das Basic Setup nimmt in etwa 1,5 Stunden in Anspruch und kostet 349.- € (excl. MwSt.).

Wollen Sie Magento einfach installieren lassen? Auch gut, dies geht deutlich schneller und kostet Sie dann nur 200.- € (excl. MwSt.).

Sie wollen die Installation selbst durchführen? Dann lesen Sie einfach diesen Artikel weiter.

Sie müssen einen Server mit RHEL 8 (RedHat Enterprise Linux 8) oder CentOS 8.x mit mindestens 2 Kernen, 4 GB RAM und 20 GB HDD zur Verfügung stellen.


Firewall Konfiguration + SSH Port Anpassung + SWAP File

Um extern auf die Webseite und Services zugreifen zu können, müssen wir die Firewall anpassen.

Hinweis: Ist firewalld nicht installiert können wir diese einfach installieren mit:
dnf install firewalld

Freigeben der benötigten Ports für HTTP, HTTPS, SMTP, SSH und NGINX Proxy:

firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --permanent --add-service=smtp
firewall-cmd --permanent --add-service=smtps
firewall-cmd --permanent --add-port=2200/tcp
firewall-cmd --permanent --add-port=8080/tcp

Laden der neuen Firewall Konfiguration:

firewall-cmd --reload

Sollte die Firewall nicht aktiviert sein und beim Systemstart nicht automatisch starten, können wir dies wie folgt machen:

systemctl start firewalld
systemctl enable firewalld

SSH Port Anpassung

Um die Sicherheit zu erhöhen, ändern wir den Standartport von SSH von Port 22 auf Port 2200. Dazu müssen wir auch beachten, dass wir SELinux darüber informieren. Sie können natürlich jeden beliebigen TCP/IP Port nutzen:

sed -i "s/#Port 22/Port 2200/" /etc/ssh/sshd_config
dnf install policycoreutils-python-utils
semanage port -l | grep ssh
semanage port -a -t ssh_port_t -p tcp 2200
semanage port -l | grep ssh
systemctl restart sshd

SWAP Datei erstellen

Gerade bei Root-Servern, VPS Servern die nicht ausreichend RAM zur Verfügung haben, ist es umso wichtiger eine SWAP Datei anzulegen. Dies kann entweder als Datei oder Partition gemacht werden. In meinem Fall erstelle ich eine 2GB Datei die als SWAP benutzt wird. Gibt es zu wenig RAM im System und kein SWAP, kann es vorkommen dass sich Elasticsearch, Nginx oder MySQL einfach beenden.

fallocate -l 2G /swapfile
dd if=/dev/zero of=/swapfile bs=1024 count=2097152
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo "/swapfile swap swap defaults 0 0" >> /etc/fstab
sysctl vm.swappiness=10
echo "vm.swappiness=10" >> /etc/sysctl.conf

NTP / Chrony - Automatische Zeit Synchronisierung

Damit der Server immer die richtige Uhrzeit hat (auch bei der Umstellung auf Sommer-/Winterzeit), ist es notwendig einen Synchronisierungsdienst laufen zu lassen. Je nach Linux Distribution ist dies der ntpd – bei CentOS/RHEL übernimmt chrony diese Aufgaben.

dnf install chrony ntpstat -y
systemctl start chronyd
systemctl enable chronyd

NGINX Webserver Installation

Wir installieren die aktuellste verfügbare Version welche mit CentOS im Appstream als Modul mitgeliefert wird. Dazu sehen wir in die Module hinein und aktivieren dann die neueste Version. Passen Sie diese bei sich an, sollte in der Zwischenzeit eine neue Version verfügbar sein. Alternativ könnten wir auch nginx von der Webseite herunterladen und vom Source-Code an kompilieren, ist jedoch im Falle von nginx nicht zwingend notwendig und benötigt viel mehr Zeit und Wartungsaufwand.

dnf module list nginx
Erkennen Sie die neueste Version und aktivieren Sie diese. In meinem falle ist das 1.16. Danach müsste ein [d] neben der Verion stehen.
dnf module enable nginx:1.16
dnf install nginx -y

Installation der neuesten PHP 7.4.x Version

Um die aktuellste PHP Version installieren zu können, benötigen wir das RemiRepository. Danach setzen wir dieses Repository auf Standard und können es installieren. Neue PHP Versionen werden von den Distributionen meist nur stark verzögert bereitgestellt. Durch das RemiRepository umgehen wir dies und können so immer die aktuellste PHP Version nutzen. Magento ab 2.4 unterstützt nun auch PHP 7.4, zuvor musste man noch PHP 7.3 nutzen.

dnf module list php
dnf install epel-release -y
dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm -y
dnf module list php
dnf module enable php:remi-7.4
dnf install zip unzip php-fpm php-zip php-pdo php-mysqlnd php-opcache php-xml php-gd php-devel php-mysql php-intl php-mbstring php-bcmath php-json php-iconv php-soap
php -v

Bearbeiten der PHP und OPCache Konfiguration und Setzen folgender Werte – Sonst kann es zu einem der Fehler kommen beim Kompilieren des static-content und anderen Befehlen. Die Fehlermeldungen sind dann ähnlich wie "PHP Fatal error: Allowed memory size of 134217728 bytes exhausted". Deshalb ist es wichtig das memory_limit anzuheben.

vi /etc/php.ini
max_input_vars = 10000
max_execution_time = 600
memory_limit = 2G
zlib.output_compression = On
vi /etc/php.d/10-opcache.ini
opcache.memory_consumption=512MB
opcache.max_accelerated_files=60000
opcache.consistency_checks=0
opcache.validate_timestamps=0
opcache.save_comments=1

MySQL 8 Installation

Für die Installation von MySQL nehmen wir die offiziellen Pakete von Mysql.com. Damit haben wir die aktuellste Version und sind nicht angewiesen auf die Version von RHEL / CentOS. Dies bietet unter anderem den Mehrwert immer auf die aktuellste Version upgraden zu können und die neuesten Features nutzen zu können. Magento ab 2.4 nutzt die neuen Features von MySQL 8.

wget https://dev.mysql.com/get/mysql80-community-release-el8-1.noarch.rpm
dnf install mysql80-community-release-el8-1.noarch.rpm -y
dnf repolist all | grep mysql
dnf update
dnf module disable mysql -y
dnf install mysql-community-server -y
systemctl start mysqld
systemctl status mysqld

Anpassen der MySQL Konfiguration und Anlegen eines Magento Benutzers:

Zeigt Ihnen das aktuelle Root Passwort an:
sudo grep 'temporary password' /var/log/mysqld.log
mysql -uroot -p
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyDFCV3sV43dass!D';
create database magento;
create user 'magento'@'localhost' IDENTIFIED BY 'MaGe92Dc!Snto';
GRANT ALL ON magento.* TO 'magento'@'localhost';
flush privileges;
exit

Elasticsearch Installation

Ab Magento 2.4.x ist es notwendig Elasticsearch vor der Installation von Magento zu installieren und einzurichten. Elasticsearch ist die zentrale Sucheinheit in Magento. Jede Suchanfrage die auf Magento durchgeführt wird läuft über Elasticsearch. Elasticsearch ist eine eigene Suchmaschine auf Basis von Lucene, ist in Java geschrieben und speichert Dokumente in einem NoSQL-Format (JSON). Dadurch sind Suchanfragen viel zuverlässiger und schneller als zuvor.

Wir installieren hier Elasticsearch und sichern diese ab mit einer HTTP Authentication.

dnf -y install java-1.8.0-openjdk
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
vi /etc/yum.repos.d/elasticsearch.repo

Inhalt der elasticsearch.repo:

[elasticsearch]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=0
autorefresh=1
type=rpm-md
dnf install --enablerepo=elasticsearch elasticsearch -y
sed -i "s/.*cluster.name.*/cluster.name: magento/" /etc/elasticsearch/elasticsearch.yml
sed -i "s/.*node.name.*/node.name: magento-node1/" /etc/elasticsearch/elasticsearch.yml
echo "discovery.type: single-node" >> /etc/elasticsearch/elasticsearch.yml
systemctl start elasticsearch.service
systemctl enable elasticsearch.service
systemctl status elasticsearch.service
curl localhost:9200
curl -XGET 'localhost:9200/_cat/health?v&pretty'

Konfiguration Elasticsearch als NGINX Reverse Proxy

Um Elasticsearch auch extern erreichbar zu machen, nutzen wir NGINX als Reverse Proxy. Das bedeutet Elasticsearch selbst lauscht nur auf eine interne IP Adresse (localhost) welche von extern nicht erreichbar ist und NGINX leitet die Anfragen von extern an den localhost weiter.

Erstellen einer NGINX Configuration:

vi /etc/nginx/conf.d/magento_es_auth.conf

server {
listen 8080;
location /_cluster/health {
proxy_pass http://localhost:9200/_cluster/health;
}
}

Wir müssen SELinux noch ermöglichen zwischen Elastic Search und NGINX über das Netzwerk zu kommunizieren. Ansonsten bekommen Sie den Fehler "Bad Gateway":

setsebool httpd_can_network_connect on -P
systemctl start nginx
curl -i http://localhost:8080/_cluster/health

Wenn Sie jetzt die URL mit Ihrer IP und dem Port mit dem Ordner aufrufen, sollten Sie eine Status Meldung von Elasticsearch erhalten und extern erreichbar sein. Ändern Sie die IP in der URL durch Ihre IP vom Server: http://123.123.123.123:8080/_cluster/health

Die Ausgabe sieht dann in etwa so aus:

{"cluster_name":"magento","status":"green","timed_out":false,"number_of_nodes":1,"number_of_data_nodes":1,"active_primary_shards":0,"active_shards":0,"relocating_shards":0,"initializing_shards":0,"unassigned_shards":0,"delayed_unassigned_shards":0,"number_of_pending_tasks":0,"number_of_in_flight_fetch":0,"task_max_waiting_in_queue_millis":0,"active_shards_percent_as_number":100.0}

Passwortschutz für Elasticsearch

Wir nutzen hierfür die .htpasswd und die httpd-tools. Damit nicht jeder Zugriff auf Elasticsearch oder die Entwicklungsumgebungen hat, können wir die Seiten absichern mit einer Basic Authentication.

dnf -y install httpd-tools
mkdir -p /etc/nginx/passwd
htpasswd -c /etc/nginx/passwd/.elasticsearch admin

Zweiten Benutzer anlegen kann man mit:

htpasswd /etc/nginx/passwd/.<filename> <username>

Bearbeiten der Elasticsearch NGINX Konfigurationsdatei

vi /etc/nginx/conf.d/magento_es_auth.conf

Inhalt der Datei:

server {
listen 8080;
location /_cluster/health {
proxy_pass http://localhost:9200/_cluster/health;
}
location / {
limit_except HEAD {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/passwd/.elasticsearch;
}
proxy_pass http://127.0.0.1:9200;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /_aliases {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/passwd/.elasticsearch;
proxy_pass http://127.0.0.1:9200;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

Überprüfen Sie ob der NGINX Sytax ok ist und Sie alles korrekt angegeben haben.

nginx -t

Ein Curl auf den Port 8080 müsste jetzt zu einem Error führen "401 Authorization Required". Loggen Sie sich mit dem Passwort und Benutzernamen welchen Sie bei dem htpasswd Befehl angelegt haben ein.

curl localhost:8080
curl -u admin:ihrpasswort localhost:8080

Elasitcsearch Ordner mit Passwort schützen

Um auch /elasticsearch auf jeder Ebene zu schützen, können wir hier eine eigene Authentifizierungskonfiguration in NGINX angeben. Dies wird in der Magento Doku empfohlen.

mkdir /etc/nginx/auth/

vi /etc/nginx/auth/magento_elasticsearch.conf

location /elasticsearch {
auth_basic "Restricted - elasticsearch";
auth_basic_user_file /etc/nginx/passwd/.elasticsearch;
proxy_pass http://127.0.0.1:9200;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

Magento Benutzer erstellen

Um später auch mit den richtigen Berechtigungen zu arbeiten, erstellen wir uns einen Magento Benutzer und arbeiten dann auch bei der Installation mit diesem Benutzer.

adduser magento
mkdir /home/magento/public_html
chown magento.magento /home/magento/public_html/
chmod 755 /home/magento/
chcon -Rt httpd_sys_content_t /home/magento/public_html/

NGINX, PHP-FPM Konfiguration für Magento

Nachdem wir nun einen Magento Benutzer haben, wollen wir auch dass PHP-FPM diesen bei der Anwendung von PHP benutzt. Dazu erstellen wir uns eine eigene Socket Datei.

vi /etc/php-fpm.d/magento.conf

Inhalt der Datei:

[magento]
user = magento
group = magento
listen.owner = nginx
listen.group = nginx
listen = /run/php-fpm/magento.sock
pm = ondemand
pm.max_children = 50
pm.process_idle_timeout = 10s
pm.max_requests = 500
chdir = /

Um auch die NGINX Konfiguration vorzubereiten, können wir schon einmal die Datei anlegen und kommentieren noch das include aus. Da die Datei erst vorhanden ist wenn wir den composer nutzen.

vi /etc/nginx/conf.d/magento.conf

Inhalt der Datei:

upstream fastcgi_backend {
server unix:/run/php-fpm/magento.sock;
}
server {
listen 80;
server_name magento.renefuerst.eu;
set $MAGE_ROOT /home/magento/public_html;
set $MAGE_DEBUG_SHOW_ARGS 0;
set $MAGE_MODE default;
#include /home/magento/public_html/nginx.conf.sample;
}

systemctl restart nginx php-fpm


Composer Installation

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

Magento Installation mit dem Composer

Die Installation und Konfiguration von Magento erfolgt am einfachsten mittels dem Composer. Ich selbst habe mich lange gegen den Composer gewehrt, weil ich nie so richtig wusste was hier geschieht. Doch sieht man sich den composer genauer an und erkennt dessen Vorzüge, lohnt es sich den Composer einzusetzen. Denn Magento setzt seit der Version 2.4 auf den vollständigen Composer Installer und bietet keinen WebInstaller mehr an.

Für die Installation benötigen Sie einen API Key um auf den Download des Magento Systems. Sie können diese kostenlos auf der Magento Webseite unter ( repo.magento.com ) beziehen.

su magento

Führen Sie composer Befehle immer mit dem magento Benutzer aus, ansonsten müssen Sie nachher die Berechtigungen neu setzen.

su magento
composer create-project --repository-url=https://repo.magento.com/ magento/project-community-edition /home/magento/public_html/
Geben sie nun den API Benutzernamen und Passwort an und bestätigen Sie mit Y. Die Installation kann mehrere Minuten betragen.

Jetzt haben wir alle Daten am System für die Magento Installation. Nun müssen wir über die Konsole noch das Setup starten für die Installation. Hierfür gilt zu beachten, dass Sie Ihre Daten eintragen (Namen, Passwörter, Email e.t.c):

bin/magento setup:install \
--base-url=http://magento.renefuerst.eu \
--db-host=localhost \
--db-name=magento \
--db-user=magento \
--db-password='IhrMySQLPasswort' \
--admin-firstname=Rene \
--admin-lastname=Fuerst \
--admin-email=rene@renefuerst.eu \
--admin-user=admin \
--admin-password='ihrneuesMagentoAdminPasswort' \
--language=en_US \
--currency=EUR \
--timezone=Europe/Berlin \
--use-rewrites=1 \
--search-engine=elasticsearch7 \
--elasticsearch-host=localhost \
--elasticsearch-port=9200 \
--elasticsearch-enable-auth=1 \
--elasticsearch-username=admin	 \
--elasticsearch-password=hierihrelasticHTPASSWD

Sie sehen dann die Admin URL und können sich einloggen, nachdem wir die NGINX Konfiguration angepasst haben.

[SUCCESS]: Magento Admin URI: /admin_2dx1od

Nginx Konfiguration laden:

vi /etc/nginx/conf.d/magento.conf
Entfernen Sie das "#" bei der include:
    include /home/magento/public_html/nginx.conf.sample;
Abspeichern und Konfiguration testen:
nginx -t
Sie können versuchen NGINX jetzt neu zu starten:
systemctl restart nginx
Wenn sich NGINX nicht starten lässt und die Konfigurations test zeigt ein OK an. Liegt dies vermutlich an SELinux, welcher versucht die Konfiguration zu laden. Setzen Sie die SELinux Berechtigung für den public_html Ordner.
chcon -Rt httpd_sys_content_t /home/magento/public_html/
Und die Drei Ordner var - pub - generated beschreibbar für SELinux setzen:
chcon -R -t httpd_sys_rw_content_t /home/magento/public_html/var/ /home/magento/public_html/pub/ /home/magento/public_html/generated/

Ab diesen Zeitpunkt können Sie die Magento URL aufrufen und auch das Admin Menu laden! Sie können Sie jedoch noch nicht anmelden. Dazu müssen sie erst die 2-Faktoren-Authentifizierung einrichten oder deaktivieren.


Magento Cron Installation

Cronjobs sind notwendig um immer wiederkehrende Aufgaben auszuführen. Hierzu zählen z.B. Emails verschicken, Bestellungen zu archivieren, Zertifikate neu zu generieren u.v.m.

Magento hat eigene Cronjobs die sich an Aufgaben direkt am Magento System richten und sind notwendig für einen reibungslosen Betrieb von Magento.

Führen sie den Befehl im public_html Ordner aus um die Magento Cron als magento Benutzer zu installieren

su magento
cd /home/magento/public_html
bin/magento cron:install
crontab -l

Erstellen und Deaktivieren der 2-Faktoren-Authentifizierung

Da wir keinen E-Mail Server installiert haben, kommen die Passwort-Vergessen-E-Mails nicht an und wir können entweder von Hand an einen 2FA Security Code generieren, welchen wir dann manuell im Google Authenticator oder Authy eingeben können, oder sie Schalten die 2-Faktoren-Authentifizierung vorübergehend ab. Für den E-Mail Versand empfehle ich und auch Magento einen etablierten E-Mail Dienst zu nutzen wie Gmail/Gsuite oder ähnliches. Dies lässt sich einfach in Magento konfigurieren.

2FA Autentifizierung erstellen für den Benutzer admin:
bin/magento security:tfa:google:set-secret admin MFRGGZDF
Diesen Code können Sie dann in ihrem Authenticator eingeben und sich damit dann anmelden.
Deaktivieren der 2FA:
bin/magento module:disable Magento_TwoFactorAuth

Nacharbeit - Services aktivieren

Damit die Dienste auch nach einem Neustart wieder geladen werden, sollten wir diese aktivieren.

systemctl enable nginx elasticsearch mysqld php-fpm firewalld

Email Server Einstellungen für Magento

Entweder nutzen Sie einen etablierten E-Mail-Anbieter wie Gmail/Gsuite oder sie können alternativ (nicht empfohlen) einen eigenen Mailserver installieren und nutzen. Die Chance ist jedoch hoch, dass diese Emails eher im Spam-Ordner Ihrer Kunden landen, als über etablierte Mailanbieter.

Sie finden die Email-Einstellungen im Magento Admin Panel unter:

---Stores -> Settings - Configuration -> Advanced -> System -> Mail Sending Settings

Auf der Magento Webseite im Abschnitt "Email Server" finden Sie links mit weiteren Informationen über die Installation eines eigenen Mail-Servers: https://devdocs.magento.com/guides/v2.4/install-gde/install/post-install-config.html


To Dos - Empfehlungen

Nutzen Sie Certbot um ihre URL mit HTTPS zu verschlüsseln. Vergessen Sie nicht in Magento die base-secure-url dann auf https zu ändern (siehe Abschnitt Let's Encrypt).

Installieren Sie wenn notwendig die SampleData um mit Beispieldaten zu arbeiten (Siehe SampleData Installieren weiter unten).

Nutzen Sie die Möglichkeit HTTP2 zu aktivieren. Hierfür ist nur der Zusatz http2 in der nginx config notwendig.

Richten Sie ggf. Redis-Cache ein (siehe Abschnitt Redis Cache).
Weitere Details zu Redis gibt es hier: https://devdocs.magento.com/guides/v2.4/config-guide/redis/config-redis.html

Richten Sie ggf. Varnish ein (siehe Abschnitt Varnish Cache).
https://devdocs.magento.com/guides/v2.4/config-guide/varnish/config-varnish.html
Varnish wird nicht empfohlen in der Entwicklungsumgebung, hier macht ein Caching System wenig Sinn, außer bei Auslastungstests.

Richten Sie ggf. RabbitMQ ein: https://devdocs.magento.com/guides/v2.4/install-gde/prereq/install-rabbitmq.html

Optimieren Sie weiter die Einstellungen für PHP-FPM, Nginx, OPCache, abhängig von Ihrer Server-Konfiguration.


Optional: SampleData Installieren

SampleData sind Beispieldaten, die von Magento zur Verfügung gestellt werden um eine Art Demoshop zu erhalten mit Fake Produkten. So kann man sich vorstellen wie der Shop dann am Ende aussehen könnte. Dies ist vor allem dann interessant wenn Sie Templates kaufen oder entwickeln und dies auf einem Testsystem ausprobieren wollen mit Produkten, Kategorien und Bilder.

Hinweis: SampleData lassen sich nicht leicht wieder entfernen. Nutzen Sie diese daher nur wenn Sie ein Testsystem versuchen wollen. Ein einfaches sampledata:remove hatte leider keinen gewünschten Effekt gehabt beim Entfernen der SampleData, wie dies von Magento eigentlich vorgesehen ist.

Für die SampleData müssen wir PHP erlauben mehr RAM nutzen zu können. Dazu editieren wir zuerst die nginx.conf.sample Datei.

vi /home/magento/public_html/nginx.conf.sample
Ändern Sie das memory_limit auf 2G oder höher:
        fastcgi_param  PHP_VALUE "memory_limit=2G \n max_execution_time=600";
Ebenso müssen Sie die Werte anpassen in der .user.ini und pub/.user.ini
vi /etc/php.ini
max_input_vars = 10000
max_execution_time = 600
memory_limit = 2G

Installieren der Sample Data nachdem die PHP Limits höher gesetzt wurden:

su magento
cd /home/magento/public_html
bin/magento sampledata:deploy
bin/magento setup:upgrade
bin/magento cache:clean
bin/magento cache:flush

Ab jetzt sehen Sie dann auch in Ihrem neuen OnlineShop einige Beispiele wie dieser aussehen könnte. Durch die SampleData wurden Kategorien und Fakeprodukte hinzugefügt.

Luma-Webshop mit Sample Data

Demoshop mit Passwort schützen

Sie können Ihren neuen Shop auch mit dem selben Passwort schützen wie wir es für ElasticSearch gemacht haben.

vi /home/magento/public_html/nginx.conf.sample

Fügen Sie nach der location Zeile noch die zwei weiteren Werte hinzu, danach haben Sie das selbe Passwort wie für Elasticsearch:

 location ~* \.(ico|jpg|jpeg|png|gif|svg|js|css|swf|eot|ttf|otf|woff|woff2|html|json)$ {
      auth_basic "Restricted";
      auth_basic_user_file /etc/nginx/passwd/.elasticsearch;

Problemlösungen bei Magento 2.4 - Nützliche Befehle

Haben Sie die falsche URL angegeben oder müssen den Magento Cache leeren? Hier finden Sie ein paar nützliche Befehle. Sollten Sie die Probleme nicht selbst beheben wollen oder können, können Sie mich gerne kontaktieren und Ich kann Ihnen dabei eine Unterstützung bieten. Den aktuellen Stundensatz lesen sie am Ende dieses Beitrages.

Base URL ändern:
bin/magento setup:store-config:set --base-url-secure="https://ihreDomain.de/"
bin/magento setup:store-config:set --base-url="http://ihreDomain.de/"
2FA Reset für einen Benutzer:
bin/magento security:tfa:reset <user> <provider>
Setzen des Developer und Production Modus:
bin/magento deploy:mode:set developer
bin/magento deploy:mode:set production
Statischen Content generieren (unnötig bei Developer modus):
bin/magento setup:static-content:deploy -f
Javascript Bundles:
https://devdocs.magento.com/guides/v2.3/frontend-dev-guide/themes/js-bundling.html
Kompilieren und Cache bereinigen:
bin/magento setup:di:compile
bin/magento cache:clean
bin/magento cache:flush
Sample Data:
bin/magento sampledata:deploy
bin/magento setup:upgrade
Fatal error: Allowed memory size of 792723456 bytes exhausted:
vi /home/magento/public_html/nginx.conf.sample
Ändern Sie das memory_limit auf 2G oder höher:
        fastcgi_param  PHP_VALUE "memory_limit=2G \n max_execution_time=600";
Ebenso müssen Sie die Werte anpassen in der .user.ini und pub/.user.ini
vi /etc/php.ini
max_input_vars = 10000
max_execution_time = 600
memory_limit = 2G

Let's Encrypt Zertifikat für HTTPS installieren (empfohlen)

Um keine unsichere Verbindung mehr für unsere Webseite zu haben, können wir ein SSL Zertifikat kostenlos von Let's Encrypt beantragen. Dazu gibt es das nette Programm certbot welches für uns diese Aufgaben übernimmt.

Um HTTPS zu aktivieren müssen wir ein SSL Zertifikat beantragen und diese dann in NGINX konfigurieren. Idealerweise übernimmt beide Aufgaben der certbot.

dnf install certbot python3-certbot-nginx -y
certbot --nginx
Danach gebt ihr noch die Email Adresse an, bestätigt die Terms of Service und Bedingungen. Wenn Ihr nach der Domain gefragt werdet könnt ihr dann sofern ihr nur die eine Domain installiert habt in NGINX die Nummer 1 auswählen, wo ihre Domain steht.
Automatische Zertifikat erneuerung über Cronjob:
echo "0 0,12 * * * root python3 -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew -q" | sudo tee -a /etc/crontab > /dev/null

Jetzt müssen wir uns darum kümmern, dass Magento auch auf HTTPS lauscht und nicht nur auf HTTP. Setzen Sie beide Werte (base-url und base-url-secure) auf https.

bin/magento setup:store-config:set --base-url-secure="https://ihreDomain.de/"
bin/magento setup:store-config:set --base-url="https://ihreDomain.de/"

Redis Cache Installation und Magento Einrichtung

Um die Datenbank zu entlasten und Beschleunigung zu erzielen, bietet sich Redis ans Session Storage an. Redis steht für Remote Dictionary Server. Diese Art von Server eignet sich als schneller Datenspeicher. Redis bietet als Datenbank-Management-System (DBMS) zugleich eine In-Memory-Datenbank und einen Key-Value-Store. Daten liegen also bei einem Redis-Server nicht auf der Festplatte, sondern im Arbeitsspeicher. Durch diese Entscheidung ist Redis sowohl Cache als auch Speicher: Ob die Informationen dauerhaft in der Datenbank liegen oder nur kurzzeitig, macht für Redis keinen Unterschied.

Aktivieren der Remi Repositories um die aktuellere Redis version zu installieren. Das Remi Repository haben wir schon vorher installiert, dadurch reicht eine aktivierung aus.
vi /etc/yum.repos.d/remi.repo
enabled=1
Jetzt müssten wir die aktuelle redis version sehen und installieren können. (Derzeit 6.x)
dnf module list redis
 dnf module enable redis:remi-6.0
Überprüfen ob die aktuelle Version angezeigt wird und danach installieren.
dnf list redis
dnf install redis
systemctl start redis
systemctl status redis
systemctl enable redis
redis-cli ping
PONG (Ist PONG die Ausgabe, dann ist dies ein Zeichen, dass Redis funktioniert)

Redis weiter überprüfen indem wir einen Key setzen und diesen Key dann wieder abfragen.

redis-cli
redis 127.0.0.1:6379> ping
PONG
redis 127.0.0.1:6379> set test einfacherwert
OK
redis 127.0.0.1:6379> get test
"einfacherwert"
redis 127.0.0.1:6379> exit

Redis für Magento einrichten

Details unter: https://devdocs.magento.com/guides/v2.4/config-guide/redis/redis-pg-cache.html

Aktivieren von Redis default cache
bin/magento setup:config:set --cache-backend=redis --cache-backend-redis-server=127.0.0.1 --cache-backend-redis-db=0
Aktivieren von Redis page cache
bin/magento setup:config:set --page-cache=redis --page-cache-redis-server=127.0.0.1 --page-cache-redis-db=1
Aktivieren von Redis für Session Cache
bin/magento setup:config:set --session-save=redis --session-save-redis-host=127.0.0.1 --session-save-redis-log-level=4 --session-save-redis-db=2
Optional und ab Magento 2.4 möglich - Parallel-Generation - Wird nur empfohlen wenn extrem viele Blöcke verwendet werden.
Hinweis beachten (zeile darüber) - bin/magento setup:config:set --allow-parallel-generation`

Überprüfen ob Redis funktioniert mit Magento. Führen Sie den Monitor Befehl aus und öffnen Sie die Magento Webseite (Storefront). Dann müssten Sie im Redis Monitor eine lange Liste an Abfragen sehen.

redis-cli monitor
Programm laufen lassen und die Webseiten URL Besuchen und die Ausgabe vom monitor verfolgen. 
Log-Informationen zum Varnish-Cache im Linux Terminal
Ausgabe des Redis monitor wenn alles korrekt läuft.

Varnish Cache - Installation und Einrichtung für Magento

Wenn wir in den Production Mode wechseln wollen und unsere Programmier- und Testarbeiten abgeschlossen sind, können wir uns der Geschwindigkeit im Frontend widmen. Mit Varnish haben wir eine der besten Caching Lösungen um den Webshop massiv zu beschleunigen, welche natürlich von Magento empfohlen wird und nativ unterstützt wird.

Details zur Varnish auf der Magento Webseite: https://devdocs.magento.com/guides/v2.4/config-guide/varnish/config-varnish.html

We strongly recommend you use Varnish in production. The built-in full-page caching (to either the file system or database) is much slower than Varnish, and Varnish is designed to accelerate HTTP traffic.

Magento Dev Docu

Installieren wir Varnish über die RedHat / CentOS 8 Repository.

dnf install varnish
Version anzeigen
varnishd -V

Um Varnish zu konfigurieren und aktiv betreiben zu können, müssen wir den Port 80 freimachen. Besucher der Webseite sollen über Varnish den NGINX Webserver ansteuern können. Wenn Varnish die gewünschte Webseite vorrätig hat zeigt dieser sie sofort an und benötigt keine Anfrage an den Webserver und Datenbankserver.

Setzen von varnish auf Port 80
systemctl edit --full  varnish
Ändern des Ports von 6081 auf 80
Editieren der Varnish Konfiguration
vi /etc/varnish/default.vcl
backend default {
    .host = "127.0.0.1";
    .port = "80";
}

Im Magento Admin Menu können wir die Konfiguration von Varnish anpassen und herunterladen.

Stores > Settings > Configuration > Advanced > System > Full Page Cache
Varnish Cache (siehe Bild)
Magento Einstellungen für den Varnish-Cache
Exportieren der Varnish Konfiguration für Varnish 6

Danach müssen wir die heruntergeladene Varnish Konfigurationsdatei mit der default.vcl am Server ersetzen. Laden Sie die Datei hoch und ersetzen Sie die default.vcl Datei.

cd /etc/varnish
Sicherung von der aktuellen Varnish Default Datei
mv default.vcl default.vcl.bak
Ich gehe davon aus das die varnish.vcl ins Root Verzeichnis hochgeladen wurde.
mv /root/varnish.vcl default.vlc
SELinux Berechtigung für die Datei nicht vergessen:
chcon -t varnishd_etc_t default.vcl
systemctl restart varnish

Bevor wir Varnish neu starten, musste ich noch die default.vcl anpassen, da ich sonst einen Error erhalten hätte. Grund dafür war die .probe variable die ich kurzerhand entfernt habe.

Löschen aus der Datei default.vcl
    .probe = {
        .url = "/pub/health_check.php";
        .timeout = 2s;
        .interval = 5s;
        .window = 10;
        .threshold = 5;
   }

Testen ob Varnish läuft indem wir einen Curl auf die URL des Shops machen

curl -I -v --location-trusted 'ihreDomain.de'

Wir müssen die Nginx Konfiguration so anpassen das der Port 80 frei wird und dass der Port 443 alles weiterleitet an Varnish. Ein Auszug aus der aktuellen Nginx Konfigurationsdatei:

vi /etc/nginx/conf.d/magento.conf

upstream fastcgi_backend {
  server   unix:/run/php-fpm/magento.sock;
}
server {
listen 8080;
    server_name magento.renefuerst.eu;
    set $MAGE_ROOT /home/magento/public_html;
    set $MAGE_DEBUG_SHOW_ARGS 0;
    set $MAGE_MODE default;
    include /home/magento/public_html/nginx.conf.sample;
}
server {
    listen 443 ssl http2; # managed by Certbot
    server_name magento.renefuerst.eu;
    ssl_certificate /etc/letsencrypt/live/magento.renefuerst.eu/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/magento.renefuerst.eu/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
   # HSTS (ngx_http_headers_module is required) (63072000 seconds)
   add_header Strict-Transport-Security "max-age=63072000" always;
   location / {
       proxy_pass http://127.0.0.1;
       proxy_set_header Host               $http_host;
       proxy_set_header X-Forwarded-Host   $http_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_set_header X-Forwarded-Port   443;
       proxy_buffer_size                   128k;
       proxy_buffers                       4 256k;
       proxy_busy_buffers_size             256k;
       fastcgi_buffer_size                 32k;
       fastcgi_buffers                     4 32k;
   }
} 

Ändern Sie noch den Port in der Default NGINX Konfiguration auf 8080, so dass Port 80 für Varnish frei wird.

vi /etc/nginx/nginx.conf

        listen       8080 default_server;
        listen       [::]:8080 default_server;

Überprüfen Sie ob Varnish benutzt wird indem wir die Webseite aufrufen und dabei den varnishlog laufen lassen.

Anzeigen der Log-Informationen vom Varnish-Cache
Kleiner Auszug vom varnishlog nach Aufruf der Webseite

RabbitMQ Message Broker

In der IT müssen ständig Nachrichten von einem Dienst zum anderen geleitet werden. Das soll auf eine kontrollierte Weise geschehen, sonst blockieren sich Nachrichten gegenseitig und dadurch entsteht ein Stau und Prozesse können nicht optimal ablaufen. Damit Anwendungen problemlos miteinander kommunizieren, ist es sinnvoll, eine Middleware einzusetzen. Einen Dienst der sich um die Verteilung der Nachrichten kümmert. Diese Dienste nennt man Messaging Broker. RabbitMQ ist in Magento direkt implementiert, wir müssen den Server jedoch dafür vorbereiten.

Installation von RabbitMQ über Packagecloud:
curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh | sudo bash
dnf install rabbitmq-server
Starten von RabbitMQ mit SystemD:
systemctl start rabbitmq-server
Status überprüfen mit SystemD:
systemctl status rabbitmq-server
Aktivieren von RabbitMW mit SystemD:
systemctl enable rabbitmq-server

RabbitMQ kommt mit eigenen Befehlskommandos. Einfach die Befehle rabbitmqctl, rabbitmq-plugins ausführen für weitere Informationen.

Optional Dashboard aktivieren:
rabbitmq-plugins enable rabbitmq_management
rabbitmq-plugins list
sudo firewall-cmd --add-port={5672,15672}/tcp --permanent
sudo firewall-cmd --reload
http://123.123.123.123:15672
Standardmäßig existieren nur der Gast Benutzer. Mit "guest" / "guest" können wir uns im System anmelden, nur wenn wir vom Localhost kommen.
sudo rabbitmqctl add_user admin StarkesPasswort
sudo rabbitmqctl set_user_tags admin administrator
Weitere RabbitMQ Befehle für RabbitMQAdmin:
Admintool rabbitmqadmin finden, kopieren und ausführbar machen:
find / -name rabbitmqadmin
sudo cp /Verzeichniss/zu/rabbitmqadmin /usr/local/bin/
sudo chmod +x /usr/local/bin/rabbitmqadmin
Ändern eines Passwortes für den Benutzer:
sudo rabbitmqctl change_password user strongpassword
Erstellen einer Vhost:
sudo rabbitmqctl add_vhost /meinevhost
Auflisten der Vhosts:
sudo rabbitmqctl list_vhosts
Löschen einer Vhost:
sudo rabbitmqctl delete_vhost /meinevhost
Berechtigungen der Vhost erteilen für einen Benutzer:
sudo rabbitmqctl set_permissions -p /meinevhost user ".*" ".*" ".*"
Vhost Berechtigungen auflisten:
sudo rabbitmqctl list_permissions -p /meinevhost
Berechtigungen eines Benutzers anzeigen:
rabbitmqctl list_user_permissions user
Löschen der Benutzerberechtigungen:
rabbitmqctl clear_permissions -p /meinevhost user

Aktivieren von RabbitMQ in Magento

vi app/etc/env.php
  'queue' => [
        'consumers_wait_for_messages' => 1,
        'amqp' => [
            'host' => 'localhost',
            'port' => '5672',
            'user' => 'guest',
            'password' => 'guest',
            'virtualhost' => '/'
        ]
    ],
Aktivieren mit:
bin/magento setup:upgrade
Testen der Verbindung:
bin/magento queue:consumers:start async.operations.all
Beobachten desn RabbitMQ Dashboard ob ein weiterer Connect auftaucht
Im Admin Panel lassen sich die Aufgaben konfigurieren unter Stores > Settings > Configuration > Advanced > System > Cron configuration options for group: consumers

Weitere Details zu RabbitMQ Konfiguration unter: https://devdocs.magento.com/guides/v2.4/extension-dev-guide/message-queues/config-mq.html
https://devdocs.magento.com/guides/v2.4/install-gde/prereq/install-rabbitmq.html

Geführte Installation – Zusehen, Lernen und Fragen stellen

Sie wollen den Server nicht selbst installieren, jedoch bei der Installation zusehen und etwas dabei lernen?

Kein Problem, vereinbaren Sie einfach mit mir einen Termin und ich kann für Sie den Server installieren und Ihnen dabei alles wichtige erklären. Die geführte Installation nimmt in etwa 1,5 bis 2 Stunden für das Basic Setup in Anspruch und kostet 349.- € (excl. MwSt.).

Sie müssen einen Server mit RHEL 8 (RedHat Enterprise Linux 8) oder CentOS 8.x mit mindestens 2 Kernen, 4 GB RAM und 20 GB HDD zur Verfügung stellen.


Problemlösungen

Treten bei Ihnen immer Probleme auf, die gelöst werden müssen? Kein Problem, auch dafür können Sie mich kontaktieren – sowohl zu Magento, als auch zu anderen Linux und Cloud relevanten Themen. Gerne können Sie auch im Chat via Skype oder Zoom mit mir während der Problemlösung dabei sein. Die Kosten hierfür betragen lediglich 200.- € / Stunde (excl. MwSt.) und Sie können dabei sicherlich einiges noch lernen.

Unterstützen

Die Erstellung und Ausarbeitung dieses Blog Artikels ist sehr aufwendig. Sie können mich unterstützen, indem Sie über meine Webseite einen meiner Kurse oder mich für Dienste buchen (ab 9,99 €).

DER NEWSLETTER FÜR IT-BEGEISTERTE

Trag dich ein für den Newsletter und bleib auf dem Laufenden über alle neuesten Aktionen und IT-News!

Wir senden keinen Spam! Erfahre mehr in unserer Datenschutzerklärung.