Archive

Posts Tagged ‘Apache’

Разные php.ini для Apache и консольных скриптов

February 2nd, 2011

Иногда бывает нужно сделать так, чтобы апач и скрипты запускаемые кроном имели разные php.ini. К примеру, для того чтобы ограничить скрипты апача разными disable_functions.
Просто создаем копию php.ini в любом месте, допустим, это будет версия для Apache. Добавляем в нее:

disable_functions=popen,exec,system,passthru,proc_open,shell_exec

Это серьезно усложнит жизнь злоумышленнику на пути повышения привилегий.
И прописываем путь к этому php.ini в httpd.conf:

PHPIniDir /etc/httpd/php.ini

Перезапускаем апач и простеньким скриптом проверяем что получилось:

<?php
system('ls -la');
?>

Apache, php ,

Переходим с prefork на mpm-worker на Apache с mod_php (CentOS)

October 11th, 2010

Итак, допустим вы решили перейти на worker MPM в Apache чтобы повысить производительность. Имеем CentOS с Apache и PHP установленные из репозитория Remi.
Сначала устанавливаем новый тредобезопасный модуль PHP:

yum --enablerepo=remi install php-zts

Возможно придется обновить PHP до последней версии.

Затем в /etc/sysconfig/httpd раскомментируем строчку:

HTTPD=/usr/sbin/httpd.worker

Убедимся, что в конфиге апача присутствуют примерно такие настройки:

<IfModule worker.c>
StartServers       1
MaxClients         50
MinSpareThreads     15
MaxSpareThreads     35
ThreadsPerChild     25
MaxRequestsPerChild  2000
</IfModule>

Где:
StartServers – сколько процессов стартует при запуске
MinSpareThreads/MaxSpareThreads – сервер будет держать количество свободных потоков (про запас) в этих рамках. Свободные потоки – это сумма потоков во всех процессах
MaxClients – максимально количество одновременных клиентов. Т.е. максимальное количество потоков во всех процессах.
ThreadsPerChild – сколько потоков может создавать каждый процесс. Т.о. если мы разделим MaxClients на ThreadsPerChild, то получим сколько максимум процессов будет создано при максимальной загрузке.
ServerLimit – сколько макс. процессов может быть. Естественно, это число должно быть не меньше MaxClients/ThreadsPerChild – числа процессов при максимальной нагрузке.
MaxRequestsPerChild – через сколько запросов уничтожается процесс.

Если используется Zend или IonCube надо поправить пути к ним (обычно в php.ini), заменив на тредобезопасные варианты.

Рестартуем апач:

/etc/init.d/httpd restart

И получаем результат:

ps auxww |grep http
root     19552  0.0  0.5  31020 11300 ?        Ss   20:50   0:00 /usr/sbin/httpd.worker
apache   19555  150 39.2 1125872 813092 ?      Sl   20:50  17:17 /usr/sbin/httpd.worker

linux ,

Оптимизация использования памяти для Apache

October 6th, 2010

Памяти никогда много не бывает. И по мере роста трафика сервер может начать свопиться, а это очень плохо. Посмотрим что же можно сделать:

  • Во-первых, сначала надо убедиться, что перед апачем установлен nginx (ну или лайти) и он отдает напрямую всю статику: графику, видео, js, css, какие-либо архивы и прочее. Для контроля очень удобно воспользоваться встроенными возможностями апача просмотра статуса:
    <Location /server-status>
            SetHandler server-status
    </Location>
    ExtendedStatus On
  • Обязательно нужно внимательно пройтись по конфигу апача и закомментировать загрузку неиспользуемых модулей
  • Так же нужно проконтролировать, чтобы максимальное одновременное количество клиентов апача не превышало объема установленной на сервере памяти. Просто делим общее количество памяти на количество занимаемое одним процессом апача за минусом памяти под mysql и прочее. Иначе система уйдет в своп и катастрофически деградирует.
    StartServers       3
    MinSpareServers    3
    MaxSpareServers   5
    ServerLimit      12
    MaxClients       12
  • Так же можно поставить MaxRequestsPerChild поменьше (~500) чтобы форки апача почаще перезапускались и освобождали память.
  • Если используется Eaccelerator, то надо проверить что eaccelerator.shm_size не очень большое, = “64” вполне подойдет
  • Если ничего не помогает, то нужно попытаться определить какой из виртуалхостов самый прожорливый. Можно просто по очереди тестировать сайты на сервере при помощи loadimpact и наблюдать за нагрузкой. Скорее всего найдется код создающий максимальную нагрузку по памяти. Далее можно пойти путем оптимизации кода либо попрбовать перенести именно этот виртуалхост на php в режиме fast cgi.
  • Так же нужно не забывать про возможность просто взять более мощный сервер. Благо, например, у Hetzner за смешные деньги можно арендовать сервер с 8 и более ГБ памяти. Часто это может оказаться самым “дешовым” решением.

