Здравствуйте, друзья и коллеги. Однажды в компании возникла необходимость в создании веб-интерфейса для небольшой базы данных. Уже тогда было понимание того, что в будущем понадобится интеграция с LDAP, возможность гибко управлять правами доступа пользователей на просмотр определенных страниц, удобный конструктор для создания страниц, инструменты бизнес-аналитики. Тогда-то я и познакомился с Oracle Application Express (ApEx). Это мощнейшее средство входит в состав таких продуктов, как Oracle Database 11g, 12c, которые, в зависимости от используемой редакции, могут стоить немало. Как это часто бывает, желания превышали возможности...


Для таких случаев у Oracle есть бесплатная версия СУБД Oracle Database Express Edition (коротко XE). На нее накладываются следующие ограничения:


  • на один сервер можно установить только 1 инстанс;
  • может быть установлена на многопроцессорный сервер, но использоваться будет только 1 CPU;
  • для СУБД доступно максимум 1Gb RAM;
  • размер пользовательских данных ограничен 11Gb (в некоторых документах всё ещё встречается ограничение в 4Gb, но это уже устаревшая информация);
  • HTTPS не поддерживается встроенным веб-сервером, для этого приходится использовать Apache/Nginx.

Нас эти ограничения вполне устраивали. Для сервера мы взяли VPS в Digital Ocean с 2Gb RAM, установили Centos 7.2. В следующей главе будет описана установка Oracle XE, а затем — обновление встроенного Application Express v.4 до последней актуальной версии (на момент написания статьи — 5.0.4).


Установка Oracle 11g XE


Установим необходимые пакеты, добавим swap в виде файла и внесём изменения в /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

Следующий шаг — опциональный. Можно сконвертировать Centos в Oracle Linux, затем скачать пакет, меняющий настроки ядра в соответствии с рекомендациями 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

Для загрузки дистрибутива Oracle XE (доступны версии под Windows и Linux) понадобится регистрация на сайте вендора, она бесплатна и ни к чему не обязывает. Скачаем zip-архив, распакуем его и установим:


wget [[вставьте сюда ссылку для загрузки]]
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-*

После установки RPM-пакета необходимо запустить oracle-xe с параметром configure — в этом случае запустится мастер завершения настройки, в интерактивном режиме задающий вопросы. Также доступна установка с использованием файла ответов, в который мы внесем порты по умолчанию и пароль учетной записи 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=[[вставьте сюда пароль]]" >> /root/oracle-xe/Disk1/response/xe.rsp
echo "ORACLE_CONFIRM_PASSWORD=[[повторите пароль]]" >> /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

После установки с использованием файла ответов, не забудьте сохранить пароль в надежном месте и удалить его из файла xe.rsp.


Установка Application Express


Необходимо загрузить на сервер дистрибутив, который также доступен после регистрации на сайте. Скачивание и распаковка:


cd ~ 
wget -O apex_5.zip [[вставьте сюда ссылку для загрузки]]
mkdir apex5 && mv apex_5.zip apex5/ && cd apex5/ && unzip apex_5.zip

В файле oracle_env.sh содержатся переменные окружения, необходимые для работы клиента SQL*Plus, добавим инициализацию этого файла в параметры bash и применим к текущему окружению:


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

Приступим к обновлению. Подготовьте пароль, который использовался в файле ответов и введите его — это необходимо для подключения к базе под учетной записью SYS:


cd apex/ && sqlplus sys as sysdba

Из консоли SQL*Plus необходимо запустить следующие скрипты:


@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 []   [[сюда нужно вставить другой длинный пароль]]
Changed password of instance administrator ADMIN.

Последний скрипт @apxchpwd меняет пароль учетной записи admin для Application Express. Следующий шаг в какой-то мере небезопасен, используйте его только когда это действительно необходимо: этой командой разрешаются удаленные подключения к Listener (с использованием SQL-клиентов или различного другого софта), использующего по умолчанию порт 1521:


EXEC DBMS_XDB.SETLISTENERLOCALACCESS(FALSE);

Рекомендую ограничить подключения к этому порту соответствующим правилом iptables.
При подключении к Listener через интернет, к примеру, с использованием SQL Developer, логины/пароли/запросы передаются в открытом виде. Чтобы этого избежать, необходимо использование SSH-туннеля либо VPN.


