
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.