RTFM.WIKI

Ordnung muß sein. Ordnung über alles (18+)

Инструменты пользователя

Инструменты сайта


linux:apache:apache_tnt

Содержание

Трюки с Apache

HowTo - Как сделать xyz?

Редирект 301 http в https

<VirtualHost *:80> 
  ServerName foobar.com
  ServerAlias www.foobar.com
  #Redirect permanent / https://foobar.com/
  Redirect 301 / https://foobar.com/
</VirtualHost>

<VirtualHost *:443>
  ServerName foobar.com
  ServerAlias www.foobar.com
  Protocols h2 http/1.1
</VirtualHost>

если дополнительно надо убрать www, то добавляем vhost 443

  <If "%{HTTP_HOST} == 'www.foobar.com'">
    Redirect permanent / https://foobar.com/
  </If>

также через htaccess

RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301]

либо с указанием домена явно

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://foobar.com/$1 [L,R=301]

и убираем www

RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\.foobar\.com [NC]
RewriteRule ^(.*)$ https://foobar.com/$1 [L,R=301]

AH00558: apache2: Could not reliably determine the server's fully qualified domain name

AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using hola.foobar.com. Set the 'ServerName' directive globally to suppress this message

Добавить в /etc/apache2/apache2.conf или /etc/httpd/conf/httpd.conf

ServerName 127.0.0.1

AH00548: NameVirtualHost has no effect

AH00548: NameVirtualHost has no effect and will be removed in the next release /etc/apache2/ports.conf:5

Это не ошибка

Prior to 2.3.11, NameVirtualHost was required to instruct the server that a particular IP address and port combination was usable as a name-based virtual host. In 2.3.11 and later, any time an IP address and port combination is used in multiple virtual hosts, name-based virtual hosting is automatically enabled for that address.

This directive currently has no effect.

Залогиниться в закрытую часть htpasswd

https://user:[email protected]/area51/

Без https так лучше не делать.

Отличие между AddHandler и SetHandler

Источник: http://blog.brainf.net/servernoe-administrirovanie/raznica-mezhdu-add-handler-i-sethandler/

Веб-сервер apache достаточно прост в настройке. Но тут как и везде есть свои ньюансы. Вы можете заставить его интерпретировать php-файлы c помощью директивы SetHandler либо c помощью AddHandler. На первый взгляд кажется нет никакой разницы, но она на самом деле есть и очень существенна.

А все дело в том что apache допускает у файла несколько расширений. И если вы задаете директиву AddHandler — то вы просто указываете что выполнение как php — это только один из возможных способов обработки файла. В то время как SetHanler указывает однозначное соответствие. Что это означает на практике? Все просто. Рассмотрим следующий случай. У вас есть форма, позволяющяя загружать пользовательские текстовые файлы и при загрузке вы просто проверяете расширение файла. В случае с AddHandler злоумышленнику достаточно назвать файл shell.php.txt и ваш валидатор его спокойно пропустит, а Apache успешно выполнит как php-скрипт

Проверка нагрузки на веб-сервер

Число процессов веб-сервера Apache

# ps aux | grep httpd | wc -l
# ps aux | grep apache2 | wc -l

Число соединений на 80 порту

# netstat -na | grep :80 | wc -l

Число соединений на 80 порту в статусе SYN

# netstat -na | grep :80 | grep syn

Количество соединений на 80 порту с каждого IP

# netstat -na | grep :80 | sort | uniq -c | sort -nr | more

Общее количество соединений с каждого IP

# netstat -anp |grep 'tcp\|udp' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n

Как изменить имя веб-сервера

Иногда внизу страниц 403/404/500 можно заметить нечто вроде Apache/2.4.6 (CentOS) Server at 192.168.13.77 Port 80

Если это включено намерено, но хочется изменить текст, то на помощь придет mod_security

Ставим модуль

# yum install mod_security

Добавляем в файл httpd.conf

ServerTokens Full
ServerSignature On
SecServerSignature "Microsoft Teapot"