Apache ,

Отображение ошибок в PHP

January 11th, 2010

Включить отображение ошибок в PHP-скриптах можно несколькими способами:
Внести изменения в php.ini и релоаднуть апач. Эти изменения затронут все сайты.

error_reporting = E_ALL
display_errors = On
display_startup_errors = On
log_errors = On
log_errors_max_len = 1024
error_log = /var/log/php-error.log

Внести в .htaccess расположенный в папке скрипта. Это рекомендуемый способ:

php_value display_errors 1
php_value display_startup_errors 1

Внести изменения в сам скрипт:

ini_set("display_errors","1");
ini_set("display_startup_errors","1");
ini_set('error_reporting', E_ALL);

С этим методом такой нюанс: ошибки типа не закрытых скобок и не проставленных ; все равно будут приводить к белому экрану. Это происходит потому, что парсинг файла на синтаксическую корретность происходит до его выполнения и, соответственно, установки директив.
Это можно обойти подобным образом:

<?php
 error_reporting(E_ALL);
 ini_set("display_errors", 1);
 include("file_with_errors.php");
?>

Документация по соответствующим директивам PHP

php ,

suPHP для PHP под Apache

August 4th, 2009

Если по простому,то suPHP это штука, которая позволяет выполнять PHP-скрипты под Apache с правами их владельца, а не с правами веб-сервера. Это бывает необходимо если на сервере несколько пользователей (например, фтп), они активно меняют контент сайтов, но веб-серверу тоже нужен доступ к этим файлам. Тут то и происходит конфликт владельцев.
suPHP есть и в портах для FreeBSD:

cd /usr/ports/www/suphp && make install clean

и в пакетах для CentOS:

yum install mod_suphp

Запускается как обычный модуль для апача:

LoadModule php5_module libexec/apache2/libphp5.so
LoadModule suphp_module libexec/apache2/mod_suphp.so

Конфиги в файле suphp.conf

Внимательнее к параметрам:

; Security options
allow_file_group_writeable=false
allow_file_others_writeable=false
allow_directory_group_writeable=false
allow_directory_others_writeable=false

Из-за них может посыпаться много ошибок.

Для активации надо прописать либо в глобальной секции httpd.conf, либо в конкретном виртуал-хосте:

suPHP_Engine on
suPHP_AddHandler application/x-httpd-php

Не путать с модулем для апача suexec!

Замечен такой косяк: если надо запускать что-то через exec и по относительному пути исполняемый файл не находится, то надо убедится, что в suphp.conf прописано с кавычками!

env_path="/bin:/usr/bin"

Apache, php , ,

Закачка больших файлов через PHP

July 7th, 2009

Вот что нужно поправить:
Во-первых, в nginx.conf надо

client_max_body_size 20m;

Иначе если запрос не будет пролазить в этот лимит nginx покажет 413 Request Entity Too Large для некоторых браузеров или просто сбросит соединение.

В apache убедиться что не определено LimitRequestBody или имеет подходящий лимит. Если установлен mod_security то проверить еще SecRequestBodyLimit.

И наконец, в php.ini:

post_max_size = 20M
upload_max_filesize = 20M

Apache, nginx, php , ,

Простая настройка SSL на Apache

July 1st, 2009

Генерим закрытый ключ и запрос на сертификат.

openssl genrsa –des3 –out mydomain.com.key 1024
openssl req -new -key mydomain.com.key -out mydomain.com.csr

Когда генерим CSR то не надо указывать e-mail, challenge password и дополнительные опции.
Если мы хотим подписать сертификат доверенным центром сертификации, то отправляем им mydomain.com.csr. Если же будем подписывать сами то:

