Table of Contents

Быстрые записки по Apache

OOM

FIXME

https://monicalent.com/blog/2013/03/27/avoiding-the-oom-killer-by-limiting-the-number-of-apache2-processes/

Модуль Rewrite

Модуль rewrite позволяет переписывать\модифицировать к запросы к apache, делать перенаправления или запрещать доступ.
Т.е. пользователь пишет что-то в сроке браузера, берем это что-то и переписываем в формат понятный серверу apache.

Рассмотрим на примере DokuWiki.
Пользователь пишет в строке mykb.ru/qnote, а серверу, что бы он показал страничку, надо передать адрес в виде mykb.ru/doku.php?id=qnote.
За добавление doku.php?id= в запрос как раз и отвечает этот модуль

Подключение модуля

Для подключение модуля, в /etc/httpd/conf/httpd.conf добавляем строчку (она по дефолту уже должна быть) и перезапускаем apache.

LoadModule rewrite_module modules/mod_rewrite.so

Синтаксис Rewrite

Модуль оперирует следующими директивами:

Дополнительные опции RewriteRule:

Шпаргалка - http://wiki.ua.sapo.pt/w/images/4/49/Mod_rewrite-cheat-sheet-v2.pdf, mod_rewrite-cheat-sheet-v2.pdf

Примеры

Правила для DokuWiki

Правила которые делают красивые ссылки для Dokuwiki.

RewriteEngine on
RewriteRule ^_media/(.*)              lib/exe/fetch.php?media=$1  [QSA,L]
RewriteRule ^_detail/(.*)             lib/exe/detail.php?media=$1  [QSA,L]
RewriteRule ^_export/([^/]+)/(.*)     doku.php?do=export_$1&id=$2  [QSA,L]
RewriteRule ^$                        doku.php  [L]
RewriteCond %{REQUEST_FILENAME}       !-f
RewriteCond %{REQUEST_FILENAME}       !-d
RewriteRule (.*)                      doku.php?id=$1  [QSA,L]
RewriteRule ^index.php$               doku.php

Разбор примера:

  1. Запрос mykb.ru/_media/topic/grafana_works.png будет переделан в mykb.ru/lib/exe/fetch.php?media=topic/grafana_works.png, после срабатывания правила остановиться.
    RewriteRule ^_media/(.*)              lib/exe/fetch.php?media=$1  [QSA,L]
    RewriteRule ^_detail/(.*)             lib/exe/detail.php?media=$1  [QSA,L]
    RewriteRule ^_export/([^/]+)/(.*)     doku.php?do=export_$1&id=$2  [QSA,L]
  2. Если после mykb.ru пустота, то запрос запрос будет переделан в mykb.ru/doku.php, после срабатывания правила остановиться.
    RewriteRule ^$                        doku.php  [L]
  3. Проверяем, что имя в запросе это не файл и не директория.
    Если это так, то ко всему, что идет после mykb.ru добавляем doku.php?id= и отправляем серверу.
    Фактически (.*) передаем в переменную $1.
    RewriteCond %{REQUEST_FILENAME}       !-f
    RewriteCond %{REQUEST_FILENAME}       !-d
    RewriteRule doku.php?id                      doku.php?id=$1  [QSA,L]
  4. Переписываем mykb.ru/index.php в mykb.ru/doku.php.
    RewriteRule ^index.php$               doku.php
Перманентный редирект