И перезапускаем веб-сервер

systemctl restart httpd

Результат

Конечно же mod_security создан не для подобных шуток, а для защиты веб-приложений, но есть и такая вот фича у него.

Как перевыпустить самоподписанный сертификат используя openssl

# uname -a
Linux cool.host.name 2.6.32-279.el6.i686 #1 SMP Fri Jun 22 10:59:55 UTC 2012 i686 i686 i386 GNU/Linux

Истёк срок самоподписаного сертификата в Apache

# echo | openssl s_client -connect IP:443 2>/dev/null | openssl x509 -noout -dates
notBefore=Jan 10 15:19:56 2013 GMT
notAfter=Jan 10 15:19:56 2014 GMT

Смотрим где находятся настройки связанные с SSL в Apache

# grep SSLCertificate /etc/httpd/conf.d/ssl.conf
# Point SSLCertificateFile at a PEM encoded certificate.  If
SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
#   Point SSLCertificateChainFile at a file containing the
#   the referenced file can be the same as SSLCertificateFile
#SSLCertificateChainFile /etc/pki/tls/certs/server-chain.crt

Всегда делаем копию данных

# cp /etc/pki/tls/private/localhost.key /root/
# cp /etc/pki/tls/certs/localhost.crt /root/

Создаём новый сертификат на 10 лет (3652 дня)

# openssl req -new -days 3652 -x509 -nodes -newkey rsa:2048 -out /etc/pki/tls/certs/localhost.crt -keyout /etc/pki/tls/private/localhost.key
Generating a 2048 bit RSA private key
......................+++
........................................................................................................................+++
writing new private key to '/etc/pki/tls/private/localhost.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:Frankfurt
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:
Email Address []:

Возможно потребуется выставить права

# chmod 600 /etc/pki/tls/certs/localhost.crt
# chmod 600 /etc/pki/tls/private/localhost.key

Перезапускаем веб-сервер

# service httpd restart

Проверяем новый сертификат

# echo | openssl s_client -connect 185.72.244.81:443 2>/dev/null | openssl x509 -noout -dates 
notBefore=Jan 20 08:06:16 2017 GMT
notAfter=Jan 20 08:06:16 2027 GMT

Как сделать, чтобы сайт открывался только по доменному имени

Задача: необходимо, чтобы сайт открывался только по доменному имени, а не по IP-адресу.

Решение:

<virtualhost ip_addr:80>
redirect permanent / http://foobar.com/
</virtualhost>

Где http://foobar.com/ – нужный сайт.

http authentication

<IfModule mod_authn_file.c>
  # Apache 2.4 or later
  AuthType Basic
  AuthName "Please provide username and password"
  AuthBasicProvider file
  AuthUserFile "/var/www/vhosts/site.tld/passwd/htaccess.passwd"
  Require valid-user
</IfModule>

<IfModule mod_auth.c>
  # Apache 2.2 or lower
  AuthType Basic
  AuthName "Please provide username and password"
  AuthUserFile "/var/www/vhosts/site.tld/passwd/htaccess.passwd"
  Require valid-user
</IfModule>

Редирект 301 domain.com в www.domain.com используя mod_rewrite

via http://www.adminsehow.com/2009/05/redirect-301-domaincom-to-wwwdomaincom-using-mod_rewrite/

Options +FollowSymLinks
RewriteEngine On
rewritecond %{http_host} ^domain.com [NC]
rewriterule ^(.*)$ http://www.domain.com/$1 [R=301,NC,L]

Как посмотреть список загруженных модулей Apache

# apachectl -M

или

# apachectl -t -D DUMP_MODULES

или (для RHEL, Fedora, CentOS)

# httpd -M

UPD бонус - посмотреть настроенные виртуальные хосты

# httpd -t -D DUMP_VHOSTS

Как посмотреть uptime веб-сервера?