Из консоли SQL*Plus изменим другие важные параметры: максимальное число сессий, процессов, т.к. эти параметры не динамические, понадобится рестарт базы. Также перейдем от режима Onlinelog к режиму Archivelog и увеличим лимит дискового пространства, доступного для бэкапов.


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

Резервное копирование


Бэкапы мы кладём на отдельный том. Для этого воспользуемся услугой Volumes хостинга Digital Ocean и после подключения нового раздела к VPS, выполним следующие команды:


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

Эти команды создают файловую систему, папку для монтирования диска, прописывают параметры автомонтирования при загрузке в файл /etc/fstab и меняют владельцев папки для бэкапов. Запускаем консоль SQL*Plus и меняем параметры резервного копирования:


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

Для начала мы воспользуемся предустановленным скриптом, осуществляющим резервное копирование с окном восстановления в 2 дня. Первый запуск мы осуществим из консоли, но в дальнейшем будет необходимо добавить этот скрипт в cron пользователя oracle:


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

После всех изменений нужно будет перезагрузить сервер. Для запуска сервиса oracle-xe вручную и включения в автозагрузку пригодятся следующие команды:


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

Настройка веб-сервера


Для того, чтобы весь трафик шифровался, я решил использовать Nginx.
Его установка предельно проста:


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

Затем необходимо скопировать на сервер SSL-сертификаты и внести изменения в конфигурационный файл веб-сервера, либо создать новый с расширением .conf в папке /etc/nginx/conf.d/. Туда необходимо добавить следующие строки, изменив пути к сертификатам и указав соответствующее доменное имя:


конфиг для 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;
    }
}

содержимое файла /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;

Пояснения: при переходе по адресу http://example.com/ будет происходить редирект на http://example.com/app/f?p=104, этот адрес будет обработан директивой proxy_pass, которая перенаправит трафик на http://127.0.0.1:8080/apex с указанием соответствующего номера веб-приложения, в данном случае 101.
Не забудьте проверить конфигурацию, затем запустить веб-сервер и включить его в автозагрузку:


nginx -t
systemctl start nginx
systemctl enable nginx

На этом установка Oracle Application Express закончена. В следующей статье мы установим тестовое веб-приложение, а затем сделаем что-нибудь по-настоящему полезное.


Update. В связи с пожеланиями, в статью добавлено описание фронтенда, который обеспечивает TLS-шифрование.


Буду искренне рад Вашим комментариям, замечаниям, вопросам.

Поделиться с друзьями
-->

