A techie blog

Docker, IT, Java, Liferay, Web

Liferay mit Hilfe von Nginx unter (s)einer Domain ansprechen

Manchmal ist es notwendig, auf einer produktionsnäheren Umgebung zu entwicklen. Ein guter Ansatzpunkt hierfür ist, einen Webserver / reverse Proxy (zB Nginx, Apache, IIS) vor die Liferay Dev-Umgebung vorzuschalten.

Damit kann man zB folgende Fragen beantworten:

  • Wie verhält sich mein System, wenn ich es über die tatsächliche Domain anspreche?
  • Wie kann ich sinnvolles Caching bereitstellen?
  • Was muss noch alles getan werden um das Service über HTTPS anzubieten?
  • uvm.

Ich möchte einen einfachen Weg mittels Docker aufzeigen, um mit Nginx seine lokale Liferay Umgebung über einen tatsächlichen (oder ausgedachten) Domainnamen anzusprechen.

Die Sourcen sind in einem Bitbucket Repository verfügbar.

Inhalt

  1. Vorbedingungen
  2. Nginx Container (optional)
  3. Nginx Konfiguration
  4. Liferay Virtual Host Settings
  5. Nginx als Https Endpoint (optional)
  6. Fazit
  7. Quellen

Vorbedingungen

  • Einen funktionierenden Liferay Container basierend auf dem offiziellen Liferay Image (siehe auch hier)
  • Optional: Einen Nginx am Host oder im Container (ich werde einen simplen Nginx Containers zu meinem Liferay Container hinzufügen, daher ist das keine zwingende Voraussetzung)

Nginx Container

Als ersten Punkt fügen wir unserem Docker-Compose File einen Nginx Container hinzu. Dieser Schritt ist optional, wenn Docker nicht verwendet bzw. ein bereits vorhandener Nginx genutzt wird.

services:
# wir fügen folgende Zeilen ein
nginx:
image: nginx:1.15-alpine
ports:
- "80:80"
networks:
- liferaydockerdemo-network
# nachfolgende 2 Zeilen können wir erst einkommentieren, wenn wir die Nginx Konfiguration vorgenommen haben
# volumes:
# - ./conf/nginx/nginx.conf:/etc/nginx/conf.d/default.conf
# in unser bestehendes docker-compose file fügen wir ebenfalls noch bei allen Containern das Netzwerk hinzu
liferay:
...
networks:
- liferaydockerdemo-network
...
# am Ende wird das Netzwerk definiert
networks:
liferaydockerdemo-network:
driver: bridge

Nun starten wir das Service neu und lassen uns den Nginx Container erzeugen. Sobald das Service “up & running” ist, können wir im Browser mittels http://localhost/ verifizieren dass unser Nginx korrekt läuft, indem wir die Nginx default Seite sehen.

Nginx Konfiguration

Als nächstes erstellen wir unsere Nginx Konfiguration. Hierzu erstellen wir die Datei conf/nginx/nginx.conf. Darin erzeugen wir eine Serverkonfiguration mit unserem gewählten Domainnamen localliferay.at.

server {
   server_name localliferay.at;
   listen 80;
    index index.html index.htm;

    location / {
        # forward the request to our liferay container
        proxy_pass http://liferay:8080/;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_redirect off;
   }
}

Befinden wir uns auf einer lokalen Entwicklungs-Umgebung, müssen wir noch einen Host-Eintrag machen. Hiermit wird die von uns gewählte Domain auf 127.0.0.1 aufgelöst.

sudo vim /etc/hosts
 127.0.0.1       localhost
127.0.1.1 Nial
# folgende Zeile fügen wir mit unserer ausgewählten Domain hinzu
127.0.0.1 localliferay.at
...

Haben wir die hosts Datei gespeichert, können wir in unserem Compose File die beiden Zeilen für den Host Volume Mount einkommentieren. Nun greift die Konfiguration und der Nginx dient als Reverse Proxy für Liferay. Starten wir nun unseren Container neu, sehen wir, dass unter unserer Domain localliferay.at Liferay angesprochen wird. Jedoch wird weiterhin zB/web/guest an unsere Domain angehängt, da diese noch nicht mit einer Site im Liferay verknüpft ist.

Liferay Virtual Host Settings

Als nächstes stellen wir in der Liferay Admin Oberfläche den Virtual Host für eine Site ein, um unsere Domain an ebendiese zu binden. Hierzu gehen wir auf die gewünschte Site, zB: Liferay Liferay. Dann auf Konfiguration -> Einstellungen zur Site -> Site-Url. Dort tragen wir unter Öffentliche Seiten unsere Domain localliferay.at ein.

Nun sehen wir, dass unter unserer Domain localliferay.at die von uns ausgewählte Liferay-Site angezeigt wird und kein /web/guest mehr angehängt wird.

Abschließend kommentieren wir noch im Compose File das Portmapping für 8080 aus, damit unser Liferay ausschließlich über den Nginx angesprochen werden kann.

  liferay:
...
ports:
# - "8080:8080"
- "11311:11311"
...

Die Sourcen sind in einem Bitbucket Repository verfügbar.

Nginx als Https Endpoint

Optional können wir nun noch das Service über HTTPS anbieten. Ich habe bereits einen Post verfasst, in dem das generelle Vorgehen mit Nginx beschreiben wird. Daher konzentriere ich mich hier nur noch auf die Besonderheiten im Zuge des Liferay Containers.

Wir fügen im Compose File unserem Liferay Container folgende Environment Variablen hinzu (wie wir es schon für Demo #2 gemacht haben):

  liferay:
...
environment:
LIFERAY_WEB_PERIOD_SERVER_PERIOD_PROTOCOL: "https"
LIFERAY_WEB_PERIOD_SERVER_PERIOD_HTTPS_PERIOD_PORT: "443"

Noch einen Restart und damit hätten wir es auch schon geschafft und Liferay ist unter unserer ausgewählten Domain über HTTPS verfügbar.

Fazit

Nun sind wir mit unserer Dev Umgebung ganz im Sinne von DevOps ein Stück näher an Operations herangerückt und können besser testen, wie sich unser System unter produktionsnahen Bedingungen verhält.

Wir können auch Tests mit HTTPS durchführen und sehen sofort, ob Ressourcen unbeabsichtigter Weise über HTTP ausgeliefert werden.

Mit dieser Basis können wir sogar einen Loadbalancer mit dahinter stehendem Liferay-Cluster aufziehen und sind somit auch für komplexere Fälle gewappnet.

Quellen

https://bitbucket.org/liferaysamples/liferay-docker-demo/

https://hub.docker.com/r/liferay/portal

http://docs.docker.com/

https://docs.docker.com/compose/

https://www.liferay.com/