Instalacja Oracle ApEx

Chciałbym dzisiaj porozmawiać o procesie instalacji Oracle ApEx. Kiedyś w mojej firmie zaistniała potrzeba stworzenia interface’u dla niedużej bazy danych. Mieliśmy świadomość tego, że w przyszłości będziemy potrzebowali integracji z LDAP, możliwości łatwego zarządzania dostępami użytkowników do przeglądu stron, wygodnego narzędzia do budowy witryn internetowych oraz instrumentów analityki biznesowej. Wtedy zapoznałem się z Oracle Application Express (ApEx). Jest to potężne narzędzie dostępne takich produktach, jak Oracle Database 11g, 12c, które w zależności od wersji mogą być bardzo kosztowne. Jak to często się zdarza, nasze chęci znacznie przewyższały nasze możliwości.

W takich przypadkach warto skorzystać z darmowej wersji systemu zarządzania bazami danych Oracle Database Express Edition (w skrócie XE). Jak każda darmowa wersja komercyjnego produktu, XE ma ma pewne ograniczenia:

  • na jednym serwerze możemy zainstalować tylko jedną instancj;
  • możemy zainstalować system na wieloprocesorowym serwerze, ale będziemy korzystać tylko z 1CPU;
  • SZBD będzie miał dostępne tylko 1Gb RAM;
  • ilość danych użytkowników jest ograniczona do 11GB (czasem w dokumentacji możemy się spotkać z informacjami na temat 4GB, ale są to przestarzałe dane);
  • wbudowany serwer web nie wspiera HTTPS, więc trzeba korzystać z Apache/Nginx.

Te ograniczenia nie były dla nas problemem. Jako serwera użyliśmy VPS w Digital Ocean, 2GB RAM, zainstalowaliśmy Centos 7.2.

 

Instalacja Oracle 11g XE

Instalujemy niezbędne pakiety, dodamy swap w postaci pliku i dokonujemy odpowiednich zmian w /etc/fstab:

yum update -y && yum install screen vim bash-completion wget telnet mailx unzip epel-release -y && yum install bc libaio flex -y
dd if=/dev/zero of=/var/swapfile bs=1M count=2048 && chmod 0600 /var/swapfile && mkswap /var/swapfile
echo "/var/swapfile swap swap defaults 0 0" >> /etc/fstab && swapon -a && swapon -s

 

Kolejny krok jest opcjonalny. Możemy przekonwertować Centos w Oracle Linux i ściągnąć pakiet, który będzie zmieniał ustawienia jądra w zależności od rekomendacji Oracle.

curl -O https://linux.oracle.com/switch/centos2ol.sh && sh centos2ol.sh && yum distro-sync -y && yum install oracle-rdbms-server-11gR2-preinstall.x86_64 -y

Do ściągnięcia paczki Oracle XE (dostępne są wersje dla Windows i Linux) będzie potrzebna rejestracja na stronie dostawcy. Jest darmowa i nie zobowiązuje nas do niczego. Ściągamy archiwum zip, rozpakowujemy i instalujemy:

wget [[wkleić link do ściągnięcia]]
mv oracle-xe-11* oracle-xe-11.x86_64.rpm.zip
mkdir oracle-xe && mv oracle-xe-* oracle-xe/ && cd oracle-xe/
unzip oracle-xe-* && cd Disk1/
rpm -ivh oracle-xe-*

 

Po zakończeniu instalacji pakietu RPM, włączamy orcale-xe z parametrem configure. Za pomocą pojawiającego się okienka definiujemy parametry i kończymy proces instalacji. Możemy też zamiast tego zakończyć instalację za pomocą pliku z odpowiedziami, do którego wpiszemy domyślne porty oraz hasło do użytkownika SYS:

echo "ORACLE_HTTP_PORT=8080" > /root/oracle-xe/Disk1/response/xe.rsp
echo "ORACLE_LISTENER_PORT=1521" >> /root/oracle-xe/Disk1/response/xe.rsp
echo "ORACLE_PASSWORD=[[Bardzo tajne hasło]]" >> /root/oracle-xe/Disk1/response/xe.rsp
echo "ORACLE_CONFIRM_PASSWORD=[[Bardzo tajne hasło]]" >> /root/oracle-xe/Disk1/response/xe.rsp
echo "ORACLE_DBENABLE=y" >> /root/oracle-xe/Disk1/response/xe.rsp
/etc/init.d/oracle-xe configure responseFile=/root/oracle-xe/Disk1/response/xe.rsp

 