Комментарии (15)


  1. onix74
    07.12.2016 18:59
    +2

    Установка Oracle XE, Oracle APEX описана в официальной документации и не вызывает особых проблем. Для чего эта статья?
    4Gb пользовательского пространства было, на сколько я помню, в 10G, видимо, поэтому Вы и встретили такую информацию.
    Для установки Oracle XE нет необходимости «превращать» CentOS в Oracle Linux Server — всё прекрасно устанавливается.
    Если захотелось получить Oracle Linux Server, можно просто скачать его с сайта Oracle. Дистрибутив бесплатен, использование его, на сколько мне известно, — тоже.


    1. trim777
      07.12.2016 19:26

      … и не вызывает особых проблем

      Если у кого-то проблемы всё-таки возникнут, то статья может пригодиться.
      Для чего эта статья?

      Для описания установки в виде пошагового руководства.
      Для установки Oracle XE нет необходимости «превращать» CentOS в Oracle Linux Server

      Согласен, поэтому я написал, что данный шаг — опциональный.
      Если захотелось получить Oracle Linux Server, можно просто скачать его с сайта Oracle

      Таки-да, но большинство хостинг провайдеров в качестве ОС для VPS не предоставляет этот дистрибутив. Который, как Вы правильно заметили, бесплатный.


    1. ottello
      07.12.2016 21:34

      на самом сайте Oracle противоречиво написано про пространство, вот к примеру описание на русском языке и указано, что используется 4Gb для данных http://www.oracle.com/technetwork/ru/database/express-edition/overview/index.html, а в английской версии всё хорошо, уже 11Gb.


      1. onix74
        07.12.2016 21:47

        Подозреваю, что это — невнимательность переводчика. Здесь: https://docs.oracle.com/cd/B25329_01/doc/install.102/b25143/toc.htm, — в разделе "3.3 Oracle Database XE Server User Data Limitations" сказано, что "The maximum amount of user data in an Oracle Database XE Server database cannot exceed 4 gigabytes". Отсюда "ноги и растут". Неприятная ситуация, вводящая в заблуждение. Видимо, правильнее будет читать документацию в первоисточнике.


        1. ottello
          07.12.2016 21:54

          Так по Вашей ссылке 10g…


          1. onix74
            07.12.2016 22:00

            Ага. И в первоначальном комментарии тоже о ней же. Т.е. я хочу сказать, что эти требования были актуальны для 10G, а потом, видимо, "благодаря" невнимательности переводчика, перекочевали в русскую редакцию документации по 11G.


  1. ottello
    07.12.2016 19:08

    Я правильно понимаю, что в качестве Web сервера у Apache? Почему Вы не описали опыт разворачивания web сервера? было бы интересно иметь общую картину. Кстати почему выбор именно в сторону Apache, а не скажем Glassfish?


    1. trim777
      07.12.2016 19:09

      Спасибо, добавил в статью описание настройки веб-сервера Nginx. До Glassfish просто руки не дошли, на Nginx это можно реализовать проще и быстрее.


      1. ottello
        07.12.2016 21:37

        Хорошо, а про Apache зачем упоминание было? Или речь шла о вариантах?


        1. onix74
          07.12.2016 21:52

          Видимо, потому, что Oracle сам упоминает его в качестве сервера, обеспечивающего HTTPS. Oracle вообще любит Apache. У них давняя любовь. Oracle HTTP Server (OHS) — не что иное, как Apache. Вот и приводят его в пример везде. :-)


          1. ottello
            07.12.2016 21:56

            Дык Glassfish распространяется самим же Oracle


  1. chepil
    07.12.2016 21:59

    Я категорически против apache и/или nginx
    Если уж писать статью, о том, как разворачивать apex, то лучше написать про weblogic, ну или на худой конец glassfish. Хотя, последний, непонятно какой версии использовать. Если 3й, то вроде как устарел, если 4й, то вроде как не комильфо… потому что не кошерное оно…
    В общем, weblogic наше все. И статья полезней бы была, так как weblogic не так просто развернуть, как glassfish, ну по крайней мере, не так все очевидно… Особенно, интересно было бы описать, как ssl на weblogic поднять, так как опять таки, не все тривиально… и новички могут набить шишки на таких вещах.
    В общем, мое мнение, что использование apache/nginx для apex это прошлый век. Прошу прощения за категоричность.


    1. ottello
      07.12.2016 22:17

      А почему 4 не комильфо? Что с ним не так? Про weblogic тоже бы почитал, интересно…


    1. Casufi
      08.12.2016 01:21

      А почему именно Weblogic, и почему перед веблоджиком не поставить nginx, первій такой же легкий для отдачи статики?
      Почему не Tomcat? На последний прекрасно становится ORDS и устанавливается и обновляется он из родного репозитория Centos пакетным менеджером.


    1. onix74
      08.12.2016 08:17
      +2

      WebLogic для APEX — из пушки по воробьям. Для чего использовать такого монстра, если нужен всего лишь HTTPS-сервер? Для работы самого APEX вообще не требуется Web-сервер, в его роли может выступать и RDBMS Oracle. Для ORDS же можно использовать либо Tomcat или любой другой "Java-сервер", либо запустить его в standalone-режиме.
      Ну и главное — цена. Вот здесь: http://www.oracle.com/us/corporate/pricing/technology-price-list-070617.pdf, — говорится, что WebLogic Server Standard Edition стоит $200 за один NUP, плюс поддержка — 44.00 за NUP, а
      WebLogic Server Enterprise Edition стоит 500 за один NUP, плюс поддержка — 110.00 за NUP. Совсем не бюджетное решение. (Про цену я могу ошибаться — возможно есть и бесплатные варианты.)