Archive

Posts Tagged ‘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 ,