openssl x509 -req -days 365 -in mydomain.com.csr -signkey mydomain.com.key -out mydomain.com.crt

И базовый ssl.conf для примера:

SSLRandomSeed startup file:/dev/urandom 512
SSLRandomSeed connect file:/dev/urandom 512

Listen 443

AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl    .crl
# If you use secret phrase
SSLPassPhraseDialog  exec:/usr/local/etc/apache2/certs/domain.com.pass
SSLSessionCache         dbm:/var/run/ssl_scache
SSLSessionCacheTimeout  300
SSLMutex  file:/var/run/ssl_mutex

<VirtualHost 192.168.0.1:443>
<Directory /home/domain.com/htdocs>
    Order Allow,Deny
    Allow from all
</Directory>

DocumentRoot "/home/domain.com/htdocs"
ServerName secure.domain.com:443
ServerAdmin you@example.com
ErrorLog /home/logs/httpsd-error.log
TransferLog /home/logs/httpsd-access.log
SSLEngine on

SSLProtocol -all +TLSv1 +SSLv3
SSLCipherSuite HIGH:MEDIUM:!aNULL:+SHA1:+MD5:+HIGH:+MEDIUM

SSLCertificateFile /usr/local/etc/apache2/certs/domain.com.crt
SSLCertificateKeyFile /usr/local/etc/apache2/certs/domain.com.key

<FilesMatch "\.(cgi|shtml|phtml|php3?)$">
    SSLOptions +StdEnvVars
</FilesMatch>
<Directory "/home/domain.com/htdocs">
    SSLOptions +StdEnvVars
</Directory>

SetEnvIf User-Agent ".*MSIE.*" \
         nokeepalive ssl-unclean-shutdown \
         downgrade-1.0 force-response-1.0

CustomLog /home/logs/httpd-ssl_request.log \
          "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

</VirtualHost>

Apache ,

Базовая установка LAMP в Debian

June 7th, 2009

Ставим апач:

apt-get install apache2 php5 libapache2-mod-php5 php5-curl

Конфиги в /etc/apache2/
Для добавления виртуалхоста создаем его конфиг (domain.com) в /etc/apache2/sites-available/ и:

a2ensite domain.com

Для выключения:

a2dissite domain.com

Для включения модулей апача:

a2enmod rewrite

Ставим мускул:

apt-get install mysql-server mysql-client php5-mysql

Конфиги в /etc/mysql/

Ставим nginx:

apt-get install nginx

linux , , , ,

Установка nginx на сервер с DirectAdmin

April 29th, 2009

Иногда бывает необходимо поставить nginx перед апачем на сервере с уже установленным DirectAdmin-ом. И тут есть несколько варинтов:

  • Перевесить апач на 127.0.0.1, а nginx на все внешние адреса. Но для этого прийдется править конфиги всех сайтов + темплейты для создания новых хостов в ДиректАдмине (шаблоны лежат тут $DIRECTADMIN_HOME/data/templates/). Так же этот вариант опасен тем, что если что-то пойдет не так, то сайты будут не доступны некоторое время.
  • Перевесить апач на другой порт, а nginx на 80. В этом варианте тоже прийдется править шаблоны.
  • Ну и самый удобный вариант это просто добавить новый ip на сервер, но не добавлять его в ДиректАдмин. Повесить на этот ип nginx и уже на него перевести днс-ы тех доменов, которые больше всего грузят сервер. После добавления ип-а и
    /etc/init.d/network restart

    не забыть сделать

    /etc/init.d/startips start

И в /etc/httpd/conf/httpd.conf заменить

Listen 80

на

Listen 1.1.1.1:80
Listen 1.1.1.2:80

Apache, nginx , ,

Фильтрация по GeoIP через .htaccess

April 16th, 2009

После установки GeoIP на Апач можно использовать следующие варианты для фильтрации трафика в .htaccess на основании гео-информации:

Для блокировки подключений из России и Китая

SetEnvIf GEOIP_COUNTRY_CODE CN BlockCountry
SetEnvIf GEOIP_COUNTRY_CODE RU BlockCountry
Deny from env=BlockCountry

Перенаправление трафика из Китая на гугл

RewriteEngine on
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^CN$
RewriteRule ^(.*)$ http://www.google.com$1 [L]

Apache ,

