Server version: Apache/2.2.16 (Debian)
Server built: Nov 30 2012 08:33:45
Полезные ресурсы:
http://httpd.apache.org/docs/2.2/
http://httpd.apache.org/docs/2.2/vhosts/
http://httpd.apache.org/docs/2.2/vhosts/name-based.html
https://help.ubuntu.com/10.04/serverguide/C/httpd.html
Установка apache2
sudo apt-get install apache2 установка "голого" веб-сервера
/usr/sbin/apache2 -v посмотреть версию apache, исходя из этого, будем выбирать документацию на apache.org
aptitude install php5-curl установка curl, после чего нужно сделать рестарт apach-у ( /etc/init.d/apache2 restart )
Посмотреть статус apache
1) убедиться, что установлен lynx
sudo apt-get install lynx
2) # apachectl status
Проверка конфигурации
apache2 -k start
Предпочтительный вариант
apache2ctl configtest – выводит ошибку в конфиге Apache. Помогает понять, где мы напортачили в файлах конфигурации
Ошибки Апача можно посмотреть также здесь /var/log/syslog
Файлы Apache
/var/log/apache2/error.log – лог-файл с ошибками веб-сервера(очень полезный файл)
/var/log/apache2/access_log
/etc/apache2/ - директория с конфигурационными файлами Apache
/etc/apache2/apache2.conf – основная конфигурация Apache
/etc/mime.types - сведения о формате содержимого в HTTP транзакциях
Общие команды для перезыпуска веб-сервера
/etc/init.d/apache2 start - запуск веб-сервера
/etc/init.d/apache2 stop - останов веб-сервера
/etc/init.d/apache2 restart - перезапуск
/etc/init.d/apache2 reload
/etc/init.d/apache2 force-reload
/etc/init.d/apache2 status - узнать состояние(запущени или остановлен)
Включить или выключить автостарт сервиса apache2
Это может быть полезно, если мы хотим пользоваться другим веб-сервером, работающем на том же порту, что и apache. В этом случае мы должны каждый раз останавливать apache. Можно просто отключить его автостарт:
sudo update-rc.d apache2 disable
sudo update-rc.d apache2 enable
Ключ disable переименовывает символическую ссылку /etc/rcX.d/@S01apache2 в /etc/rcX.d/@K01apache2
S - скрипт исполняется сервиса при старте ОС (входе на определенный runlevel)
K - скрипт исполняется при завершении работы ОС или переключении между runlevel
01 - порядок исполнения скриптов при входе на определенный runlevel
(C) https://manpages.debian.org/testing/init-system-helpers/update-rc.d.8.en.html
Создание виртуальных хостов на одном IP-адресе(name-based)
Виртуальные хосты можно задавать непосредственно в файле /etc/apache2/apache2.conf. В Ubuntu концигурационные файлы виртуальных хостов вынесли в отдельный "загончик":
/etc/apache2/sites-available/
Также есть другой "загончик", куда собраны символические ссылки, на файлы из /etc/apache2/sites-available:
/etc/apache2/sites-enabled/
После создания файла в sites-available создаем для него символическую ссылку в sites-enabled. После restart или reload веб-сервера у нас появится новый виртуальный хост(не забываем про DNS или hosts). Такой огород, насколько я понимаю, нагородили для нескольких пользователей: один правит свой виртуальный хост, а второй перезапускает веб-сервер. В случае такой организации конфигов, первый пользователь может не беспокоиться, что его незаконченный конфиг-файл станет активным.
Создание символической ссылки включает виртуальный хост, удаление - выключает после. После перезагрузки веб-сервера включенный хост активизируется.
Пример:
Создадим пару виртуальных хостов, которые находятся в директориях /var/www/eshop/ и /var/www/tutorial2, хосты должны откликаться на имена eshop.lan, www.eshop.lan, tutorial.lan и www.tutorial.lan
1) Редактируем /etc/apache2/sites-available/default :
<VirtualHost *:80>
...
ServerName localhost
DocumentRoot /var/www
...
2) Создаем файлы для двух других виртуальных хостов:
sudo cp /etc/apache2/sites-available/default /etc/apache2/sites-available/eshop
sudo cp /etc/apache2/sites-available/default /etc/apache2/sites-available/tutorial
копированием файла по умолчанию.
3) eshop приводим к виду:
<VirtualHost *:80>
...
ServerName eshop.lan
ServerAlias www.eshop.lan
DocumentRoot /var/www/eshop
...
tutorial приводим к виду:
<VirtualHost *:80>
...
ServerName tutorial.lan
ServerAlias www.tutorial.lan
DocumentRoot /var/www/tutorial2
...
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
AllowOverride All - важная опция, если для контекста сайта эта опция имеет значение None, то директивы файла .htaccess будут игнорироваться(правила для mod_rewrite, к примеру), что создаст нам проблемы. В случае с задания правил mod_rewrite в .htaccess перестанут открываться ссылки на динамическом сайте, по причине неработающего роутинга.
4) Создаем символические ссылки в sites-enabled:
это можно сделать вручную, а можно при помощи тривиальной утилиты a2ensite
a2ensite eshop
a2ensite tutorial
5) Рестарт сервера
sudo /etc/init.d/apache2 restart
или
sudo /etc/init.d/apache2 reload
6) Редактируем записи DNS или hosts.
Для hosts вносим записи:
127.0.0.1 eshop.lan
127.0.0.1 www.eshop.lan
127.0.0.1 www.tutorial.lan
127.0.0.1 tutorial.lan
/etc/init.d/networking restart - переконфигурация сетевых интерфейсов(необязательно)
Получаем на локальном компьютере 2 хоста, которые будут откликаться на имена www.eshop.lan, eshop.lan, tutorial.lan и www.tutorial.lan
sudo a2dissite eshop - удаляет символическую ссылку, что приведет к выключению виртуального хоста после рестарта веб-сервера:
sudo /etc/init.d/apache2 restart
Пакет для возможности запуска сервера от определенного пользователя,
а не только от www-data
apt-get install apache2-mpm-itk
Перестали работать сайты после обновления с Wheezy на Jessie
В Apache 2.4 конфигурационные файлы в директории /etc/apache2/sites-available/ обязаны иметь расширение .conf, поэтому идем туда и переименовываем их соответствующим образом: mv site site.conf
После чего нужно создать на эти файлы символические ссылки в директории /etc/apache2/sites-enabled/
(a2ensite в помощь)
Далее делаем
/etc/init.d/apache2 reload
или
/etc/init.d/apache2 force-reload
Усё )
Не забываем почистить старые символические ссылки, чтобы не болтался лишний мусор в папке /etc/apache2/sites-enabled/
Обрабатываемые по умолчанию файлы (index.php, index.htm....)
Чтобы веб-сервер открывал не только index.htm, а другой файл, нужно зайти в
/etc/apache2/mods-enabled/@dir.conf и отредактировать его, добавив нужное название файла в строку
Веб-сервер будет искать указанные в строке файлы в своей корневой директории, и выдаст первый найденный файл. После изменения @dir.conf нужно перезапустить Apache.
Модуль mod_rewrite
Включение модуля mod_rewrite
sudo a2enmod rewrite - создание символической ссылки в папке для файла модуля rewrite из папки mods-available в папке mods-enabled
sudo /etc/init.d/apache2 force-reload
По умолчанию настройки mod_rewrite не наследуются виртуальными хостами из глобального контекста сервера. Чтобы применить эти настройки к виртуальным хостам нужно помесить данные директивы в секцию <VirtualHost> section:
RewriteEngine On
RewriteOptions Inherit
Проверка, что mod_rewrite загружен
Способ №1: проверить можно из скрипта php при помощи вызова функции phpinfo()
ищем в выводе фунции информацию:
apache2handler -> Loaded Modules -> mod_rewrite
Способ №2: имея права суперпользователя, это можно сделать из командной строки:
#apachectl -t -D DUMP_MODULES - выведет список загруженных модулей
или так
#apachectl -t -D DUMP_MODULES | grep rew
rewrite_module (shared) - данная строчка говорит нам, что модуль загружен
Важно! Наличие модуля в памяти не означает, что о нем знает apache2, возможно требуется перезагрузка веб-сервера
/etc/init.d/apache2 restart
Отключение модуля mod_rewrite
Способ №1: Находим в папке /etc/apache2/mods-enabled символическую ссылку @rewrite.load и удаляем ее, после чего перезагружаем apache2: /etc/init.d/apache restart
Способ №2: a2dismod rewrite - аналогично удаляет символическую ссылку, после чего нам также потребуется перезагрузить apache2: /etc/init.d/apache restart
Отключаем листинг директорий
1) Способ 1
Если мы не хотим, чтобы содержимое директорий отображалось каждому встречному и поперечному, то можно в корневой директории сайта в файле .htaccess внести запись
Options -Indexes
Данная опция и вообще сам файл htaccess работают только в том случае, если для соответствующего виртуального хоста установлена директива AllowOverride в значение All: AllowOverride All
Данную директиву мы ищем в файле /etc/apache2/sites-available/nash-site
Возможен вариант, когда виртуальные хосты и их директории описываются непосредственно в файле /etc/apache2/apache2.conf
Тогда мы лезем туда и прописываем AllowOverride All прямо в нем.
2) Способ 2
В файле конфигурации для виртуального хоста вносим Options -Indexes
<Directory /var/www/sitedir>
Options -Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
В этом случае также директории не будут показываться, при условии что нет исключающей директивы в файле .htaccess поскольку директивы htaccess применяются уже после директив файлов конфигурации. Например, если в .htaccess будет директива
Options +Indexes, то она определит поведение листинга.
Можно удалить опцию Indexes и, если она больше нигде не фигурирует, то листинг будет отключен также
Изменение файлов конфигурации виртуальных хостов требует рестарта apache, изменение файла .htaccess - не требует.
Включаем листинг директорий
Options Indexes - вносим эту строчку в .htaccess - видим список файлов.
Убираем лишнюю информацию о веб-сервере и его модулях.
Когда apache2 ругается при обращении к запрещенной директории, он выводит много лишней информации для злодеев и хулиганов. Чтобы это поправить, мы лезем сюда:
/etc/apache2/conf.d/security
и устанавливаем параметр
ServersTokens в значение Prod:
ServersTokens Prod
Можно вообще отключить подпись сервера:
ServerSignature Off
Описание виртуальных хостов непосредственно в httpd.conf:
<Directory /var/www/xxx/data/www/xxx.com>
php_admin_value open_basedir "/var/www/xxx/data:."
Options -Indexes
</Directory>
<VirtualHost xx.xx.xx.xx:8080>
ServerName xxxx.com
DocumentRoot /var/www/xxx/data/www/xxx.com
SuexecUserGroup xxx_user xxx_user
CustomLog /var/www/httpd-logs/xxx.com.access.log combined
ErrorLog /var/www/httpd-logs/xxx.com.error.log
ServerAlias www.xxx.com
ServerAdmin info@xxx.com
php_admin_value open_basedir "/var/www/xxx/data:."
php_admin_value sendmail_path "/usr/sbin/sendmail -t -i -f ifo@xxx.com"
php_admin_value upload_tmp_dir "/var/www/xx/data/mod-tmp"
php_admin_value session.save_path "/var/www/xxx/data/mod-tmp"
AddType application/x-httpd-php .php .php3 .php4 .php5 .phtml
AddType application/x-httpd-php-source .phps
</VirtualHost>
Отладка PHP: Ошибка HTTP 500 (Internal Server Error): При попытке сервера выполнить запрос возникла неожиданная ситуация.
При возникновении ошибок в php-скриптах сайта на экран браузера выводится сообщение: Ошибка HTTP 500 (Internal Server Error): При попытке сервера выполнить запрос возникла неожиданная ситуация.
Никакие директивы, управляющие отображением ошибок не работают, посмотреть ошибки мы лазим в /var/log/apache2/error.log
Решается проблема установкой display_errors = On в файле /etc/php5/apache2/php.ini
Не забываем сделать
/etc/init.d/apache2 restart
Как узнать версию Apache (Debian)
1)
# apachectl -v
# apachectl -V
2)
# apache2ctl -v
# apache2ctl -V
3)
$ /usr/sbin/apache2 -v
$ /usr/sbin/apache2 -V
v - выводится краткая информация о сервере
V - полная информация
Server version: Apache/2.2.16 (Debian)
Server built: Nov 30 2012 08:33:45
Server's Module Magic Number: 20051115:24
Server loaded: APR 1.4.2, APR-Util 1.3.9
Compiled using: APR 1.4.2, APR-Util 1.3.9
Architecture: 32-bit
Server MPM: Prefork
threaded: no
forked: yes (variable process count)
Server compiled with....
-D APACHE_MPM_DIR="server/mpm/prefork"
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
-D APR_USE_SYSVSEM_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D DYNAMIC_MODULE_LIMIT=128
-D HTTPD_ROOT="/etc/apache2"
-D SUEXEC_BIN="/usr/lib/apache2/suexec"
-D DEFAULT_PIDLOG="/var/run/apache2.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_LOCKFILE="/var/run/apache2/accept.lock"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="mime.types"
-D SERVER_CONFIG_FILE="apache2.conf"
Ясно, что способ #3 более предпочтительный поскольку нам не нужны права суперпользователя.
https://sites.google.com/site/grabliubuntu/server/apache2
Отсутствующий модуль Header
Invalid command 'Header', perhaps misspelled or defined by a module not included in the server configuration - если мы наблюдаем такое сообщение в файле error.log, то скорее всего нам нужно подгрузить модуль headers (a2enmod headers) и сделать рестарт apache2
Apache и самоподписанный SSL сертификат
1) a2enmod ssl
2) openssl req -x509 -nodes -days 1000 -newkey rsa:2048 -keyout site.key -out site.key.crt - генерим ключ и сертификат
3) положим указанные файлы куда-нибудь, например, сюда /etc/apache2/ssl
4) сделаем копию конфигурационного файла для виртуального хоста cp site site-ssl
внесем исправления в наш новый файл конфигурации site-ssl:
<VirtualHost *:443>
ServerName site
ServerAlias www.site
DocumentRoot /var/www/site
<Directory /var/www/site>
Options -Indexes +FollowSymLinks
AllowOverride All
Order allow,deny
allow from all
</Directory>
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/site.crt
SSLCertificateKeyFile /etc/apache2/ssl/site.key
LogLevel info
CustomLog /var/www/site/log/apache-access-443.log combined
ServerAdmin info@site.ru
</VirtualHost>
Зеленым цветом выделено отличие виртуального хоста на 443 порту от хоста на 80.
Если мы не планируем, что сайт будет открываться на 80-ом порту, то можно убрать лишнее из описания виртуального хоста на 80 ом порту, поставив редирект на SSL-хост:
<VirtualHost *:80>
ServerName site
ServerAlias www.site
DocumentRoot /var/www/site
Redirect 301 / https://site/
LogLevel info
CustomLog /var/www/site/log/apache-access-80.log combined
ServerAdmin info@site.ru
</VirtualHost>
Думаю, хорошей практикой будет задание различных логов сервера для обращений по 80 и 443 портам.
5) a2ensite site-ssl, и делаем рестарт apache2
После чего сайт доступен и по http, и по https
6) Чтобы получить единообразный результат - чтобы всегда открывался хост https://site - внесем небольшой штрих,
добавив в /var/www/site/.htaccess, следующую запись:
#Для версии Apache2.4:
<If "%{HTTP_HOST} == 'www.site'">
Redirect 301 "/" "https://site/"
</If>
#Для версии Apache2.2 или 2.4
#RewriteCond %{HTTP_HOST} ^www.site$ [NC]
#RewriteRule ^(.*)$ https://site/$1 [R=301,L]
Теперь наш сайт открывается одинаково в 4х вариантах обращения:
http://www.site ->301 редирект из виртуал хоста->https://site
http://site ->301 редирект из виртуал хоста ->https://site
https://www.site ->301 редирект из .htaccess ->https://site
https://site
PS
Предположим, что у нас есть 3 сайта: site(который обслуживается по SSL) и 2 других, которые не имеют ssl-сертификата, но их скрипты лежат там же, где и скрипты сайта site. Нам нужно открывать site единообразно - без www и по https, а остальные сайты - mag1 и mag2 - по http. В этом случае в делаем подобную конфигурацию виртуального хоста с адресом 80:
<VirtualHost *:80>
ServerName site
ServerAlias www.site mag1 mag2
DocumentRoot /var/www/site
#Redirect 301 / https://site/
<Directory /var/www/site>
Options -Indexes +FollowSymLinks
AllowOverride All
Order allow,deny
allow from all
</Directory>
LogLevel info
CustomLog /var/www/site/log/apache-access-80.log combined
ServerAdmin info@site.ru
</VirtualHost>
Запись в .htaccess (Apache 2.4)
<If "%{HTTP_HOST} == 'www.site'">
Redirect 301 "/" "https://site/"
</If>
<If "%{HTTP_HOST} == 'site' && %{HTTPS} != 'on'">
Redirect 301 "/" "https://site/"
</If>
Запись в .htaccess (Apache 2.2)
RewriteCond %{HTTP_HOST} ^www.site$ [NC]
RewriteRule ^(.*)$ https://site/$1 [R=301,L]
RewriteCond %{HTTP_HOST} ^site$ [NC]
RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://site/$1 [R=301,L]
В этом случае 4 вариации сайта будут открываться с адресом https://site, а mag1 и mag2 останутся незатронутыми
Invalid command 'SSLEngine'
Если apache2ctl configtest выдает сообщение:
AH00526: Syntax error on line 25 of /etc/apache2/sites-enabled/velo-ssl.conf:
Invalid command 'SSLEngine', perhaps misspelled or defined by a module not included in the server configuration
Action 'configtest' failed.
то это означает, что мы забыли включить модуль сервера ssl
a2enmod ssl - включаем модуль, затем делаем рестарт apache2