С сетей 10.40.1.0/24 и 10.40.30.0/24 надо дать досту к graphs.noc.company.name/nsk/*.
При попытке пойти по другим адресам сделать перманентный редирект на graphs.noc.company.name/nsk/index.html.

<VirtualHost *:443>
    ServerName  graphs.noc.company.name    
    ServerAdmin admin@company.name    
    DocumentRoot /var/www/graphs/
    #####
    SSLEngine on
    SSLCertificateFile /etc/httpd/ssl/graphs.noc.company.name.crt
    SSLCertificateKeyFile /etc/httpd/ssl/graphs.noc.company.name.key
    #####
    <Directory "/var/www/graphs">
        RewriteEngine on
        RewriteCond %{REMOTE_ADDR} ^(10\.40\.(1|30)\.[0-9]{1,3})$
        RewriteCond %{REQUEST_URI} !^nsk/(.*)$ [NC]
        RewriteRule ^(.*)$  https://graphs.noc.company.name/nsk/index.html [L,R=301]
    </Directory>
     ####
     ErrorLog logs/graphs_error.log
     CustomLog logs/graphs_access.log common
</VirtualHost>

Логика:

  1. Запрос пришел с адреса из сетей 10.40.1.0/24 и 10.40.30.0/24
    И
  2. Запрос начинается не с nsk, без учета регистра.
    Тогда
  3. Делаем редирект на graphs.noc.company.name/nsk/index.html и останавливаем дальнейшую провекку.

Разбор примера:

  1. Смотрим с каких сетей пришел запрос.
    Если адрес из сетей 10.40.1.0/24 и 10.40.30.0/24, то условие выполнилось, можно переходить к след. условию.
    Третий октет может принимать значения 1 или 30, четверты октет можем принимать значения от 0 до 999.
    RewriteCond %{REMOTE_ADDR} ^(10\.40\.(1|30)\.[0-9]{1,3})$
  2. Смотрим с чего начинается запрос, если не с nsk, то второе условие выполнилось и можно переходить к самому правилу.
    RewriteCond %{REQUEST_URI} !^nsk/(.*)$ [NC]
  3. Все, что пришло в запросе переписываем на graphs.noc.company.name/nsk/index.html, шлем клиенту код редиректа и дальнейшую проверку останавливаем.
    RewriteRule ^(.*)$  https://graphs.noc.company.name/nsk/index.html [L,R=301]

Директива AllowOverride

AllowOverride подключает файл .htaccess и позволяет опеределить конфигурацию каких директив можно перезаписать в файле .htaccess.
Ключи директивы AllowOverride:

Подключаем .htaccess который лежит в /var/www/someserver/ и разрешаем переписать все директивы.

<VirtualHost *:443>
        ServerName  someserver.ru    
        ServerAdmin admin@someserver.ru    
        DocumentRoot /var/www/someserver/
        #####
        SSLEngine on
        SSLCertificateKeyFile /etc/letsencrypt/live/someserver/privkey.pem
        SSLCertificateFile /etc/letsencrypt/live/someserver/cert.pem
        SSLCertificateChainFile /etc/letsencrypt/live/someserver/chain.pem
        ####
        <Directory "/var/www/someserver">
            AllowOverride All
        </Directory>
        ####
        ErrorLog logs/someserver_error.log
        CustomLog logs/someserver_access.log common
</VirtualHost>

Директива Indexes

Директива позволяет просматривать содержимое каталога в отсутствии индексного файла (index.html, index.php и пр.).
Как правило эту директиру отключают по соображением безопасности и при попытке просмотреть содержимое каналога сервер выдаст 403 ошибку:

error] [client 10.20.30.40] Directory index forbidden by Options directive: /var/www/noc/prj/

В /var/www/noc/prj/ лежат файлы которым надо предоставить доступ (см. ниже), в этом случае разрешаем индексирование и конфиг будет выглядеть след. образом:

<Directory "/var/www/noc/prj">
     Options Indexes
     Order deny,allow
     Deny from all
     Allow from 10.20.30.40 10.20.31.40
 </Directory>

Директива Order

Директива позволяет ограничить доступ к каталогу или файлу по ip адресу и может быть прописана в файле .htaccess или в настройках сайта.

Директирва имет два режима работы:

Пример, разрешаем доступ к каталогу с двух ip адресов:

<Directory "/var/www/noc/prj">
     Order deny,allow
     Deny from all
     Allow from 10.20.30.40 10.20.31.40
</Directory>

Полезные ссылки