Отключение SSLv2 в mod_ssl

April 8th, 2009

SSLv2 уже давно не обеспечивает приемлемого уровня безопасности и поэтому желательно отключить его в mod_ssl. Для этого в виртуалхосте апача надо прописать:

SSLProtocol -all +TLSv1 +SSLv3
SSLCipherSuite HIGH:MEDIUM:!aNULL:+SHA1:+MD5:+HIGH:+MEDIUM

Рестартуем Апач и проверяем:

/usr/bin/openssl s_client -state -debug -ssl2 -connect mysite.com:443

Должна появиться ошибка в невозможности хэндшейка.
А так должно нормально подключиться:

/usr/bin/openssl s_client -state -debug -ssl3 -connect mysite.com:443

Apache, безопасность ,

Сокрытие версии PHP и Apache

April 7th, 2009

В php.ini:

expose_php = off

В httpd.conf:

ServerTokens Prod
ServerSignature Off

Apache, php, безопасность ,

Нюанс с GeoIP, nginx, apache-1.3, mod_rpaf

March 3rd, 2009

При реализации указанной связки необходимо проследить что модули в httpd.conf указаны в следующем порядке:

LoadModule geoip_module       libexec/apache/mod_geoip.so
LoadModule rpaf_module        libexec/apache/mod_rpaf.so

В обратной последовательности загрузки модулей стабильно не работает при любых заголовках и тд.

Apache , ,

Ограничение методов TRACK, TRACE в apache

February 2nd, 2009

С помощью использования методов TRACK и TRACE в протоколе HTTP возможно выполнение атаки межсайтовый скриптинг. Для отключения метода TRACE в конфиге апача надо указать (начиная с версии 2.0.55):

TraceEnable off

Директивой Limit этот метод ограничить нельзя!

Для отключения TRACK надо поместить в .htaccess:

RewriteEngine on
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
RewriteRule .* - [F]

Apache, безопасность ,

nginx, apache, mod_rpaf и не правильное определение прокси

January 18th, 2009

Если вы используете такую связку, и в nginx присуствуют следующие директивы

proxy_set_header   X-Real-IP        $remote_addr;
proxy_set_header    X-Forwarded-For $remote_addr;

чтобы пробросить ip пользователя к apache, то некоторые скрипты, работающие под apache из-за заголовка X-Forwarded-For могут считать, что пользователь пришел через прокси. А это не желательно. В таком случае в nginx те два заголовка надо заменить на:

proxy_set_header   Test $remote_addr;

а в конфиге mod_rpaf сделать так:

RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1 внешние ип-ы
RPAFheader Test

Apache, nginx , ,

ротация логов apache во freebsd

December 16th, 2008

для каждого лог-файла добавить в newsyslog.conf

/var/log/httpd-access.log               600  7     10000 *  J /var/run/httpd.pid 30

Apache ,

антихотлинк

December 9th, 2008

Апач:

.htaccess или Directory
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER}  !^http://.*mydomain.com/.*$ [NC]
RewriteCond %{HTTP_REFERER}  !^http://.*google.*$ [NC]
RewriteRule .*[Jj][Pp][Gg]$|.*[Gg][Ii][Ff]$ http://google.com [R,L]

nginx:

location ~* ^.+\.(jpg|jpeg|gif|mpg)$ {
    valid_referers none blocked server_names ~\.google\. images.yandex.ru ~\.mydomain.com ~\.mydomain2.com;
    if ($invalid_referer) {
    return 404;
    }
}

Проверить, если в конфиге nginx сделано так:

server_name ~^(.*)$;

то пункт “server_names” надо убрать из valid_referers
Естественно если уже сделана прямая отдача статики, то надо конструкцию valid_referes … писать внутри того Location

Если надо заблокировать трафик с определенных рефереров, то в nginx делаем так:

valid_referers baddomain1.com baddomain2.com www.baddomain1.com www.baddomain2.com;
if ($invalid_referer != 1) {
return 404;
}

FreeBSD , ,

GeoIP Apache

December 9th, 2008
cd /usr/ports/www/mod_geoip2 && make install

раскомментить

LoadModule geoip_module       libexec/apache2/mod_geoip.so

добавить:

GeoIPEnable On
GeoIPDBFile /usr/local/share/GeoIP/GeoIP.dat

Apache ,