Po zakończeniu instalacji za pomocą pliku z odpowiedziami, ważne jest, aby nie zapomnieć hasła, zachować je w bezpiecznym miejscu i usunąć je z pliku xe.rsp.

Instalacja Application Express

Musimy załadować plik dystrybuujący na serwer. Plik również będzie dostępny na stronie po dokonaniu rejestracji. Ściągamy i rozpakowujemy:

cd ~
wget -O apex_5.zip [[tu wklejamy link do załadowania]]
mkdir apex5 && mv apex_5.zip apex5/ && cd apex5/ && unzip apex_5.zip

 

W pliku oracle_env.sh znajdują się zmienne środowiskowe, niezbędnę do poprawnej pracy klienta SQL*Plus. Dodajemy inicjalizację tego pliku do konfiguracji basha i zastosujemy te ustawienia do bieżącego środowiska:

echo ". /u01/app/oracle/product/11.2.0/xe/bin/oracle_env.sh" >> /etc/bashrc
. /u01/app/oracle/product/11.2.0/xe/bin/oracle_env.sh

 

Kolejny krok to aktualizacja. Potrzebujemy do tego hasła, z którego korzystaliśmy działając nad plikiem pytań i odpowiedzi. Wprowadzamy go, aby mieć możliwość podłączenia się do bazy poprzez użytkownika SYS:

cd apex/ && sqlplus sys as sysdba

 

Za pomoca konsoli SQL*Plus uruchamiamy następujące skrypty:

@apexins SYSAUX SYSAUX TEMP /i/
@apxldimg /root/apex5
@apxchpwd   [[enter]]
Enter the administrator's username [ADMIN] [[enter]]
User "ADMIN" exists.
Enter ADMIN's email [ADMIN] [[enter]]
Enter ADMIN's password []  [[wklejamy długie hasło]]
Changed password of instance administrator ADMIN.

 

Ostatni skrypt @apxchpwd zmienia hasło użytkownika admin do Application Express. 

 

Kolejny krok może być niebezpieczny, więc polecam korzystanie z niego tylko w przypadkach, kiedy jest to niezbędne. Ta komenda pozwala na zdalne połączenie do Listenera (z wykorzystaniem klientów SQL czy innego oprogramowania), który domyślnie korzysta z portu 1521:

EXEC DBMS_XDB.SETLISTENERLOCALACCESS(FALSE);

Zalecam ograniczyć połączenia z tym portem za pomocą reguły iptables.

 

Łącząc się z Listenerem przez internet, na przykład z wykorzystaniem SQL Developer, loginy/hasła/zapytania są przekazywane w niezabezpieczonej postaci. Aby zapobiec temu, musimy korzystać z tunelu SSH czy VPN.

 

Za pomoca konsoli SQL*Plus zmieniamy kolejne parametry: maksymalną liczbę sesji, procesów i inne. Ponieważ te parametry nie są dynamiczne, będziemy musieli zrestartować całą bazę. Zmieniając tryb Onlinelog na tryb Archivelog, zwiększymy ograniczenie przestrzeni dyskowej, dostępnej do przechowywania kopii zapasowych:

alter system set sessions=250 scope=spfile;
alter system set processes=200 scope=spfile;
shutdown normal
startup mount
alter database archivelog;
alter database open;

 

Tworzenie kopii zapasowych

Kopie przechowujemy na oddzielnym wolumenie. Aby mieć taką możliwość, korzystamy z usługi Block Storage na Digital Ocean. Po podłączeniu nowego rozdziału do VPS, wykonujemy następujące komendy:

 

mkfs.ext4 -F /dev/disk/by-id/scsi-0DO_Volume_oracle-backups-volume
mkdir -p /opt/oracle-backups
echo "/dev/disk/by-id/scsi-0DO_Volume_oracle-backups-volume /opt/oracle-backups ext4 defaults,nofail,discard 0 0" | tee -a /etc/fstab
mount -a
chown oracle:dba /opt/oracle-backups

 

