Konfiguracja NGINX/Apache dla SowaSQL Premium

Serwer NGINX jest bardzo wydajnym serwerem HTTP, który obsługuje dla SowaSQL Premium całą komunikację z użytkownikami systemu.

Na system składa się kilka usług, które udostępniane są pod różnymi adresami domenowymi (zwykle jako subdomeny). Na potrzeby dokumentacji przyjmujemy, że podstawową nazwą domenową jest biblioteka-miejska.sowa.pl - a poszczególne usługi będą udostępniane jako subdomeny (oczywiście wszystko może funkcjonować w oparciu o domenę wykupioną przez bibliotekę).

Obowiązkowym punktem konfiguracji jest zabezpieczenie wszystkich stron certyfikatami SSL. W poniższej instrukcji będzie podana metoda wygenerowania bezpłatnych certyfikatów SSL (dzięki Let's Encrypt) - niemniej, jeśli biblioteka posiada certyfikat na własną domenę (np. certyfikat wildcard *.domena) - może użyć gotowych plików certyfikatów i tylko wskazać je w ścieżkach w konfiguracji.


Usługi

Wariant w domenie sowa.pl

Usługi są udostępniane jako subdomeny przydzielonej dla danej biblioteki domeny głównej, np. biblioteka-miejska.sowa.pl

  • brak + www  - katalog OPAC - np. biblioteka-miejska.sowa.pl i www.biblioteka-miejska.sowa.pl
  • cdn - serwer multimediów - np. cdn.biblioteka-miejska.sowa.pl
  • web - aplikacja webowa - np. web.biblioteka-miejska.sowa.pl
  • api - serwer API - np. api.biblioteka-miejska.sowa.pl

Wariant w domenie własnej

Usługi są udostępniane jako subdomeny w domenie własnej biblioteki, np. biblioteka-miejska.com

  • opac - katalog OPAC - np. opac.biblioteka-miejska.com - przy czym biblioteka może już posiadać katalog na innej subdomenie - powinniśmy to zachować.
  • sowa-cdn - serwer multimediów - np. sowa-cdn.biblioteka-miejska.com
  • sowa-web - aplikacja webowa - np. sowa-web.biblioteka-miejska.com
  • sowa-api - serwer API - np. sowa-api.biblioteka-miejska.com

Ustawienie przekierowań

Przekierowanie ruchu HTTP na HTTPS

Zależy nam, by wszystkie usługi działały na bezpiecznym połączeniu, chronionym certyfikatem SSL. Dlatego cały ruch przekierujemy z 80 na 443.

/etc/nginx/sites-available/00-default.conf
server {
  listen      80;
  server_name _;
  root        /dev/null;

  client_max_body_size 256k;

  # Wymagane tylko dla Let's Encrypt
  location /.well-known/ {
    alias /tmp/.well-known/;
  }

  location /status {
    allow 127.0.0.0/8;
    deny  all;
    stub_status;
  }

  location / {
    limit_except GET HEAD {
      deny all;
    }
    return 301 https://$host$request_uri;
  }
}

Przekierowania do lokalnych serwerów usług

/etc/nginx/sites-available/01-sowa-base.conf
upstream opac {
  server 127.0.0.1:8080;
  keepalive 20;
}

upstream strix {
  server 127.0.0.1:7364;
  keepalive 20;
}

upstream sowaipmh {
  server 127.0.0.1:7001;
  keepalive 20;
}

upstream dziupla {
  server 127.0.0.1:9080;
  keepalive 20;
}

Włączenie konfiguracji

rm -f /etc/nginx/sites-enabled/default
ln -s /etc/nginx/sites-available/00-default.conf /etc/nginx/sites-enabled/00-default.conf
ln -s /etc/nginx/sites-available/01-sowa-base.conf /etc/nginx/sites-enabled/01-sowa-base.conf
systemctl restart nginx


Certyfikaty SSL

W przypadku konfiguracji dla domeny sowa.pl, będziemy korzystać z darmowych certyfikatów Let's Encrypt. W przypadku domeny własnej - najlepiej, jeśli biblioteka dysponuje własnym certyfikatem.

Ten krok można pominąć, jeśli biblioteka dysponuje certyfikatem z innego źródła, dla wszystkich nazw domenowych, które będą w użyciu.

Instalacja narzędzia certbot

Certbot - https://certbot.eff.org/ - to narzędzie, które bardzo upraszcza proces pozyskiwania certyfikatów SSL z Let's Encrypt.

apt install certbot

Generowanie certyfikatu

certbot certonly --webroot -w /tmp -d biblioteka-miejska.sowa.pl -d www.biblioteka-miejska.sowa.pl -d cdn.biblioteka-miejska.sowa.pl -d web.biblioteka-miejska.sowa.pl -d api.biblioteka-miejska.sowa.pl

Tak wygenerowane certyfikaty będziemy używać w kolejnych krokach podczas generowania konfiguracji usług.

Fragment opcji polecenia site
--ssl-cert=/etc/letsencrypt/live/biblioteka-miejska.sowa.pl/fullchain.pem --ssl-cert-key=/etc/letsencrypt/live/biblioteka-miejska.sowa.pl/privkey.pem

Certyfikat własny

W przypadku własnego certyfikatu (najlepiej typu wildcard dla *.biblioteka-miejska.com), trzeba umieścić na serwerze pliki w wybranym miejscu, np. w /etc/nginx/ssl/

  1. Plik zawierający certyfikat domeny oraz certyfikat pośredni CA (muszą być oba w jednym pliku!) - np. /etc/nginx/ssl/biblioteka-miejska.com-chain.pem
  2. Plik zaawierający klucz prywatny certyfikatu - np. /etc/nginx/ssl/biblioteka-miejska.com.key

Wówczas te certyfikaty będziemy wskazywać podczas konfiguracji usług.

Fragment polecenia site
--ssl-cert=/etc/nginx/ssl/biblioteka-miejska.com-chain.pem --ssl-cert-key=/etc/nginx/ssl/biblioteka-miejska.com.key

Konfiguracja usług

Usługi korzystają z podstawowego serwera NGINX (dla ruchu 80 i 443) oraz dodatkowego serwera Apache, działającego na porcie 8080.

Katalog OPAC

Jest on obsługiwany przez Apache'a (zob. poprzednią stronę), a NGINX zapewnia proxy.

Wymagania

Pakiet sowa.opac powinien być wcześniej zainstalowy. Adres url katalogu należy wpisać do CRM w Zainstalowane wersje → SOWA-WWW


sowizor site add www --ssl-cert=/etc/nginx/ssl/biblioteka-miejska.com-chain.pem --ssl-cert-key=/etc/nginx/ssl/biblioteka-miejska.com.key

Polecenie wygeneruje automatycznie konfigurację zarówno dla apache, jak i dla nginx. Obie te konfiguracje trzeba odpowiednio podlinkować:

  1. Plik dla Apache będzie w postaci: /home/sowa/.sowang/var/lib/sites/apache/biblioteka-miejska.sowa.pl.conf
  2. Plik dla Nginxa będzie w postaci: /home/sowa/.sowang/var/lib/sites/nginx/biblioteka-miejska.sowa.pl.conf


Utworzenie linków
ln -s /etc/apache2/sites-available/biblioteka-miejska.sowa.pl.conf /home/sowa/.sowang/var/lib/sites/apache/biblioteka-miejska.sowa.pl.conf 
ln -s /etc/apache2/sites-enabled/biblioteka-miejska.sowa.pl.conf /etc/apache2/sites-available/biblioteka-miejska.sowa.pl.conf
ln -s /etc/nginx/sites-available/biblioteka-miejska.sowa.pl.conf /home/sowa/.sowang/var/lib/sites/nginx/biblioteka-miejska.sowa.pl.conf
ln -s /etc/nginx/sites-enabled/biblioteka-miejska.sowa.pl.conf /etc/nginx/sites-available/biblioteka-miejska.sowa.pl.conf

systemctl reload apache2
systemctl reload nginx


W przypadku konfiguracji ręcznej (np. rozdzielenie usług między kilka maszyn), należy skonfigurować NGINX i Apache wg poniższych wzorców.


Przykładowa konfiguracja Nginx dla OPAC
server {
  listen      443 ssl http2;
  server_name biblioteka-miejska.sowa.pl;
  root        /dev/null;

  ssl_certificate     /etc/letsencrypt/live/biblioteka-miejska.sowa.pl/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/biblioteka-miejska.sowa.pl/privkey.pem;  
  
  keepalive_timeout 10m;

  location / {
    client_max_body_size 8m;

    proxy_pass         http://opac;
    proxy_set_header   Host $host;
    proxy_set_header   X-Real-IP $remote_addr;
    proxy_set_header   X-Forwarded-Port 443;
    proxy_set_header   X-Forwarded-Proto $scheme;
    proxy_set_header   Connection "";
    proxy_http_version 1.1;
    proxy_request_buffering off;
  }  
}

Przykładowa konfiguracja Apache dla OPAC
<VirtualHost *:8080>
    DocumentRoot /home/sowa/sowa.opac/public
    ServerName biblioteka-miejska.sowa.pl
    DirectoryIndex index.php

    ErrorLog /var/log/apache2/biblioteka-miejska.sowa.pl-error.log
    TransferLog /var/log/apache2/biblioteka-miejska.sowa.pl-access.log
    LogFormat combined

    <Directory /home/sowa/sowa.opac/public>
        Options SymlinksIfOwnerMatch
        AllowOverride AuthConfig FileInfo
        Order allow,deny
        Allow from all
        Require all granted
    </Directory>

    RewriteEngine on
</VirtualHost>


Serwer API

Posiada on wbudowaną obsługę HTTP i uruchamiany jest na lokalnym porcie 7364, NGINX zapewnia proxy.

Wymagania

Grupa pakietów STRIX powinna być wcześniej zainstalowana. Jeśli usługa API działa na domenie własnej biblioteki, wymagane jest wpisanie adresu url dla API do CRM w Zainstalowane wersje → Strix: host API


sowizor site add api --ssl-cert=/etc/nginx/ssl/biblioteka-miejska.com-chain.pem --ssl-cert-key=/etc/nginx/ssl/biblioteka-miejska.com.key
sudo systemctl reload nginx


W przypadku konfiguracji ręcznej, należy skonfigurować NGINX wg poniższego wzoru:

Przykładowa konfiguracja NGINx dla serwera API
server {
  listen      443 ssl http2;
  server_name api.biblioteka-miejska.sowa.pl;
  root        /dev/null;

  ssl_certificate     /etc/letsencrypt/live/biblioteka-miejska.sowa.pl/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/biblioteka-miejska.sowa.pl/privkey.pem;  
  
  keepalive_timeout 30m;
  proxy_send_timeout 600s;
  proxy_read_timeout 600s;
  send_timeout 600s;

  location ~ ^/tmp/([^/]+)/(.+)$ {
    alias /home/sowa/sowa_sql/katalogi/$1/tmp/$2;
  }

  location /icons {
    alias /home/sowa/sowa_sql/etc/icons;
  }
  
  location /robots.txt {
   add_header Content-Type text/plain;
   return 200 "User-agent: *
Disallow: /
";
  }

  location ~ ^/sowacgi.php.*$ {
    return 410;
  }
  
  location / {
    client_max_body_size 4m;

    proxy_pass         http://strix;
    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-Port 443;
    proxy_set_header   X-Forwarded-Proto $scheme;
    proxy_set_header   Connection "";
    proxy_http_version 1.1;
    proxy_request_buffering off;
    proxy_buffering    off;
  }
}


Serwer multimediów

Uruchamiany jest w kontenerze docker i również sam obsługuje HTTP, NGINX zapewnia proxy.

Podczas wywołania polecenia należy wpisać adres, np. sowa-cdn.biblioteka-miejska.com

sowizor site add cdn --ssl-cert=/etc/nginx/ssl/biblioteka-miejska.com-chain.pem --ssl-cert-key=/etc/nginx/ssl/biblioteka-miejska.com.key
sudo systemctl reload nginx


W przypadku konfiguracji ręcznej, należy skonfigurować NGINX wg poniższego wzoru:

Przykładowa konfiguracja NGINX dla serwera multimediów
server {
  listen      443 ssl http2;
  server_name cdn.biblioteka-miejska.sowa.pl;
  root        /dev/null;

  ssl_certificate     /etc/letsencrypt/live/biblioteka-miejska.sowa.pl/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/biblioteka-miejska.sowa.pl/privkey.pem;  

  keepalive_timeout 10m;

  location / {
    client_max_body_size 0;

    proxy_pass         http://dziupla;
    proxy_set_header   Host $host;
    proxy_set_header   X-Real-IP $remote_addr;
    proxy_set_header   X-Forwarded-Port 443;
    proxy_set_header   X-Forwarded-Proto $scheme;
    proxy_set_header   Connection "";
    proxy_http_version 1.1;
    proxy_request_buffering off;
  }
}


Aplikacja Webowa

Jest serwowana bezpośrednio przez NGINX'a.

Wymagania

Pakiet websowa powinien być wcześniej zainstalowany. Adres url websowy należy wpisać do CRM w Zainstalowane wersje → Sowa WEB Klient

Opcję --force w poleceniu wydajemy tylko wówczas, jeśli migracja do strix jeszcze nie była robiona. W takim przypadku, po migracji będzie konieczne ponowne wygenerowanie konfiguracji tym samym poleceniem (ale bez --force)


sowizor site add web --ssl-cert=/etc/nginx/ssl/biblioteka-miejska.com-chain.pem --ssl-cert-key=/etc/nginx/ssl/biblioteka-miejska.com.key --force
sudo systemctl reload nginx

W przypadku konfiguracji ręcznej, należy skonfigurować NGINX wg poniższego wzoru:

Przykładowa konfiguracja NGINX dla aplikacji webowej
server {
  listen      443 ssl http2;
  server_name web.biblioteka-miejska.sowa.pl;

  ssl_certificate     /etc/letsencrypt/live/biblioteka-miejska.sowa.pl/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/biblioteka-miejska.sowa.pl/privkey.pem;  

  include "/home/sowa/websowa/nginx.conf";
}