# ps -eo comm,etime | grep httpd
httpd           26-08:33:00
httpd                 01:09
httpd              20:14:45
httpd              20:14:45
httpd              20:14:45
httpd              20:14:45
httpd              20:14:45
httpd              20:14:45
httpd              20:14:45
httpd              20:14:45
httpd              20:14:45
httpd              20:14:45
httpd              20:14:34
httpd              19:45:45
httpd              19:40:57
httpd              19:40:56
httpd              19:40:56

Если включен mod_status

# apachectl status
The 'links' package is required for this functionality.
# yum install links

logrotate, uptime

У сервера uptime год, а вот Apache постоянно перезагружается?

В error_log следующее

[Sun Jun 19 04:41:01 2016] [notice] SIGHUP received.  Attempting to restart
[Sun Jun 26 03:11:03 2016] [notice] SIGHUP received.  Attempting to restart

Как посмотреть, когда был перезагружен Apache

# grep resuming /var/log/httpd/error_log
[Sun Jun 26 03:11:04 2016] [notice] Apache/2.2.15 (Unix) configured -- resuming normal operations

Никакого бага или ошибки здесь нет, это такая фича. При запуске ротации логов Apache делает restart reload.

Файл /etc/logrotate.d/httpd

/var/log/httpd/*log {
    missingok
    notifempty
    sharedscripts
    delaycompress
    postrotate
        /sbin/service httpd reload > /dev/null 2>/dev/null || true
    endscript
}

Как сделать, чтобы Apache не перезапускался и что надо знать про logrotate простому человеку?

Например так - http://httpd.apache.org/docs/2.2/logs.html#piped или же использовать copytruncate ( Logrotate httpd (apache) logs - Possible without reloading httpd after log purge?)

Загадочный cron.daily, а также .hourly и .weekly

Вы когда-нибудь задавались вопросом, а когда собственно они выполняются? Ответ нашёл здесь.

Разные панели Vesta/ISPmgr как раз таки записывают свои правила ротации в cron.daily

Ещё интересное

UPD

Читай МАНтру и будешь труЪ!

Проблема. Настроил в отдельном файле в "/etc/logrotate.d" ротацию своего приложения через каждый час, а она не работает.

/tmp/last_logs {
  hourly
  rotate 5

В чём же дело?

Log files are rotated every hour. Note that usually logrotate is configured to be run by cron daily. You have to change this configuration and run logrotate hourly to be able to really rotate logs hourly.

Как быть? Скопировать /etc/cron.daily/logrotate в /etc/cron.hourly/. В Debian работает.

Ошибки, баги, глюки

handle($request); $response->send();

…$kernel→terminate($request, $response);

Решение

apt install libapache2-mod-php7.4

perhaps misspelled or defined

Err: Invalid command 'Header', perhaps misspelled or defined by a module not included in the server configuration
Fix: a2enmod headers

Err: Invalid command 'SSLProxyEngine', perhaps misspelled or defined by a module not included in the server configuration
Fix: a2enmod ssl

Err: Invalid command 'ProxyPass', perhaps misspelled or defined by a module not included in the server configuration
Fix: a2enmod proxy

Config variable ${APACHE_RUN_USER} is not defined

Ошибка

# apache2 -V
[Fri Apr 20 07:55:30.472544 2018] [core:warn] [pid 11978] AH00111: Config variable ${APACHE_LOCK_DIR} is not defined
[Fri Apr 20 07:55:30.472816 2018] [core:warn] [pid 11978] AH00111: Config variable ${APACHE_PID_FILE} is not defined
[Fri Apr 20 07:55:30.472946 2018] [core:warn] [pid 11978] AH00111: Config variable ${APACHE_RUN_USER} is not defined
[Fri Apr 20 07:55:30.473054 2018] [core:warn] [pid 11978] AH00111: Config variable ${APACHE_RUN_GROUP} is not defined
[Fri Apr 20 07:55:30.473197 2018] [core:warn] [pid 11978] AH00111: Config variable ${APACHE_LOG_DIR} is not defined
[Fri Apr 20 07:55:30.502162 2018] [core:warn] [pid 11978] AH00111: Config variable ${APACHE_LOCK_DIR} is not defined
[Fri Apr 20 07:55:30.503294 2018] [core:warn] [pid 11978] AH00111: Config variable ${APACHE_RUN_DIR} is not defined
[Fri Apr 20 07:55:30.503906 2018] [core:warn] [pid 11978] AH00111: Config variable ${APACHE_LOG_DIR} is not defined
AH00526: Syntax error on line 74 of /etc/apache2/apache2.conf:
Invalid Mutex directory in argument file:${APACHE_LOCK_DIR}

Решение

# source /etc/apache2/envvars
# apache2 -t
Syntax OK

httpd.itk: could not open error log file

Starting httpd: (2)No such file or directory: httpd.itk: could not open error log file /etc/httpd/logs/error_log. Unable to open logs

В /var/log/ нет каталога httpd. Создаём.

mkdir /var/log/httpd

module remoteip_module is already loaded, skipping

Смотрим где у нас дублируется LoadModule

# grep remoteip_module -rI /etc/httpd/*

(98)Address already in use: make_sock: could not bind to address 80

via http://www.webune.com/forums/98address-already-in-use-make-sock-could-not-bind-to-address-80-t1091.html

# for i in `ps auwx | grep -i nobody | awk {'print $2'}`; do kill -9 $i; done
# for i in `lsof -i :80 | grep http | awk {' print $2'}`; do kill -9 $i; done
# for i in `lsof -i :80 | grep http | awk {' print $2'}`; do kill -9 $i; done
# service httpd restart

или так

# fuser -k -n tcp 80

PHP Warning: require_once(): Unable to allocate memory for pool

(28)No space left on device: Couldn't create accept lock (/etc/httpd/logs/accept.lock)

Довольно редко встречающаяся ошибка, в основном связана с неосвобождением системой семафоров, которые выделяет для себя apache.

Решение

# for i in `ipcs -s | awk '/httpd/ {print $2}'`; do (ipcrm -s $i); done

или так

# ipcs -s | grep nobody | perl -e 'while (<STDIN>) { @a=split(/\s+/); print `ipcrm sem $a[1]`}'

Увеличить кол-во семафоров

/etc/sysctl.conf
kernel.msgmni = 1024
kernel.sem = 250 256000 32 1024

Применить изменения

# sysctl -p

http://artkiev.com/blog/error-no-space-left-on-device-couldnt-create-accept-lock.htm

httpd dead but subsys locked

Клон сайта

У вас есть сайт и выделенный IP на сервере. У нехорошего человека есть домен и он направляет DNS на ваш IP. По чужому домену открывается ваш сайт. Вы теряете посетителей.

FIXME

RewriteBase /
RewriteCond %{HTTP_HOST} !^site.ru$ [NC]
RewriteRule ^(.*)$ http://site.ru/$1 [L,R=301]

[authz_core:error]AH01630: client denied by server configuration

http://httpd.apache.org/docs/2.4/upgrading.html#access

In 2.2, access control based on client hostname, IP address, and other characteristics of client requests was done using the directives Order, Allow, Deny, and Satisfy.

In 2.4, such access control is done in the same way as other authorization checks, using the new module mod_authz_host.

Вместо

Order allow,deny
Allow from all

Теперь используется

Require all granted

Ещё немного примеров

Было (2.2)

order allow,deny
deny from 192.168.1.7

Стало (2.4)

Require all granted
Require not ip 192.168.1.7

Было

Order deny,allow
Deny from all

Стало

Require all denied

Either all Options must start with + or -, or no Option may.

Для всех опций надо добавлять +

Правильно

Options +FollowSymLinks -Indexes

Неправильно

Options FollowSymLinks -Indexes

Обсуждение

Ваш комментарий. Вики-синтаксис разрешён:
 
linux/apache/apache_tnt.txt · Последнее изменение: 2022/04/19 18:36 — dx