Budują one system plików, folder do montowania dysku, definiuje parametry automatycznego montowania podczas załadowania do pliku /etc/fstab oraz zmieniają właścicieli folderu i kopii zapasowych. Włączamy konsolę SQL*Plus i zmieniamy parametry kopiowania zapasowego:

 

sqlplus sys as sysdba
alter system set DB_RECOVERY_FILE_DEST_SIZE = 20G;
alter system set DB_RECOVERY_FILE_DEST = '/opt/oracle-backups';

 

Na początku skorzystamy z już zainstalowanego skryptu, który tworzy kopie zapasowe systemu, dostępne do odtworzenia przez 2 kolejne dni. Po raz pierwszy włączamy ten skrypt za pomocą konsoli, później musimy dodać go do cron użytkownika oracle:

su - oracle
bash /u01/app/oracle/product/11.2.0/xe/config/scripts/backup.sh

 

Po dokonaniu zmian restartujemy serwer. Aby włączyć serwis oracle-xe ręcznie i włączyć ten proces do automatycznie ładujących się, korzystamy z następujących komend:

systemctl start oracle-xe.service
systemctl enable oracle-xe.service

 

Ustawienia serwera web

Aby szyfrować przekazywane dane korzystam z Nginx, którego instalacja jest bardzo prosta:
 

wget http://nginx.org/keys/nginx_signing.key
rpm --import nginx_signing.key
yum -y install nginx

Kopiujemy na serwer certyfikaty SSL i dokonujemy zmian w pliku konfiguracyjnym serwera web. Możemy też stworzyć nowy plik w formacie .conf w folderze /etc/nginx/conf.d/. Muszą tam się znaleźć następujące wiersze które zmienią ścieżkę do certyfikatów, wskazując na właściwą nazwę domenową:

 

Konfiguracja dla nginx:

server {
  listen 80;
  server_name example.com;
  rewrite ^(.*) https://$server_name$1 permanent;
}

server {
  listen 443 ssl;
  server_name example.com;
  resolver 8.8.8.8;
  ssl_stapling on;
  ssl on;
  ssl_certificate   /etc/nginx/keys/cert.crt;
  ssl_certificate_key /etc/nginx/keys/cert.key;
  ssl_dhparam /etc/pki/nginx/dhparam.pem;
  ssl_prefer_server_ciphers on;
  ssl_session_timeout 1d;
  ssl_session_cache shared:SSL:50m;
  ssl_session_tickets off;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers kEECDH+AES128:kEECDH:kEDH:-3DES:kRSA+AES128:kEDH+3DES:DES-CBC3-SHA:!RC4:!aNULL:!eNULL:!MD5:!EXPORT:!LOW:!SEED:!CAMELLIA:!IDEA:!PSK:!SRP:!SSLv2;

  location / {
    rewrite ^ "/app/f?p=101" permanent;
  }

  location /app {
    proxy_pass http://127.0.0.1:8080/apex;
    include /etc/nginx/reverse_proxy.conf;
  }

  location /i/ {
    proxy_pass     http://127.0.0.1:8080/i/;
    include /etc/nginx/reverse_proxy.conf;
  }
}

 

Zawartość pliku /etc/nginx/reverse_proxy.conf:

proxy_set_header  Host       $http_host;
proxy_set_header  X-Real-IP    $remote_addr;
proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_max_temp_file_size 0;

client_max_body_size    1000m;
client_body_buffer_size  128k;

proxy_connect_timeout   180;
proxy_send_timeout     180;
proxy_read_timeout     180;

proxy_buffer_size     4k;
proxy_buffers       4 32k;
proxy_busy_buffers_size  64k;
proxy_temp_file_write_size 64k;

 

Wyjaśnienia: podczas przejścia pod adres http://example.com/ zostanie dokonane przekierowanie do http://example.com/app/f?p=101, ten adres zostanie przetworzony przez proxy_pass, który przekieruje ruch do http://127.0.0.1:8080/apex ze wskazaniem właściwego numeru aplikacji webowej, w danym przypadku 101. Nie zapomnijmy sprawdzić konfiguracji, włączyć serwera web i załadować go automatycznie na starcie systemu.

nginx -t
systemctl start nginx
systemctl enable nginx

 

W taki sposób kończymy instalację Oracle Application Express.