Page_c76a3fcf https://linux-notes.org Unix/ Linux блог, на котором можно найти полезную информацию по настройке ОС и ПО. Wed, 29 Apr 2020 19:44:50 +0000 ru-RU hourly 1 https://wordpress.org/?v=6.7.2 Page_c76a3fcf https://linux-notes.org/can-t-open-pid-file-var-run-nginx-pid-yet-after-start-too-many-levels-of-symbolic-links/ https://linux-notes.org/can-t-open-pid-file-var-run-nginx-pid-yet-after-start-too-many-levels-of-symbolic-links/#comments Wed, 29 Apr 2020 19:42:21 +0000 https://linux-notes.org/?p=17782 Зашел на сервер я такой, думаю - обновлю его ( давно не ставил обновы на него). Выполнил апдейт. Захотел кое-что поменят в конфиге с nginx ( менял то, что не должно было поломать веб-сервер). Но после рестарта службы - веб-сервер лег вообще... Обидненько!

The post Can’t open PID file /var/run/nginx.pid (yet?) after start: Too many levels of symbolic links first appeared on linux-notes.org.]]>

Зашел на сервер я такой, думаю — обновлю его ( давно не ставил обновы на него). Выполнил апдейт. Захотел кое-что поменят в конфиге с nginx ( менял то, что не должно было поломать веб-сервер). Но после рестарта службы — веб-сервер лег вообще… Обидненько!

PS: Если спросить — чего я автоматом не обновляю пакеты или ОС — та не знаю. Чтобы не лягло все! Это ответ на вопрос ( если у кого-то появится).

Ошибка выглядет так:

(captain-notes)─(✗)─(10:08 PM Wed Apr 29)
└─(/home)─(5 files, 28Kb)─> systemctl status nginx.service
● nginx.service - nginx - high performance web server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
   Active: activating (start) since Wed 2020-04-29 22:06:39 EEST; 1min 54s ago
     Docs: http://nginx.org/en/docs/
   CGroup: /system.slice/nginx.service
           ├─2197 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
           ├─2198 nginx: worker process
           ├─2199 nginx: worker process
           ├─2200 nginx: worker process
           ├─2201 nginx: worker process
           └─2202 nginx: cache manager process

Apr 29 22:06:39 captain-notes systemd[1]: Starting nginx - high performance web server...
Apr 29 22:06:39 captain-notes systemd[1]: Can't open PID file /var/run/nginx.pid (yet?) after start: Too many levels of symbolic links

Приступим к решению!

Can’t open PID file /var/run/nginx.pid (yet?) after start: Too many levels of symbolic links

Приведу пару солюшенов, которые нашел в инете. Перепробовал несколько из них — пофиксил ишью.

Решение №1

Папка /var/run не имеет символической ссылки (symbolic link) для /run директории. Можно проверить это так:

ls -ld /var/run
drwxr-xr-x 12 root root 4096 Apr 29 22:10 /var/run

Так же, папка /run имеется на сервере, проверим:

#  ls -ld /run
drwxr-xr-x 32 root root 980 Apr 29 22:12 /run

Так же, можно грепнуть конфиг nginx:

# grep -ir pid /etc/nginx
/etc/nginx/nginx.conf.default:#pid /var/run/nginx.pid;
/etc/nginx/nginx.conf:#pid /var/run/nginx.pid;

А собственно, решение вот:

# mv /var/run /var/run_orig && ln -s ../run /var/run && ls -ld /var/run

Перезапускаем сервер с nginx и это должно пофиксить проблему.

У меня не решилось… Пробуем другой солюшен….

Решение №2

Смотрим что у нас в конфигах nginx:

# grep -ir pid /etc/nginx
/etc/nginx/nginx.conf:pid        /run/nginx.pid;
/etc/nginx/nginx.conf:#pid /var/run/nginx.pid;

Находим строку:

pid        /var/run/nginx.pid;

И меняем ее на:

pid        /run/nginx.pid;

PS: Можно использовать SED и сделать замену:

# sed -i 's/pid \/var\/run\/nginx.pid/pid \/run\/nginx.pid/' /etc/nginx/nginx.conf

Далее, открываем:

# vim /lib/systemd/system/nginx.service

И меняем строку:

PIDFile=/var/run/nginx.pid

На:

PIDFile=/run/nginx.pid

Чтобы изменения применились, выполняем:

# systemctl daemon-reload

Затем, перезагружаем веб-сервер:

# service nginx restart

В итоге, получаем:

┌(captain-notes)─(✓)─(10:12 PM Wed Apr 29)
└─(/home)─(5 files, 28Kb)─> systemctl status nginx.service
● nginx.service - nginx - high performance web server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2020-04-29 22:12:24 EEST; 10s ago
     Docs: http://nginx.org/en/docs/
  Process: 2996 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
 Main PID: 2997 (nginx)
   CGroup: /system.slice/nginx.service
           ├─2997 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
           ├─2998 nginx: worker process
           ├─2999 nginx: worker process
           ├─3000 nginx: worker process
           ├─3001 nginx: worker process
           ├─3002 nginx: cache manager process
           └─3003 nginx: cache loader process

Apr 29 22:12:24 captain-notes systemd[1]: Starting nginx - high performance web server...
Apr 29 22:12:24 captain-notes systemd[1]: Started nginx - high performance web server.

Я забыл заюзать strace, чтобы отловить ошибку, но нормальное поведение такое:

# strace /run/nginx.pid
execve("/run/nginx.pid", ["/run/nginx.pid"], 0x7ffcaef1ce40 /* 29 vars */) = -1 EACCES (Permission denied)
open("/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=2502, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f8def0a3000
read(3, "# Locale name alias data base.\n#"..., 4096) = 2502
read(3, "", 4096)                       = 0
close(3)                                = 0
munmap(0x7f8def0a3000, 4096)            = 0
open("/usr/share/locale/en_US.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en_US.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en_US/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
fstat(2, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f8def0a3000
write(2, "strace: exec: Permission denied\n", 32strace: exec: Permission denied
) = 32
exit_group(1)                           = ?
+++ exited with 1 +++

ЗАМЕЧАНИЕ! Данная проблема, может касатья не только nginx, но может затронуть mysql или fail2ban и возможно — другие сервисы.

Вот и все, статья «Can’t open PID file /var/run/nginx.pid (yet?) after start: Too many levels of symbolic links» — завершена!

The post Can’t open PID file /var/run/nginx.pid (yet?) after start: Too many levels of symbolic links first appeared on linux-notes.org.]]>
https://linux-notes.org/can-t-open-pid-file-var-run-nginx-pid-yet-after-start-too-many-levels-of-symbolic-links/feed/ 2
Page_c76a3fcf https://linux-notes.org/nastrojka-grafana-s-graphite-zabbix-prometheus-mysql-influxdb-elasticsearch-cloudwatch-dlya-sbora-i-otobrazheniya-metrik-v-unix-linux/ https://linux-notes.org/nastrojka-grafana-s-graphite-zabbix-prometheus-mysql-influxdb-elasticsearch-cloudwatch-dlya-sbora-i-otobrazheniya-metrik-v-unix-linux/#respond Mon, 05 Jun 2017 18:32:05 +0000 http://linux-notes.org/?p=11975 Настройка Grafana с Graphite/Zabbix/Prometheus/MySQL/InfluxDB/Elasticsearch/CloudWatch для сбора и отображения метрик в Unix/Linux Сейчас стало модно использовать разные «хипстерские штуки» и Grafana взяла тренд — это тулза для создания дашбордов по различным метрикам и графиков, которые берутся из других систем.   Я в своей статье, хотел бы рассказать как можно работать с grafana и собирать, строить и использовать различные […]

The post Настройка Grafana с Graphite/Zabbix/Prometheus/MySQL/InfluxDB/Elasticsearch/CloudWatch для сбора и отображения метрик в Unix/Linux first appeared on linux-notes.org.]]>

Настройка Grafana с Graphite/Zabbix/Prometheus/MySQL/InfluxDB/Elasticsearch/CloudWatch для сбора и отображения метрик в Unix/Linux

Сейчас стало модно использовать разные «хипстерские штуки» и Grafana взяла тренд — это тулза для создания дашбордов по различным метрикам и графиков, которые берутся из других систем.   Я в своей статье, хотел бы рассказать как можно работать с grafana и собирать, строить и использовать различные дашборы для своих целей.

Это не означает что все что тут будет описано, вы должны у себя использовать, но если есть необходимость в этом — то можете настроить под свои нужды. Я для своих личных, ознакомительных целей, установил все это дело локально на машине и протестировал работу.

Установка grafana в Unix/Linux

И так, я начну с установки свой графаны:

Установка grafana в Unix/Linux

Хочу отметить следующее, — это то, что grafana слушает 3000-й порт и для удобства, я сейчас сделаю прокси на 80-й порт. Есть много прокси-сервисов, но я предпочитаю nginx. Я приведу статьи по установке nginx:

Установка PHP 7(php-fpm) с nginx 1.9 в Debian 8

Установка Nginx, PHP-FPM, MariaDB на CentOS 7 / RHEL 7

Виртуальный хост для отдельного пользователя с PHP-FPM и nginx

Уcтановка nginx, MySQL, PHP (LEMP) stack на Debian/Ubuntu

Nginx уже имеется в системе, и сейчас нужно создать конфиг для графаны:

# vim /etc/nginx/conf.d/grafana.conf

И прописываем:

server {
 	listen 80;
 	server_name grafana.local;
 	access_log /var/log/nginx/access-grafana.log;
 	error_log /var/log/nginx/error-frafana.log info;
	location / {
		proxy_pass http://127.0.0.1:3000;
		proxy_set_header   Host $host;
		proxy_set_header   X-Real-IP        $remote_addr;
            	proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
		}
}

Где:

  • grafana.local — это мое доменное имя ( я прописал в /etc/hosts свой IP и сопоставил его с grafana.local)

PS: Нужно прописать в исключения 3000-й и 80-й порты. Если используете iptables, то добавьте правило. Если SELinux, вот чтиво:

Настройка SELinux для Apache/Nginx в Unix/Linux

Отключить SELinux на CentOS

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

# vim /etc/grafana/grafana.ini

И приводим к виду:

[paths]
data = /var/lib/grafana
logs = /var/log/grafana
plugins = /var/lib/grafana/plugins

[server]
protocol = http
http_addr = 127.0.0.1
http_port = 3000
domain = localhost
root_url = http://localhost:3000

Вот такой конфиг заработает ( проверялось не одиножды)! Некоторые люди пишут, что можно выполнить следующую команду:

# setcap 'cap_net_bind_service=+ep' /usr/sbin/grafana-server

Но я не проверял этого. Оставил на всякий случай.

Перезапускаем службы:

# service nginx restart
# service grafana-server

Переходим к установке и настройке дургих компонентов.

Установка MYSQL/MariaDB в Unix/Linux

Я тоже не буду приводить подробности по установке, а приведу чтиво:

Установка MySQL на Debian/Ubuntu/Linux Mint

Установка MySQL 5.5 на RHEL / CentOS и Fedora

Установка MariaDB 10 на CentOS 7

Вот может еще пригодится:

Разрешить доступ к MySQL с определенной подсети в Unix/Linux

Сейчас, я создаю пользователя, базу и пароль:

# mysql -uroot -p

Создаем базу и пользователя с паролем:

> create database grafana character set utf8 collate utf8_bin;
> grant all privileges on grafana.* to 'grafana'@'127.0.0.1' IDENTIFIED BY 'Your_passwd_user_grafana';
> flush privileges;

Заходим в графана веб панель. Открываем:

Data Sources ->  Add data source -> MYSQL и вводим свои данные. У меня выглядит вот так:

добавляем data source для grafana

добавляем data source для grafana

PS: Нам говорят что данный плагин находится в тестовом виде и его не особо стоит пока-что юзать.

Нажимаем на «Add», потом на «Save & Test» и у вас будет уже mysql. Открываем когфиг:

# vim /etc/grafana/grafana.ini

И приводим к виду:

[database]
type = mysql
host = 127.0.0.1:3306
name = grafana
user = grafana
password = Your_passwd_user_grafana

Перезапускаем grafana-server:

# service grafana-server restart

После чего, в созданной БД, будут созданы таблицы для работы с графаной.

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

Как по мне — очень хорошее решение. Идем далее….

Установка Zabbix в Unix/Linux

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

Установка Zabbix + nginx+php-fpm + mariaDB в Unix/Linux

Чтобы заюзать grafana дашборд  и настроить все это дело с zabbix, нужно установить плагин (выполните установку на сервере где установлена графана):

# grafana-cli plugins install alexanderzobnin-zabbix-app

После установке каждого плагина, стоит перезапускать grafana сервер:

# service grafana-server restart

Сейчас, стоит активировать установленный плагин, для этого стоит зайти в панель самой графаны ( заюзайте ваш логин и пароль) и открыть «plugins» -> «zabbix» -> «enable».

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

Data Sources ->  Add data source -> Zabbix и вводим свои данные.

Как это выглядит:

Dashboard grafana с CloudWatch

Dashboard grafana с CloudWatch

Я использую графану только в сочетании с заббикс. Выглядит очень круто. Не так ли?

Установка Graphite в Unix/Linux

Не было нужды в использовании ( я дополню статью). Но если имеется уже готовый сервер с графитом, то вы можете

добавить Data Sources, для этого заходим в графана веб панель. Открываем:

Data Sources ->  Add data source -> Graphite и вводим свои данные.

Как-то так.

Установка Elasticsearch в Unix/Linux

Выполняем установку:

Установка ElasticSearch (один сервер) кластер в Unix/Linux

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

Data Sources ->  Add data source -> Elasticsearch и вводим свои данные.

Как-то так.

Установка CloudWatch в Unix/Linux

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

Data Sources ->  Add data source -> CloudWatch и вводим свои данные.

Как это выглядит:

Dashboard grafana с CloudWatch

Dashboard grafana с CloudWatch

Как-то так.

Установка Prometheus в Unix/Linux

Установка этого чуда еще предстоит в будущем. Но если имеется уже сервер с CollectD, то можно добавить Data Sources, для этого заходим в графана веб панель. Открываем:

Data Sources ->  Add data source -> Prometheus и вводим свои данные.

Как-то так.

Установка InfluxDB в Unix/Linux

Выполняем установку:

Установка InfluxDB в Unix/Linux

Установка этого чуда еще предстоит в будущем. Но если имеется уже сервер с InfluxDB, то можно добавить Data Sources, для этого заходим в графана веб панель. Открываем:

Data Sources ->  Add data source -> InfluxDB и вводим свои данные. Строим графики и наслаждаемся. Наверное стоит рассказать как строятся графики, но на все времени нет…. При первой возможности, обязательно дополню статью.

Как-то так.

 

Настройка Grafana уведомлений

Для начала, устанавливаем почтовый сервер, я описывал все это дело в своей статье:

Установка почтового сервера Postfix, Dovecot и SquirrelMail в CentOS/Redhat/Fedora

Удалить/Очистить/Сбросить очередь в postfix

Если имеется почтовый сервер, то нужно немного настроить конфиг графаны:

# vim /etc/grafana/grafana.ini

И приводим к виду:

[smtp]
enabled = true
host = localhost:25
cert_file =
key_file =
skip_verify = true
from_address = admin@localhost
from_name = Grafana

Конечно же, перезапускаем сервер:

# service grafana-server restart

А сейчас, открываем графана:

Alerting -> Configure notifications ->  New Channel ->  Заполняем данные и пробуем отправить тестовое сообщение на почту.

Вот и все. Статья «Настройка Grafana с Graphite/Zabbix/Prometheus/MySQL/InfluxDB/Elasticsearch/CloudWatch для сбора и отображения метрик в Unix/Linux» завершена.

The post Настройка Grafana с Graphite/Zabbix/Prometheus/MySQL/InfluxDB/Elasticsearch/CloudWatch для сбора и отображения метрик в Unix/Linux first appeared on linux-notes.org.]]>
https://linux-notes.org/nastrojka-grafana-s-graphite-zabbix-prometheus-mysql-influxdb-elasticsearch-cloudwatch-dlya-sbora-i-otobrazheniya-metrik-v-unix-linux/feed/ 0
Page_c76a3fcf https://linux-notes.org/nastrojka-process-manager-dynamic-static-ondemand-dlya-php-fpm-v-unix-linux/ https://linux-notes.org/nastrojka-process-manager-dynamic-static-ondemand-dlya-php-fpm-v-unix-linux/#comments Sun, 19 Feb 2017 02:27:46 +0000 http://linux-notes.org/?p=11844 Настройка «process manager(dynamic/static/ondemand)» для php-fpm в Unix/Linux Покопавшись у себя в черновиках, я нашел довольно интересную тему — настройка процесс менеджера для работы php-fpm и nginx. Я постараюсь рассказать как можно больше информации по этой теме. Расскажу на наглядных примерах что лучше и как считается некоторые важные параметры в php-fpm. И так, что такое «process […]

The post Настройка «process manager(dynamic/static/ondemand)» для php-fpm в Unix/Linux first appeared on linux-notes.org.]]>

Настройка «process manager(dynamic/static/ondemand)» для php-fpm в Unix/Linux

Покопавшись у себя в черновиках, я нашел довольно интересную тему — настройка процесс менеджера для работы php-fpm и nginx. Я постараюсь рассказать как можно больше информации по этой теме. Расскажу на наглядных примерах что лучше и как считается некоторые важные параметры в php-fpm.

И так, что такое «process manager» в php-fpm? Process manager в php-fpm — это менеджер процессов для PHP-FPM, который создает и использует PHP процессы, чтобы получить максимальную отдачу от вашего сервера.

Разновидности Process manager в php-fpm:

  • dynamic — Имеет динамическое число pm.max_children (дочерние процессы). Которое изменяется и задается на основании: pm.max_children, pm.start_servers, pm.min_spare_servers, pm.max_spare_servers.
  • static — Имеет фиксированное число pm.max_children (дочерние процессы).
  • ondemand — Дочерние процессы не запускаются с самого начала. Количество процессов, создаются по требованию (по мере появления запросов, в отличии от PM dynamic, когда запускается  заданное количество процессов, равное pm.start_servers, при старте службы.

Это 3 основных процесс менеджера для php-fpm-а.

Настройка process manager как dynamic для php-fpm в Unix/Linux

Стандартный менеджер процессов и он хорош тем, что имеет несколько PHP-FPM мастеров.

И так, редактируем свой пул и выставляем:

pm = dynamic

И так, сейчас можно определить максимальное количество процессов. Для этого имеется формула:

Total Max Processes = (Total Ram - (Used Ram + Buffer)) / (Memory per php process)

Предположим, что на сервере имеется 6Гб RAM, но посмотреть можно следующей утилитой:

# cat /proc/meminfo | grep -E 'MemTotal'
MemTotal:        6291456 kB

Проверяем сколько использует памяти PHP-FPM с помощью следующей команды:

# ps -aylC "php-fpm" | grep -Ev "grep" | sort -n | awk '{sum+=$8; ++n} END {print "Tot="sum"("n")";print "Avg="sum"/"n"="sum/n/1024"MB"}'
Tot=3126148(46)
Avg=3126148/46=66.3669MB

Чтобы вывести все php-fpm процессы, используйте:

# ps --no-headers -o "rss,cmd" -C php-fpm | sort -n | awk '{print $1/1024 " Mb"}'

Самый «жирный» процесс:

# ps --no-headers -o "rss,cmd" -C php-fpm | sort -n | awk '{print $1/1024,"Mb"}' | tail -n1

Еще один способ:

В 1-й вкладке запускаем:

# while true; do curl http://linux-notes.org &> /dev/null; sleep 1; done

Во 2-й вкладке запускаем проверку:

# ps aux | grep -E 'php-fpm'| grep -Ev "grep" | awk '{print $6/1024, "Mb"}'

Снова таки, я показал список всех процессов. Как правильно поступить и взять среднее значение или самое больше — решать вам. Нужно все тестировать! Количество памяти занятой процессами, можно проверить через утилиту ps_mem:

Установка ps_mem для проверки занятой памяти процессами в Unix/Linux

Тогда максимальное количество процессов можно посчитать (Я решил отдать под использование PHP всю RAM):

(1024*6) / 66 = 93.0909

Видим что можно использовать 93 max servers для php-fpm:

pm = dynamic
pm.max_children = 93 
pm.start_servers = 30
pm.min_spare_servers = 30
pm.max_spare_servers = 45 
pm.process_idle_timeout = 10s;

Главные параметры:

  • pm = dynamic — Как уже говорилось, это менеджер процессов.
    pm = dynamic
  • pm.max_children — Задается максимальное количество дочерних процессов (процессы-потомки), которые создаются PM.
    pm.max_children= (Общее количество виртуальной памяти)/(память выделенная 1 php процессу) = 93
  • pm.start_servers — Задается количество процессов-потомков, которые будут созданы PM при запуске PHP-FMP.
    pm.start_servers = ~(pm.max_children/3) = 31
  • pm.min_spare_servers — Задается количество процессов, которые должны оставаться в idle, как “запасные”, ожидая задач на выполнение, если количество меньше – будут созданы новые;
    pm.min_spare_servers = ( устанавливаю в 1 ядро) ИЛИ ~(pm.max_children/3) = 31
  • pm.max_spare_servers — наоборот, максимальное количество процессов, которые должны оставаться в idle,если количество больше – некоторые потомки будут уничтожены:
    pm.max_spare_servers = (общему количеству ядер) ИЛИ ~(pm.max_children/2) = 45
  • pm.max_requests – количество запросов процесса, после которого он будет пересоздан, полезно для предотвращения утечек памяти (memory-leak);
    pm.max_requests =  100000
  • pm.process_idle_timeout — время в секундах после чего простаивающий процесс будет удалён.
    pm.process_idle_timeout = 10s

Обратите внимание, что я не принял во внимание (Used Ram + Buffer). Это было бы нужно, если на сервере имелись базы данных:

# cat /proc/meminfo | grep -E '(MemTotal|MemFree|Cached)'
MemTotal:        6291456 kB
MemFree:         1678704 kB
Cached:          2205940 kB

Проверить использование буфера  и памяти, можно следующей командой:

# free -m
              total        used        free      shared  buff/cache   available
Mem:           6144        1521        1622         641        3000        3716
Swap:             0           0           0

Тогда, можно было бы пересчитать:

Total Max Processes = (6144 - (1521 + 3000)) / 66 = 24

Перезапускаем php-fpm службу:

$ sudo service php5-fpm restart

или

# service php-fpm restart

PS: Используйте команду в зависимости типа ОС.

Теперь будем использовать htop/top и ab чтобы проверить что и как работает.

Выполняем стрестест:

ab -n 10000 -c 500 http://localhost/index.php

Как-то так.

Имеется скрипт для рекомендаций:

# cd /usr/local/src && wget http://linux-notes.org/wp-content/uploads/scripts/php-fpm/php-fpmpal.sh -q -O - | bash

Дает вполне годные указания:

 (        )  (         (     (       *                      
 )\ )  ( /(  )\ )      )\ )  )\ )  (  `                 (   
(()/(  )\())(()/(     (()/( (()/(  )\))(             )  )\  
 /(_))((_)\  /(_))     /(_)) /(_))((_)()\  `  )   ( /( ((_) 
(_))   _((_)(_))      (_))_|(_))  (_()((_) /(/(   )(_)) _   
| _ \ | || || _ \ ___ | |_  | _ \ |  \/  |((_)_\ ((_)_ | |  
|  _/ | __ ||  _/|___|| __| |  _/ | |\/| || '_ \)/ _` || |  
|_|   |_||_||_|       |_|   |_|   |_|  |_|| .__/ \__,_||_|  
========================================= |_| =============


AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 31.187.70.238. Set the 'ServerName' directive globally to suppress this message
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 31.187.70.238. Set the 'ServerName' directive globally to suppress this message
===== List of PHP-FPM pools =====
--- nagios ---
Configuration file: /etc/php-fpm.d/nagios.conf
List of processes: 53028 53029 53030 53031 53032
Number of processes: 5
Current max_children value: 50
Total memory usage for pool in KB: 54440
Average memory usage per process in KB: 10888
Total potential memory usage for pool (based on average process) (KB): 544400
Largest process in this pool is (KB): 10888
Total potential memory usage for pool (based on largest process) (KB): 544400

--- www ---
Configuration file: /etc/php-fpm.d/www.conf
List of processes: 53033 53034 53035 53036 53037 53038 53039 53040 53041 53042 53043 53044 53045 53046 53047 53048 53049 53050 53051 53052 53053 53054 53055 53056 53057 53058 53059 53060 53061 53062 53083 53119 53434 53491 61608 73379
Number of processes: 36
Current max_children value: 50
Total memory usage for pool in KB: 2295440
Average memory usage per process in KB: 63762
Total potential memory usage for pool (based on average process) (KB): 3188100
Largest process in this pool is (KB): 67792
Total potential memory usage for pool (based on largest process) (KB): 3389600

===== Server memory usage statistics =====
Total server memory in KB: 6291456
  =Total Apache memory usage in KB: 0
  =Total nginx memory usage in KB: 55868
  =Total Varnish memory usage in KB: 0 0
  =Total MySQL memory usage in KB: 201324.8
  =Total PHP-FPM memory usage in KB: 2349880

Memory available to assign to PHP-FPM pools in KB: 6099670 (total free memory + PHP-FPM's current memory usage)

Total potential PHP-FPM memory usage based on largest processes (KB): 3934000 (64.49%) ...GOOD :-)
Total potential PHP-FPM memory usage based on average process size (KB): 3732500 (61.19%) ...GOOD :-)

===== Recommendations per pool =====
-- nagios -- currently uses 54440 KB memory (2.31% of all PHP-FPM memory usage). It should be allowed to use about 140902 KB of all available memory. Its average process size is 10888 KB so this means max_children should be set to ~12. It is currently set to 50 (this can be changed in /etc/php-fpm.d/nagios.conf).
-- www -- currently uses 2295440 KB memory (97.68% of all PHP-FPM memory usage). It should be allowed to use about 5958157 KB of all available memory. Its average process size is 63762 KB so this means max_children should be set to ~93. It is currently set to 50 (this can be changed in /etc/php-fpm.d/www.conf).

===== Other considerations to take into account =====
From the PHP-FPM error logfiles (/var/log/php-fpm/error.log):
 - pool www had reached its max_children value of 50 on 2 occasion(s)

For these pools you may want to compare the recommended max_children value to this information, and decide whether the recommended value would be high enough to prevent max_children from being hit in future.

Note: It is not ideal to run PHP-FPMpal shortly after restarting PHP-FPM or your webservices. This is because PHP-FPMpal makes recommendations based on the average pool process size, and if PHP-FPM was restarted a short while ago then the likelihood is high that there won't have been many requests made to the sites since the restart, and metrics will be skewed and not show a normalised average.
It is also worth noting that if you've recently restarted any services that normally use up a large amount of memory then you probably want to wait a while before running PHP-FPMpal (e.g. if MySQL normally uses 50% of memory, but you've just restarted it then it may only use 10% of memory right now, thus the recommendations will be very skewed).

============================================================

Идем далее…

Настройка process manager как static для php-fpm в Unix/Linux

Статический менеджер процессов почти не используется, из-за того, что имеется 1 PHP-FPM master.

Открываем свой пул из php-fpm-а и меняем параметры:

pm = static
pm.max_children = 5

Перезапускаем php-fpm службу:

$ sudo service php5-fpm restart

или

# service php-fpm restart

PS: Используйте команду в зависимости типа ОС.

Выполняем стрестест:

# ab -n 1000 -c 10 http://localhost/index.php
# ab -n 5000 -c 20 http://localhost/index.php

Больше об утилите «ab» можно узнать в статье:

Проверка нагрузки на web-сервер с ab для Linux и Unix

Открываем конфигурационный файл для php-fpm пула. Его можно найти поискам ( если кто-то не знает где лежит он).

Раскомментируем строчку с  «pm.max_requests» опцией:

pm.max_requests = 500

Снова перезапускаем php-fpm и проверяем нагрузку:

# ab -n 5000 -c 20 http://localhost/index.php

Можно видеть,  что некоторые процессы — умерли, а затем некоторые процессы были убиты, а затем они сново породились!

Настройка process manager как ondemand для php-fpm в Unix/Linux

Самый продвинутый ( на мой взгляд) менеджер процессов. С названия очевидно, что он не оставляет процессы, но создает их, по мере необходимы.

Пример пула выглядит следующим образом:

[linux-notes.og]
user = www-data
group = www-data
listen = /var/run/php5-fpm/linux-notes.og/sock
listen.owner = www-data
listen.group = www-data
listen.mode = 770
chdir = /srv/www/wp-content/linux-notes.og/
pm = ondemand
pm.max_children = 5
pm.max_requests = 500

Главные параметры:

  • pm = ondemand — Как уже говорилось, это менеджер процессов.
    pm = ondemand
  • pm.max_children — Задаем максимальное число дочерних-процессов.
    pm.max_children= (Общее количество виртуальной памяти)/(память выделенная 1 php процессу) = 93
  • pm.process_idle_timeout — Задаем время в секундах после чего простаивающий процесс будет удалён.
    pm.process_idle_timeout = 10s
  • pm.max_requests — Задаем количество обработаных запросов, после которых процессы php-fpm будут перезагружены.
    pm.max_requests =  100000

Если вам нужна большая производительность, то менеджер процессов — «OnDemand» не подойдет вам. Тем не менее, на 90% случаев, конфигурация PHP-FPM в режиме OnDemand лучше, чем static или dynamic.

The post Настройка «process manager(dynamic/static/ondemand)» для php-fpm в Unix/Linux first appeared on linux-notes.org.]]>
https://linux-notes.org/nastrojka-process-manager-dynamic-static-ondemand-dlya-php-fpm-v-unix-linux/feed/ 1
Page_c76a3fcf https://linux-notes.org/pokazat-skry-t-fajly-i-papki-v-nginx-apache/ https://linux-notes.org/pokazat-skry-t-fajly-i-papki-v-nginx-apache/#respond Thu, 24 Nov 2016 03:19:43 +0000 http://linux-notes.org/?p=11225 Показать/Скрыть файлы и папки в Nginx/Apache Злоумышленник может просматривать файлы, находящиеся в каталоге и потенциально может получить доступ к файлам, по этому, желательно отключать автоиндекс в папке. Но иногда нужно и видеть некоторые файлы в определенной папке и в своей статье «Показать/Скрыть файлы и папки в Nginx/Apache», я расскажу как можно выключить или включить просмотр […]

The post Показать/Скрыть файлы и папки в Nginx/Apache first appeared on linux-notes.org.]]>

Показать/Скрыть файлы и папки в Nginx/Apache

Злоумышленник может просматривать файлы, находящиеся в каталоге и потенциально может получить доступ к файлам, по этому, желательно отключать автоиндекс в папке. Но иногда нужно и видеть некоторые файлы в определенной папке и в своей статье «Показать/Скрыть файлы и папки в Nginx/Apache», я расскажу как можно выключить или включить просмотр содержимого каталога в веб-серверах nginx или apache.

Показать/Скрыть файлы и папки в Nginx

Можно прописать изменения в nginx.conf или в любом другом виртуальном хосте. Безопасная конфигурация для запрашиваемого каталога должен быть похожа:

location /My_some_folder {
         autoindex off; 
}

Данная конфигурация запретить запросы на просмотр My_some_folder каталога. Если нужно включить просмотр содержимого, используйте:

 location /My_some_folder {
          autoindex on; 
          autoindex_exact_size off;
          autoindex_localtime on;
}

Разъяснения:

  • autoindex on — Данная конфигурация разрешит запросы на просмотр My_some_folder каталога.
  • autoindex_exact_size off — Выполняем округление размера для файлов (мб, гб). Если установить в  «on» — то будет показывать точный размер в байтах.
  • autoindex_localtime on — Включаем отображение локального времени на сервере (когда создался, модифицировался и так далее). При использовании «of», будет использовать GMT.
  • charset utf-8; — Можно прописать его для отображения русских файлов и папок в Unix/Linux-системах.

После чего, нужно перезапустить веб-сервер nginx:

# service nginx restart

Показать/Скрыть файлы и папки в Apache

Если нет DirectoryIndex (обычно не сконфигурирован как index.html, index.htm, index.php, welcome.html) присутствует в каталоге, и если mod_autoindex включен (который по умолчанию обычно включен), Apache будет выводить список содержимого каталога;

Отключение mod_autoindex

Самый простой способ, чтобы отключить модуль AUTOINDEX полностью — это отключение самого модуля с apache

# a2dismod autoindex

Можно тключить автоиндекс для определенной папки

Вот пример конфигурации:

<Directory /home/my_site/www>
Options -Indexes
</Directory>

ЗАМЕЧАНИЕ!

  1. -Indexes — Запрещает вывод файлов и папок
  2. +Indexes — Розрешает вывод файлов и папок

Перезапускаем apache/httpd сервер.

Прописать изменения в .htaccess файл

Описанный выше способ также будет работать, если прописать в .htaccess:

Options -Indexes

или чтобы видеть содержимое:

Options +Indexes

Перезапускаем apache/httpd сервер.

Тема «Показать/Скрыть файлы и папки в Nginx/Apache» завершена.

The post Показать/Скрыть файлы и папки в Nginx/Apache first appeared on linux-notes.org.]]>
https://linux-notes.org/pokazat-skry-t-fajly-i-papki-v-nginx-apache/feed/ 0
Page_c76a3fcf https://linux-notes.org/ustanovka-senginx-v-unix-linux/ https://linux-notes.org/ustanovka-senginx-v-unix-linux/#respond Tue, 22 Nov 2016 04:10:53 +0000 http://linux-notes.org/?p=11317 Установка SEnginx в Unix/Linux SEnginx (Security Enhanced NGINX) — представляет собой один из вариантов веб-сервера nginx (HTTP и обратный прокси-сервер). Он имеет улучшенный функциональность и наследует все оригинальные черты от nginx и так же, он совместим с конфигурацией самого энжинкса. SeNginx — это сборка NGINX с дополнительными модулями безопасности, а именно: HTTP Robot Mitigation — модуль Roboo который […]

The post Установка SEnginx в Unix/Linux first appeared on linux-notes.org.]]>

Установка SEnginx в Unix/Linux

SEnginx (Security Enhanced NGINX) — представляет собой один из вариантов веб-сервера nginx (HTTP и обратный прокси-сервер). Он имеет улучшенный функциональность и наследует все оригинальные черты от nginx и так же, он совместим с конфигурацией самого энжинкса.

SeNginx — это сборка NGINX с дополнительными модулями безопасности, а именно:

  • HTTP Robot Mitigation — модуль Roboo который переписали на С и он защищает домен от различных ботов, не поддерживающих Javascript/Flash. Таких ботов в данный момент большинство, хотя и появляются новые боты (PhantomJS, Zombie JS и т.д.), поддерживающие Java — таких ботсетей пока гораздо меньше.
  • Naxsi & Mod Security — модули защиты от SQL, XSS и web сканеров с помощью Whitelist и наборов правил.
  • User-Agent Whitelist with DNS Reverse Resolve — возможность добавлять в список разрешений ботов, которые используются поисковыми системами (Google, Yandex и т.д.) с проверкой по Reverse DNS, что позволит запретить доступ ботам, которые имеют UserAgent: googlebot, но таковыми на самом деле не являются.
  • Dynamic IP Blacklist — модуль позволяет вносить IP адреса ботов или сканеров в черный список в автоматическом режиме, записывать их в log файл и при желании разблокировать через определенное время
  • NetEye Security Layer — модуль, позволяющий интегрировать различные модули безопасности между собой и установить, в каком порядке они производят проверки
  • Statistics — удобный модуль статистики в JSON формате, отображающий как статистику самого NGINX, так и модулей безопасности.

В дополнение, в SeNginx присутствуют модули для Load Balancing (Session Persistence, Fastest Load Balancing Algorithm / Fair Load Balancing Alogorithm ), MIME cache модуль, а также поддержка Syslog.

В итоге, SeNginx — это очень мощный инструмент противодействия ботам и автоматизированным сканерам безопасности, которые используются для поиска уязвимостей на вашем сайте.

Установка SEnginx в Unix/Linux

Расскажу как установить SEnginx на различные *NIX ОС.

Установка SEnginx на CentOS/Fedora/RedHat

Установим необходимое ПО:

# yum install pcre-devel openssl autoconf make libtool openssl-devel httpd-devel libxml2* gcc automake libtool curl curl-devel -y

На момент написания данной статьи, я использовал последнюю версию данной утилиты:

# cd /usr/local/src && wget http://senginx.org/download/senginx-1.6.2.tar.gz && tar xfvz senginx-*.tar.gz && cd senginx-*

Приступаем к конфигурированию:

# ./se-configure.sh --prefix=/usr/local/senginx
# make && make install

Компилирование ModSecurity в SEnginx
ModSecurity интегрирован в 1.5 и не компилируеться по умолчанию. Если хотите использовать ModSecurity в SEnginx, то используйте:

# ./se-configure.sh --prefix=/usr/local/senginx --with-modsecurity
# make && make install

PS: Как использовать mod_security, я описывал в своей статье:
Установка mod_security для apache/nginx в Unix/Linux

Собственно, все установилось и готово к использованию.

Сейчас, нужно созать инит скрипт для работы с веб-сервером:

# vim /etc/init.d/senginx

И прописываем:

#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig:   - 85 15
# description:  NGINX is an HTTP(S) server, HTTP(S) reverse \
#               proxy and IMAP/POP3 proxy server
# processname: nginx
# config:      /etc/nginx/nginx.conf
# config:      /etc/sysconfig/nginx
# pidfile:     /var/run/nginx.pid
 
# Source function library.
. /etc/rc.d/init.d/functions
 
# Source networking configuration.
. /etc/sysconfig/network
 
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
 
nginx="/usr/local/senginx/sbin/nginx"
prog=$(basename $nginx)
 
NGINX_CONF_FILE="/usr/local/senginx/conf/nginx.conf"
 
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
 
lockfile=/var/lock/subsys/nginx
 
make_dirs() {
   # make required directories
   user=`$nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
   if [ -z "`grep $user /etc/passwd`" ]; then
       useradd -M -s /bin/nologin $user
   fi
   options=`$nginx -V 2>&1 | grep 'configure arguments:'`
   for opt in $options; do
       if [ `echo $opt | grep '.*-temp-path'` ]; then
           value=`echo $opt | cut -d "=" -f 2`
           if [ ! -d "$value" ]; then
               # echo "creating" $value
               mkdir -p $value && chown -R $user $value
           fi
       fi
   done
}
 
start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    make_dirs
    echo -n $"Starting $prog: "
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}
 
stop() {
    echo -n $"Stopping $prog: "
    killproc $prog -QUIT
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}
 
restart() {
    configtest || return $?
    stop
    sleep 1
    start
}
 
reload() {
    configtest || return $?
    echo -n $"Reloading $prog: "
    killproc $nginx -HUP
    RETVAL=$?
    echo
}
 
force_reload() {
    restart
}
 
configtest() {
  $nginx -t -c $NGINX_CONF_FILE
}
 
rh_status() {
    status $prog
}
 
rh_status_q() {
    rh_status >/dev/null 2>&1
}
 
case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart|configtest)
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
            ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
        exit 2
esac

Выставляем права:

# chmod +x  /etc/init.d/senginx

И запускаем сервер:

# service senginx restart

или

# /etc/init.d/senginx restart

Можно проверить что имеется в сборке:

# /usr/local/senginx/sbin/nginx -V
nginx version: senginx/1.6.2
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-17) (GCC) 
TLS SNI support enabled
configure arguments: --prefix=/usr/local/senginx --add-module=/usr/local/src/senginx-1.6.2/neusoft/ngx_http_neteye_security --add-module=/usr/local/src/senginx-1.6.2/3rd-party/naxsi/naxsi_src --add-module=/usr/local/src/senginx-1.6.2/3rd-party/nginx-upstream-fair --add-module=/usr/local/src/senginx-1.6.2/3rd-party/headers-more-nginx-module --add-module=/usr/local/src/senginx-1.6.2/3rd-party/ngx_http_substitutions_filter_module --add-module=/usr/local/src/senginx-1.6.2/3rd-party/nginx_tcp_proxy_module --add-module=/usr/local/src/senginx-1.6.2/neusoft/ngx_http_upstream_fastest --add-module=/usr/local/src/senginx-1.6.2/neusoft/ngx_http_upstream_persistence --add-module=/usr/local/src/senginx-1.6.2/neusoft/ngx_http_session --add-module=/usr/local/src/senginx-1.6.2/neusoft/ngx_http_robot_mitigation --add-module=/usr/local/src/senginx-1.6.2/neusoft/ngx_http_status_page --add-module=/usr/local/src/senginx-1.6.2/neusoft/ngx_http_if_extend --add-module=/usr/local/src/senginx-1.6.2/neusoft/ngx_http_cache_extend --add-module=/usr/local/src/senginx-1.6.2/neusoft/ngx_http_cookie_poisoning --add-module=/usr/local/src/senginx-1.6.2/neusoft/ngx_http_web_defacement --add-module=/usr/local/src/senginx-1.6.2/neusoft/ngx_http_ip_blacklist --add-module=/usr/local/src/senginx-1.6.2/neusoft/ngx_http_ip_behavior --add-module=/usr/local/src/senginx-1.6.2/neusoft/ngx_http_whitelist --add-module=/usr/local/src/senginx-1.6.2/neusoft/ngx_http_statistics --add-module=/usr/local/src/senginx-1.6.2/3rd-party/ngx_cache_purge-1.3 --add-module=/usr/local/src/senginx-1.6.2/3rd-party/srcache-nginx-module --add-module=/usr/local/src/senginx-1.6.2/3rd-party/memc-nginx-module

Можно сделать красивей и удобней — прописать в среде окружения путь к nginx:

# vim ~/.bash_profile

Находим поле с PATH и добавляем в него:

/usr/local/senginx/sbin

У меня это выглядит вот так:

PATH=$PATH:$HOME/bin:/usr/local/bin:/usr/local/sbin:/usr/local/senginx/sbin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin:/opt/local/bin

export PATH

Применим конфигурацию:

# source ~/.bash_profile

После чего, можно вызывать информацию вот так:

# nginx -V
nginx version: senginx/1.6.2
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-17) (GCC) 
TLS SNI support enabled
configure arguments: --prefix=/usr/local/senginx --add-module=/usr/local/src/senginx-1.6.2/neusoft/ngx_http_neteye_security --add-module=/usr/local/src/senginx-1.6.2/3rd-party/naxsi/naxsi_src --add-module=/usr/local/src/senginx-1.6.2/3rd-party/nginx-upstream-fair --add-module=/usr/local/src/senginx-1.6.2/3rd-party/headers-more-nginx-module --add-module=/usr/local/src/senginx-1.6.2/3rd-party/ngx_http_substitutions_filter_module --add-module=/usr/local/src/senginx-1.6.2/3rd-party/nginx_tcp_proxy_module --add-module=/usr/local/src/senginx-1.6.2/neusoft/ngx_http_upstream_fastest --add-module=/usr/local/src/senginx-1.6.2/neusoft/ngx_http_upstream_persistence --add-module=/usr/local/src/senginx-1.6.2/neusoft/ngx_http_session --add-module=/usr/local/src/senginx-1.6.2/neusoft/ngx_http_robot_mitigation --add-module=/usr/local/src/senginx-1.6.2/neusoft/ngx_http_status_page --add-module=/usr/local/src/senginx-1.6.2/neusoft/ngx_http_if_extend --add-module=/usr/local/src/senginx-1.6.2/neusoft/ngx_http_cache_extend --add-module=/usr/local/src/senginx-1.6.2/neusoft/ngx_http_cookie_poisoning --add-module=/usr/local/src/senginx-1.6.2/neusoft/ngx_http_web_defacement --add-module=/usr/local/src/senginx-1.6.2/neusoft/ngx_http_ip_blacklist --add-module=/usr/local/src/senginx-1.6.2/neusoft/ngx_http_ip_behavior --add-module=/usr/local/src/senginx-1.6.2/neusoft/ngx_http_whitelist --add-module=/usr/local/src/senginx-1.6.2/neusoft/ngx_http_statistics --add-module=/usr/local/src/senginx-1.6.2/3rd-party/ngx_cache_purge-1.3 --add-module=/usr/local/src/senginx-1.6.2/3rd-party/srcache-nginx-module --add-module=/usr/local/src/senginx-1.6.2/3rd-party/memc-nginx-module

Или если использовать ( скомпилировать) с mod_security:

nginx version: senginx/1.6.2
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-17) (GCC) 
TLS SNI support enabled
configure arguments: --prefix=/usr/local/senginx --add-module=/usr/local/src/senginx-1.6.2/3rd-party/ModSecurity/nginx/modsecurity --add-module=/usr/local/src/senginx-1.6.2/neusoft/ngx_http_neteye_security --add-module=/usr/local/src/senginx-1.6.2/3rd-party/naxsi/naxsi_src --add-module=/usr/local/src/senginx-1.6.2/3rd-party/nginx-upstream-fair --add-module=/usr/local/src/senginx-1.6.2/3rd-party/headers-more-nginx-module --add-module=/usr/local/src/senginx-1.6.2/3rd-party/ngx_http_substitutions_filter_module --add-module=/usr/local/src/senginx-1.6.2/3rd-party/nginx_tcp_proxy_module --add-module=/usr/local/src/senginx-1.6.2/neusoft/ngx_http_upstream_fastest --add-module=/usr/local/src/senginx-1.6.2/neusoft/ngx_http_upstream_persistence --add-module=/usr/local/src/senginx-1.6.2/neusoft/ngx_http_session --add-module=/usr/local/src/senginx-1.6.2/neusoft/ngx_http_robot_mitigation --add-module=/usr/local/src/senginx-1.6.2/neusoft/ngx_http_status_page --add-module=/usr/local/src/senginx-1.6.2/neusoft/ngx_http_if_extend --add-module=/usr/local/src/senginx-1.6.2/neusoft/ngx_http_cache_extend --add-module=/usr/local/src/senginx-1.6.2/neusoft/ngx_http_cookie_poisoning --add-module=/usr/local/src/senginx-1.6.2/neusoft/ngx_http_web_defacement --add-module=/usr/local/src/senginx-1.6.2/neusoft/ngx_http_ip_blacklist --add-module=/usr/local/src/senginx-1.6.2/neusoft/ngx_http_ip_behavior --add-module=/usr/local/src/senginx-1.6.2/neusoft/ngx_http_whitelist --add-module=/usr/local/src/senginx-1.6.2/neusoft/ngx_http_statistics --add-module=/usr/local/src/senginx-1.6.2/3rd-party/ngx_cache_purge-1.3 --add-module=/usr/local/src/senginx-1.6.2/3rd-party/srcache-nginx-module --add-module=/usr/local/src/senginx-1.6.2/3rd-party/memc-nginx-module

Вот и все, тема «Установка SEnginx в Unix/Linux» завершена.

The post Установка SEnginx в Unix/Linux first appeared on linux-notes.org.]]>
https://linux-notes.org/ustanovka-senginx-v-unix-linux/feed/ 0
Page_c76a3fcf https://linux-notes.org/ustanovka-mod_security-dlya-apache-nginx-v-unix-linux/ https://linux-notes.org/ustanovka-mod_security-dlya-apache-nginx-v-unix-linux/#respond Tue, 22 Nov 2016 00:08:52 +0000 http://linux-notes.org/?p=6479 Установка mod_security для apache/nginx в Unix/Linux ModSecurity — свободный фаервол веб-приложений с открытым исходным кодом (англ. Web Application Firewall, или WAF), который разработан с помощью SpiderLabs TrustWave и который обеспечивает защиту от различных атак на веб-приложения (веб сервера) и позволяет мониторить HTTP трафик в режиме реального времени и анализировать его для дальнейших действий. В своей статье […]

The post Установка mod_security для apache/nginx в Unix/Linux first appeared on linux-notes.org.]]>

Установка mod_security для apache/nginx в Unix/Linux

ModSecurity — свободный фаервол веб-приложений с открытым исходным кодом (англ. Web Application Firewall, или WAF), который разработан с помощью SpiderLabs TrustWave и который обеспечивает защиту от различных атак на веб-приложения (веб сервера) и позволяет мониторить HTTP трафик в режиме реального времени и анализировать его для дальнейших действий. В своей статье «Установка mod security для apache/nginx в Unix/Linux» я расскажу как установить и использовать данное программное обеспечение для apache/nginx в Unix/Linux.

Установка mod security для apache

Для rpm и deb дистрибутивов имеется пакеты и можно установить одной командой.

Для Debian/Ubuntu:

$ sudo apt-get install libapache2-mod-security
$ sudo a2enmod mod-security
$ sudo /etc/init.d/apache2 force-reload

Для RedHat/Fedora/CentOS:

$ sudo yum install mod_security
$ sudo /etc/init.d/httpd restart

Установка с исходного кода:

# cd /usr/local/src && wget https://www.modsecurity.org/tarball/2.9.1/modsecurity-2.9.1.tar.gz

У меня не было нужды компилировать с исходного кода, по этому, детальную установку я пока упущу.

Установка mod_security для nginx

С самого начала, ModSecurity написали для Apache. Но я сейчас расскажу как его установить для Nginx.

1. Установка mod security со скрипта.

Самый простой способ — это использовать готовый bash скрипт для установки и для начала, скачиваем его:

Используя http:

# cd /usr/local/src && wget -q -O - http://www.atomicorp.com/installers/atomic |sh

Используя https (используя SSL):

# cd /usr/local/src && wget -q -O - https://www.atomicorp.com/installers/atomic |sh

Так, идем далее — установим nginx.

Для CentOS/RHEL/Fedora:

# yum install nginx -y

Для Debian/Ubuntu:

# apt-get install nginx -y

2. Установка mod security с исходного кода.

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

Для CentOS/RedHat/Fedora

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

# cd /usr/local/src && wget https://www.modsecurity.org/tarball/2.9.1/modsecurity-2.9.1.tar.gz

Распакуем архив:

# tar -zxvf  modsecurity-*.tar.gz && cd modsecurity-*

ПРИМЕЧАНИЕ: Сам модуль Nginx содержится в архивном пакете Apache. Для начала нужно скомпилировать ModSecurity с флагом «—enable-standalone-module» и после чего, браться за компилирование Nginx.

Чтобы скомпилировать модуль standalone с исходного кода для Linux, вы должны установить некоторые пакеты:

# yum install httpd httpd-devel pcre pcre-devel libxml2* gcc make automake autoconf libtool curl curl-devel -y

После чего приступаем к сборке модуля standalone:

# ./configure --enable-standalone-module --disable-mlogc
# make

ЗАМЕЧАНИЕ! Путь, так же имя директории с mod_security может отличаться в зависимости от версии программы.

Собственно, либа standalone скомпилировалась отлично, переходим к сборке Nginx с mod security, для этого — открываем официальный сайт и скачиваем исходный код, я использую последнюю версию ( на момент написания статьи) и вы можете использовать мою ссылку если устраивает:

# cd /usr/local/src && wget http://nginx.org/download/nginx-1.9.9.tar.gz &&  tar -zxvf nginx-*.tar.gz && cd nginx-*

Выполняем конфигурирование всего:

# ./configure --add-module=/usr/local/src/modsecurity-2.9.1/nginx/modsecurity --prefix= --conf-path=/etc/nginx --error-log-path=/var/log/nginx/error.log  --http-log-path=/var/log/nginx/access.log

ИЛИ еще проще:

# ./configure --add-module=/usr/local/src/modsecurity-2.9.1/nginx/modsecurity

Затем, соберем все:

# make

PS: После данного этапа, вы можете собрать DEB/RPM, если не знаете как это сделать, прочтите мое чтиво:

Создание RPM или DEB пакетов с Checkinstall в Linux

Или, если это не нужно, то идем дальше и выполняем установку:

# make install

Если сделали пакет, то для него необходимо установить:

  • perl(HTTP::Date) is needed by modsecurity-2.9.1-1.x86_64
  • perl(LWP::Debug) is needed by modsecurity-2.9.1-1.x86_64
  • perl(LWP::UserAgent) is needed by modsecurity-2.9.1-1.x86_64
  • perl(URI) is needed by modsecurity-2.9.1-1.x86_64

Выполним установку необходимых компонентов:

# yum install perl-DateTime-Format-HTTP

Натройка Mod Security с Nginx

Затем, нужно скопировать «modsecurity.conf-recommended» и «unicode.mapping» в папку с nginx и для того чтобы узнать где они, я буду использовать утилиту locate (О ней можно прочитать тут: Установка locate и updatedb в Linux):

# locate modsecurity.conf-recommended
# locate unicode.mapping

Или:

# find / -name modsecurity.conf-recommended
# find / -name unicode.mapping

У меня они были в /usr/local/src/modsecurity-2.9.1/ директории и я сейчас скопирую их:

# cp /usr/local/src/modsecurity-2.9.1/modsecurity.conf-recommended /usr/local/nginx/conf/
# cp /usr/local/src/modsecurity-2.9.1/unicode.mapping /usr/local/nginx/conf/

Переименую файл c modsecurity.conf-recommended на modsecurity.conf командой:

# mv /usr/local/nginx/conf/modsecurity.conf-recommended /usr/local/nginx/conf/modsecurity.conf

На всякий случай, делаем бэкап самого nginx.conf.

Создаем init скрипт для запуска nginx:

# vim /etc/init.d/nginx

Прописываем:

#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig:   - 85 15
# description:  NGINX is an HTTP(S) server, HTTP(S) reverse \
#               proxy and IMAP/POP3 proxy server
# processname: nginx
# config:      /etc/nginx/nginx.conf
# config:      /etc/sysconfig/nginx
# pidfile:     /var/run/nginx.pid

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0

nginx="/usr/local/nginx/sbin/nginx"
prog=$(basename $nginx)

NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"

[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx

lockfile=/var/lock/subsys/nginx

make_dirs() {
   # make required directories
   user=`$nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
   if [ -z "`grep $user /etc/passwd`" ]; then
       useradd -M -s /bin/nologin $user
   fi
   options=`$nginx -V 2>&1 | grep 'configure arguments:'`
   for opt in $options; do
       if [ `echo $opt | grep '.*-temp-path'` ]; then
           value=`echo $opt | cut -d "=" -f 2`
           if [ ! -d "$value" ]; then
               # echo "creating" $value
               mkdir -p $value && chown -R $user $value
           fi
       fi
   done
}

start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    make_dirs
    echo -n $"Starting $prog: "
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}

stop() {
    echo -n $"Stopping $prog: "
    killproc $prog -QUIT
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}

restart() {
    configtest || return $?
    stop
    sleep 1
    start
}

reload() {
    configtest || return $?
    echo -n $"Reloading $prog: "
    killproc $nginx -HUP
    RETVAL=$?
    echo
}

force_reload() {
    restart
}

configtest() {
  $nginx -t -c $NGINX_CONF_FILE
}

rh_status() {
    status $prog
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}

case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart|configtest)
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
            ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
        exit 2
esac

Выставляем права на исполнение:

# chmod +x /etc/init.d/nginx

Запускаем сервер:

# /etc/init.d/nginx start

И так, вносим изменения:

# vim /usr/local/nginx/conf/nginx.conf

PS: так же можно в вирутальном хосте.

Приводим к виду:

location / {
ModSecurityEnabled on;
ModSecurityConfig modsecurity.conf;
}

Нужно перезапустить nginx:

# nginx -t
# service nginx restart

Проверяем работу и версию nginx:

# ./nginx -V
nginx version: nginx/1.9.9
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-17) (GCC) 
configure arguments: --add-module=../modsecurity-2.9.1/nginx/modsecurity

так же, проверяем логи что пишет модуль:

2016/11/21 12:33:22 [notice] 25352#0: ModSecurity for nginx (STABLE)/2.9.1 (http://www.modsecurity.org/) configured.
2016/11/21 12:33:22 [notice] 25352#0: ModSecurity: APR compiled version="1.3.9"; loaded version="1.3.9"
2016/11/21 12:33:22 [notice] 25352#0: ModSecurity: PCRE compiled version="7.8 "; loaded version="7.8 2008-09-05"
2016/11/21 12:33:22 [notice] 25352#0: ModSecurity: LIBXML compiled version="2.7.6"

Видим, что все работает хорошо!

Для Debian/Ubuntu

Устанавливаем нужные компоненты:

# apt-get install build-essential libpcre3 libpcre3-dev libssl-dev libtool autoconf apache2-prefork-dev libxml2-dev libcurl4-openssl-dev

Вам, возможно, придется установить дополнительные зависимости в зависимости от конфигурации. Выберите папку где-будет храниться исходный код. (Я использую папку /usr/local/src). В настоящее время самая последняя версия ModSecurity это v2.9 поэтому мы скачивание эту версию:

# cd /usr/local/src && wget https://www.modsecurity.org/tarball/2.9.1/modsecurity-2.9.1.tar.gz

Распакуем архив:

# tar -zxvf modsecurity-*.tar.gz && cd modsecurity-*

Теперь компилируем ModSecurity как standalone модуль, который мы сможем включить, когда будем компилировать Nginx:

# cd /usr/local/src/ModSecurity-*
# ./autogen.sh
# ./configure --enable-standalone-module
# make

 

Скачиваем и устанавливаем nginx:

# cd /usr/local/src && wget http://nginx.org/download/nginx-1.9.9.tar.gz &&  tar -zxvf nginx-*.tar.gz && cd nginx-*

Выполняем конфигурирование всего:

# ./configure \
 --user=www-data \
 --group=www-data \
 --with-pcre-jit \
 --with-debug \
 --with-ipv6 \
 --with-http_ssl_module \
 --add-module=/usr/src/ModSecurity-2.9.1/nginx/modsecurity

Затем, соберем все:

# make && make install

Для старта веб-сервера, необходимо скачать и использовать init (upstart) скрипт:

# wget https://raw.github.com/JasonGiedymin/nginx-init-ubuntu/master/nginx -O /etc/init.d/nginx
# chmod +x /etc/init.d/nginx
# update-rc.d nginx defaults

Чтобы запустить используйте:

This script provides the following options for managing the Nginx service:

# service nginx restart

Настройка nginx
Открываем nginx.conf и меняем пользователя с nobody на «www-data»:

# vim /usr/local/nginx/conf/nginx.conf

Ищем:

user nobody;

Удаляем ее и вставляем:

user www-data;

Есть целый ряд других опций конфигурации в nginx.conf, которые вы можете изменить.

Я хотел бы сохранить виртуальные хосты в своих собственных каталогах, подобно тому, как он работает при установке Nginx с пакета и для этого, я создаю папки:

# mkdir /usr/local/nginx/conf/sites-available
# mkdir /usr/local/nginx/conf/sites-enabled

Удалите примеры виртуальных хостов из nginx.conf (сделайте резервную копию сначала), а затем добавьте следующую строку в конец nginx.conf, перед закрывающей фигурной скобкой:

include /usr/local/nginx/conf/sites-enabled/*;

Теперь мы можем создавать виртуальные хосты в sites-available папке и после чего создать символическую ссылку в sites-enabled. Вот очень простой виртуальный хост:

server {
listen 80;
server_name local.server;

location / {
root html;
index index.html index.htm;
}
}

Настройка ModSecurity

Я приводил пример использования для CentOS (немного выше статьи), нет ничего сложно, просто скопировать файлы и прописать настройки в виртуальном хосте.

На этом тема «Установка mod_security для apache/nginx в Unix/Linux» завершена.

The post Установка mod_security для apache/nginx в Unix/Linux first appeared on linux-notes.org.]]>
https://linux-notes.org/ustanovka-mod_security-dlya-apache-nginx-v-unix-linux/feed/ 0
Page_c76a3fcf https://linux-notes.org/zashhita-ot-clickjacking/ https://linux-notes.org/zashhita-ot-clickjacking/#respond Thu, 17 Nov 2016 19:25:16 +0000 http://linux-notes.org/?p=7321 Защита от ClickJacking Что такое ClickJacking?  ClickJacking — это один из типов атак на сайты. ClickJacking переводится «кража клика». Суть этой атаки заключается в том, что некоторый юзер, который совершает нажатие (делает клик по ссылке) на определенную область ( та которая была сформирована ранее злоумышленником), то на самом деле нажимает на ссылку другого сайта. Часто всего — это используется для […]

The post Защита от ClickJacking first appeared on linux-notes.org.]]>

Защита от ClickJacking

Что такое ClickJacking? 

ClickJacking — это один из типов атак на сайты. ClickJacking переводится «кража клика». Суть этой атаки заключается в том, что некоторый юзер, который совершает нажатие (делает клик по ссылке) на определенную область ( та которая была сформирована ранее злоумышленником), то на самом деле нажимает на ссылку другого сайта. Часто всего — это используется для накрутки ретвитов или лайков.

Как это работает?

Принцип атаки заключается в возможности загружать атакуемый сайт в фрейм.

События могут развиваться:

  • Фрейм атакуемого сайта делается прозрачным.
  • Фрейм атакующего сайта (прозрачный) накладывается на привычный пользователю сайт.

Какие сайты подвержены ClickJacking-у?

Сайты которые дают возможность загружать страницы своих ресурсов во фреймы, которые находятся на других доменных именах. Чтобы загружать страницы (документы) в фреймы с других сайтов служит  заголовок X-Frame-Options.

Данный заголовок имеет 4 состояния ( опций):

  1. DENY он блокирует загрузку сайта во фрейм.
  2. SAMEORIGIN дает возможность загружать домен на уровне одного сайта.
  3. ALLOW-FROM your_domain дает возможность загружать домен в iframe определенного домена.
  4. ALLOW-ALL значение по умолчанию что дает возможность атаки..

Защита от ClickJacking в Apache

Чтобы обеспечить защиту от ClickJacking в http(d)/Apache, нужно добавить заголовок в .htaccess файл.

У заголовка X-Frame-Options:ALLOW-ALL имеется 2 стабильных варианта:

Header always set X-Frame-Options SAMEORIGIN
Header always set X-Frame-Options DENY

И так, если вы хотите запретить загрузку домена во фреймы ( которые могут быть на других сайтах),  то стоит прописать:

#Allow Sameorigin .htaccess
Header always set X-Frame-Options SAMEORIGIN

Если хотите чтобы домен не был загружен в iframe даже на вашем сайте, используйте вторую строку ( вариант с DENY):

Header always set X-Frame-Options DENY

Защита от ClickJacking в Nginx

Для nginx похожие настройки как и для apache. Открываем ваш nginx конфигурационный файл и прописываем:

add_header X-Frame-Options "SAMEORIGIN";

PS: Данную опию нужно вставить после «server»:

nginx clickjacking

Проверка на ClickJacking

В своем терминале можно выполнить команду:

$ curl -IL https://linux-notes.org &>2 | grep X-Frame-Options

X-Frame-Options: DENY

Вот и все! Защита от ClickJacking выполнена.

The post Защита от ClickJacking first appeared on linux-notes.org.]]>
https://linux-notes.org/zashhita-ot-clickjacking/feed/ 0
Page_c76a3fcf https://linux-notes.org/rewrite-pravila-dlya-zameny-propisny-h-bukv-v-strochny-e/ https://linux-notes.org/rewrite-pravila-dlya-zameny-propisny-h-bukv-v-strochny-e/#comments Wed, 20 Apr 2016 19:42:28 +0000 http://linux-notes.org/?p=9980 Rewrite правила для замены прописных букв в строчные Недавно, столкнулся с проблемой, нужно было сделать реврайт для замены прописных букв в строчные. Решил написать статью «Rewrite правила для замены прописных букв в строчные», возможно кому-то еще будет полезным. Rewrite правила для замены прописных букв в строчные для apache Хотите чтобы все ссылки с любыми символами верхнего регистра […]

The post Rewrite правила для замены прописных букв в строчные first appeared on linux-notes.org.]]>

Rewrite правила для замены прописных букв в строчные

Недавно, столкнулся с проблемой, нужно было сделать реврайт для замены прописных букв в строчные. Решил написать статью «Rewrite правила для замены прописных букв в строчные», возможно кому-то еще будет полезным.

Rewrite правила для замены прописных букв в строчные для apache

Хотите чтобы все ссылки с любыми символами верхнего регистра перенаправлялись в нижний регистр с использованием чистого mod_rewrite в файле .htaccess? Конечно, почему бы и нет!

Перенаправление прописных и строчных букв (Uppercase to Lowercase) в .htaccess 

То что я предоставлю, должно идти в самом начале .htaccess (по крайней мере, они должны идти выше любых других RewriteRules). И так, открываем ваш htaccess и прописываем:

RewriteEngine On
RewriteBase /
 
# If there are caps, set HASCAPS to true and skip next rule
RewriteRule [A-Z] - [E=HASCAPS:TRUE,S=1]
 
# Skip this entire section if no uppercase letters in requested URL
RewriteRule ![A-Z] - [S=28]
 
# Replace single occurance of CAP with cap, then process next Rule.
RewriteRule ^([^A]*)A(.*)$ $1a$2
RewriteRule ^([^B]*)B(.*)$ $1b$2
RewriteRule ^([^C]*)C(.*)$ $1c$2
RewriteRule ^([^D]*)D(.*)$ $1d$2
RewriteRule ^([^E]*)E(.*)$ $1e$2
RewriteRule ^([^F]*)F(.*)$ $1f$2
RewriteRule ^([^G]*)G(.*)$ $1g$2
RewriteRule ^([^H]*)H(.*)$ $1h$2
RewriteRule ^([^I]*)I(.*)$ $1i$2
RewriteRule ^([^J]*)J(.*)$ $1j$2
RewriteRule ^([^K]*)K(.*)$ $1k$2
RewriteRule ^([^L]*)L(.*)$ $1l$2
RewriteRule ^([^M]*)M(.*)$ $1m$2
RewriteRule ^([^N]*)N(.*)$ $1n$2
RewriteRule ^([^O]*)O(.*)$ $1o$2
RewriteRule ^([^P]*)P(.*)$ $1p$2
RewriteRule ^([^Q]*)Q(.*)$ $1q$2
RewriteRule ^([^R]*)R(.*)$ $1r$2
RewriteRule ^([^S]*)S(.*)$ $1s$2
RewriteRule ^([^T]*)T(.*)$ $1t$2
RewriteRule ^([^U]*)U(.*)$ $1u$2
RewriteRule ^([^V]*)V(.*)$ $1v$2
RewriteRule ^([^W]*)W(.*)$ $1w$2
RewriteRule ^([^X]*)X(.*)$ $1x$2
RewriteRule ^([^Y]*)Y(.*)$ $1y$2
RewriteRule ^([^Z]*)Z(.*)$ $1z$2
 
# If there are any uppercase letters, restart at very first RewriteRule in file.
RewriteRule [A-Z] - [N]
 
RewriteCond %{ENV:HASCAPS} TRUE
RewriteRule ^/?(.*) /$1 [R=301,L]

Использование RewriteMap в самом httpd.conf.

Самый быстрый способ справится с поставленной задачей — это использовать способ что ниже. Примите во внимание, что все что я приведу ниже, должно быть прописано в файле httpd.conf (не в .htaccess). И так, открываем свой httpd.conf и вносим изминения:

RewriteEngine on
RewriteBase /
RewriteMap lowercase int:tolower
RewriteCond $1 [A-Z]
RewriteRule ^/?(.*)$ /${lowercase:$1} [R=301,L]

Вот еще один способ:

RewriteEngine On
RewriteMap lc int:tolower
RewriteCond %{REQUEST_URI} [A-Z]
RewriteRule (.*) ${lc:$1} [R=301,L]

Приведу еще один способ для того чтобы вы смогли выбрать 1 на свой вкус. Прежде всего, необходимо добавить эту строку в httpd.conf, чтобы определить RewriteMap:

RewriteMap lc int:tolower

Затем добавьте это правило в корневом каталог .htaccess файла:

RewriteEngine On
RewriteRule ^(.*?[A-Z]+.*)$ /${lc:$1} [L,NE,R=302]

Использование mod_speling в httpd.conf. 

Вы можете проверить что позволяет делать mod_speling модуль в апаче. Я лично не использую его, но многие люди любят его. По этому, приведу пример и с ним:

<IfModule mod_speling.c>
CheckCaseOnly On
CheckSpelling On
</IfModule>

Решаем проблему с WP:

function unFocus_insensitivity() {
if (preg_match('/[A-Z]/', $_SERVER['REQUEST_URI'])) {
$_SERVER['REQUEST_URI'] = strtolower($_SERVER['REQUEST_URI']);
$_SERVER['PATH_INFO'] = strtolower($_SERVER['PATH_INFO']);
}
}
add_action('init', 'unFocus_insensitivity');

Использование perl.

Можно использовать perl для того чтобы перевести буквы с одного регистра в другой, для этого используйте:

location ~ [A-Z] {
perl 'sub { my $r = shift; $r->internal_redirect(lc($r->uri)); }';
}

Есть еще несколько способов сделать подобное, но я решил привести наиболее распространенные.

Rewrite правила для замены прописных букв в строчные для nginx

Создаем в конфиге локейшен:

location ~ [A-Z] {
          rewrite ^(.*)$ $scheme://$host$uri_lowercase;
}

Но на мой взгляд, более правильный вариант:

location / {
                    if ( $uri != $uri_lowercase ) {
                           rewrite ^(.*)$ $scheme://$host$uri_lowercase;
                           #rewrite . http://$host$uri_lowercase;
                    }
}

PS: Нужно перед этим инициализировать переменную uri_lowercase

perl_set $uri_lowercase 'sub {
      my $r = shift;
      my $uri = $r->uri;
      $uri = lc($uri);
      return $uri;
    }';

Или если нужно сделать это с исключениями:

if ($uri !~ "ajax|/cart|/account|/admin_Qff_RKTOrM|/boss|/customer|/checkout|persistent") {
 set $case_redirect "1";
 }

 if ($uri ~ [A-Z] ) {
 set $case_redirect "${case_redirect}2";
 }

 if ($case_redirect = "12") {
 rewrite ^(.*)$ $scheme://$host$uri_lowercase;
 }

С использованием perl.

Как я описывал для apache, можно сделать подобное и для nginx:

location ~ [A-Z] {
                   perl 'sub { my $r = shift; $r->internal_redirect(lc($r->uri)); }';
                 }

С использованием lua.

location /captain/ {
                  set_by_lua $request_uri_low "return ngx.arg[1]:lower()" $request_uri;
                  rewrite ^ https://$host$request_uri_low;
                  }

Вот и все. Надеюсь было все понятно. Я завершаю свою тему «Rewrite правила для замены прописных букв в строчные».

The post Rewrite правила для замены прописных букв в строчные first appeared on linux-notes.org.]]>
https://linux-notes.org/rewrite-pravila-dlya-zameny-propisny-h-bukv-v-strochny-e/feed/ 1
Page_c76a3fcf https://linux-notes.org/vklyuchit-status-servera-nginx-apache/ https://linux-notes.org/vklyuchit-status-servera-nginx-apache/#respond Thu, 16 Jul 2015 15:12:16 +0000 http://linux-notes.org/?p=6885 Включить статус сервера Nginx/Apache Страница статуса для nginx в режиме реального времени показывает данные о состоянии Nginx,используя модуль под названием stub_status_module.С модулем состояния сервера Nginx вы можете получить полезную информацию о вашем веб-сервере, например: Сколько всего запросов; Сколько запросов в секунду; Количество соединений; Сколько запросов на чтения, запись и в ожидании ожидания. Это может помочь вам настроить несколько […]

The post Включить статус сервера Nginx/Apache first appeared on linux-notes.org.]]>

Включить статус сервера Nginx/Apache

Страница статуса для nginx в режиме реального времени показывает данные о состоянии Nginx,используя модуль под названием stub_status_module.С модулем состояния сервера Nginx вы можете получить полезную информацию о вашем веб-сервере, например:

  • Сколько всего запросов;
  • Сколько запросов в секунду;
  • Количество соединений;
  • Сколько запросов на чтения, запись и в ожидании ожидания.

Это может помочь вам настроить несколько Nginx конфигурации. Данные состояния могут быть использованы в балансировки нагрузки. В своей статье «Включить статус сервера Nginx/Apache» я хочу рассказать как можно включить статистику сервера nginx в Unix/Linux.

Включить статус сервера Nginx

На большинстве современных версий Nginx этот модуль уже включен, так что вам не нужно делать это вручную. Во всяком случае, можно проверить:

# nginx -V 2>&1 | grep -o with-http_stub_status_module

with-http_stub_status_module

После того, как вы убедитесь, что он включен, вы можете настроить Nginx статус, как вы видите ниже:

# vim /etc/nginx/conf.d/status.conf

Вставляем следующий код:

server {
[...]
location /nginx_status {
                        stub_status on;
                        access_log off;
                        allow 127.0.0.1;
                        allow 66.66.66.66;
                        deny all;
                        }
[...]
       }

Сохраняем файл и перезагружаем сервер:

# service nginx reload

или

# service nginx restart

Открываем браузер:

http://linux-notes.org/nginx_status

Так же, можно использовать curl для тестирования:

# curl http://linux-notes.org/nginx_status

Active connections: 18 
server accepts handled requests
 273 273 930 
Reading: 0 Writing: 1 Waiting: 17 

Active connections – Количество всех открытых соединений. Это  не количество пользователей которые подключились к сайту, один пользователь для одного просмотра страницы может открыть множество одновременных соединений к серверу.
Server accepts handled requests – Этот параметр показывает, три значения:

  • Первый — это количество всех принятые соединений.
  • Второй — это количество всех прерванных соединений. Обычно первые 2 значения одинаковы.
  • Третий — это количество обрабатывающихся запросов (как правило, данный параметр больше чем второе значение).
  • Разделив третье число на второе, вы получите количество запросов на каждое соединение обрабатываемых в Nginx. В приведенном выше примере, 930/273  = 3,4 запросов на каждое соединения.

Reading – Количество считаных заголовков запроса в nginx.
Writing – Nginx читает тело запроса, обрабатывает запрос, или пишет ответ на клиента.
Waiting – Keep-Alive соединения, на самом деле активно  – (чтение + запись). Эта величина зависит от keepalive-timeout. Это значение можно проигнорировать. Хотя, вы можете прописать принудительно данное значение в нулевое ожидание, установив keepalive_timeout=0;

status nginx может работать с графическими инструментами (cacti или RRDTool).

Включить статус сервера Apache

Открываем конфиг  самого апача (виртуальный хост с сайтом):

# vim /etc/httpd/conf/httpd.conf

Добавляем:

ExtendedStatus On
<Location /apache_status>
SetHandler apache_status
Order deny,allow
Deny from all
Allow from .linux-notes.org
</Location>

Перезапускаем апач:

# service httpd restart

Включить статус сервера Apache

Включить статус сервера Apache

Выполняем проверку:

# curl http://linux-notes.org/apache_status

Статья «Включить статус сервера Nginx/Apache» завершена.

 

The post Включить статус сервера Nginx/Apache first appeared on linux-notes.org.]]>
https://linux-notes.org/vklyuchit-status-servera-nginx-apache/feed/ 0
Page_c76a3fcf https://linux-notes.org/vklyuchit-szhatie-gzip-i-ke-shirovanie-v-nginx-i-apache/ https://linux-notes.org/vklyuchit-szhatie-gzip-i-ke-shirovanie-v-nginx-i-apache/#comments Thu, 16 Jul 2015 15:06:56 +0000 http://linux-notes.org/?p=5670 Включить сжатие gzip и кэширование в Nginx и Apache Сейчас, все браузеры поддерживают сжатия (картинок, файлов), т.к. он является частью спецификации протокола HTTP 1.1. Такое сжатие, а именно сжатие текстовых форматов (например CSS, Javascipt или HTML) сможет уменьшить их объем до 70%. Работает это следующим образом: Прежде чем отправить ответ, сервер выполняет сжатие данных, при получения сжатого ответа от сервера браузер выполняет […]

The post Включить сжатие gzip и кэширование в Nginx и Apache first appeared on linux-notes.org.]]>

Включить сжатие gzip и кэширование в Nginx и Apache

Сейчас, все браузеры поддерживают сжатия (картинок, файлов), т.к. он является частью спецификации протокола HTTP 1.1. Такое сжатие, а именно сжатие текстовых форматов (например CSS, Javascipt или HTML) сможет уменьшить их объем до 70%. Работает это следующим образом:

Прежде чем отправить ответ, сервер выполняет сжатие данных, при получения сжатого ответа от сервера браузер выполняет обратную процедуру и разжимает сжатый контент и выводит результат.

gzip в nginx и apache

И в своей теме «Включить сжатие gzip в Nginx и Apache» я расскажу как можно настроить веб-сервер (apache или  nginx) с поддержкой сжатия.

Сжатие на веб-сервере Nginx

Если используете Linux (Debian/Ubuntu/Mint или CentOS/RedHat/Fedora) то путь к файлу конфигурации будет:

# vim /etc/nginx/nginx.conf

При использовании FreeBSD путь к файлу конфигурации лежит в:

# vim /usr/local/etc/nginx/nginx.conf

Если хотите использовать сжатие, то необходимо в файл сервера или в отдельный виртуальный хост прописать следующие строки:

#GZIP
 gzip on;
 gzip_min_length 1000;
 gzip_proxied expired no-cache no-store private auth;
 gzip_types text/plain application/xml;
# Выделяем буфер для gzip
 gzip_buffers 32 4k;
# Устанавливаем уровень сжатия, от 1-9
 gzip_comp_level 9;
# Убираем поддержку IE6
 gzip_disable "msie6";
# Устанавливаем версию для использования gzip (1.0 или 1.1)
 gzip_http_version 1.1;
# Разрешаем использовать статику
 gzip_static on;
 gzip_vary on;
 gzip_types text/css text/javascript text/xml text/plain text/x-component application/javascript application/x-javascript application/json application/xml application/rss+xml font/truetype application/x-font-ttf font/opentype application/vnd.ms-fontobject image/svg+xml;

Кэширование в Nginx

Так же, настраиваем кэширование (которое включается с опцией expires) для заголовки для картинок и статических файлов в nginx. Мой конфиг выглядит следующим образом:

# Хранить кэш 24ч\1 сутки
 expires 86400s;
# Добавляем заголовки (хеадеры)
 add_header Pragma public;
 add_header Cache-Control "max-age=86400, public, must-revalidate, proxy-revalidate";
 #add_header "X-UA-Compatible" "IE=Edge,chrome=1";

# Правила rewrite для версированного CSS + JS через дериктиву filemtime
 location ~* ^.+\.(css|js)$ {
 rewrite ^(.+)\.(\d+)\.(css|js)$ $1.$3 last;
# Задаем сколько будет храниться кэш 
 expires 31536000s;
# Выключаем логирование 
 access_log off;
 log_not_found off;
# Добавляем заголовки (хеадеры)
 add_header Pragma public;
 add_header Cache-Control "max-age=31536000, public";
 }

# Агрессивное кэширование для статических файлов
 location ~* \.(asf|asx|wax|wmv|wmx|avi|bmp|class|divx|doc|docx|eot|exe|gif|gz|gzip|ico|jpg|jpeg|jpe|mdb|mid|midi|mov|qt|mp3|m4a|mp4|m4v|mpeg|mpg|mpe|mpp|odb|odc|odf|odg|odp|ods|odt|ogg|ogv|otf|pdf|png|pot|pps|ppt|pptx|ra|ram|svg|svgz|swf|tar|t?gz|tif|tiff|ttf|wav|webm|wma|woff|wri|xla|xls|xlsx|xlt|xlw|zip)$ {
# Задаем сколько будет храниться кэш 
 expires 31536000s;
# Выключаем логирование 
 access_log off;
 log_not_found off;
# Добавляем заголовки (хеадеры)
 add_header Pragma public;
 add_header Cache-Control "max-age=31536000, public";
 }

Это включит кэш на веб-сервере на максимальный период для всех  перечисленных файлов.

Сжатие на веб-сервере Apache

По умолчанию модуль mod_deflate должен быть включен в apache. Но лучше убедиться и выполнить проверку и поискать следующую строку в конфиге веб-сервера apache:

LoadModule deflate_module modules/mod_deflate.so

Мы можем определить, какие типы файлов нужно сжать:

AddOutputFilterByType DEFLATE text/html text/plain text/css application/javascript

Пропишите следующую конфигурацию в виртуальный хост Apache  и это включит сжатие mod_deflate для вашего сайта.

<Directory /var/www/html/>
<IfModule mod_mime.c>
 AddType application/x-javascript .js
 AddType text/css .css
</IfModule>
<IfModule mod_deflate.c>
 # Compress HTML, CSS, JavaScript, Text, XML and fonts
 AddOutputFilterByType DEFLATE application/javascript
 AddOutputFilterByType DEFLATE application/rss+xml
 AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
 AddOutputFilterByType DEFLATE application/x-font
 AddOutputFilterByType DEFLATE application/x-font-opentype
 AddOutputFilterByType DEFLATE application/x-font-otf
 AddOutputFilterByType DEFLATE application/x-font-truetype
 AddOutputFilterByType DEFLATE application/x-font-ttf
 AddOutputFilterByType DEFLATE application/x-javascript
 AddOutputFilterByType DEFLATE application/xhtml+xml
 AddOutputFilterByType DEFLATE application/xml
 AddOutputFilterByType DEFLATE font/opentype
 AddOutputFilterByType DEFLATE font/otf
 AddOutputFilterByType DEFLATE font/ttf
 AddOutputFilterByType DEFLATE image/svg+xml
 AddOutputFilterByType DEFLATE image/x-icon
 AddOutputFilterByType DEFLATE text/css
 AddOutputFilterByType DEFLATE text/html
 AddOutputFilterByType DEFLATE text/javascript
 AddOutputFilterByType DEFLATE text/plain
 AddOutputFilterByType DEFLATE text/xml
 #The following line is enough for .js and .css
 AddOutputFilter DEFLATE js css
 AddOutputFilterByType DEFLATE text/plain text/xml application/xhtml+xml text/css application/javascript application/xml application/rss+xml application/atom_xml application/x-javascript application/x-httpd-php application/x-httpd-fastphp text/html
</IfModule>
<IfModule mod_setenvif.c>
 # Удалить ошибки браузера (требуется только для очень старых браузеров)
 BrowserMatch ^Mozilla/4 gzip-only-text/html
 BrowserMatch ^Mozilla/4\.0[678] no-gzip
 BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
</IfModule>
<IfModule mod_headers.c> 
 Header append Vary User-Agent env=!dont-vary
</IfModule> 
<ifModule mod_gzip.c>
 mod_gzip_on Yes
 mod_gzip_dechunk Yes
 mod_gzip_item_include file .(html?|txt|css|js|php|pl)$
 mod_gzip_item_include handler ^cgi-script$
 mod_gzip_item_include mime ^text/.*
 mod_gzip_item_include mime ^application/x-javascript.*
 mod_gzip_item_exclude mime ^image/.*
 mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
</ifModule>
</Directory>

Используем кеш на стороне браузера в Apache

Как только пользователь откроет сайт будут скачиваться не только код страницы с html страницы, и так же  css, картинки, js. И одно открытие страницы файла обращается  к серверу от нескольких десятков и аж до нескольких сотен! такие запросы очень нагружают  сервер,  и так же дают дополнительное время на загрузку страницы у пользователя.

Создаем файлик .htaccess в своей домашней директории сайта и добавляем:

# кеширование в браузере на стороне пользователя
<IfModule mod_expires.c>
 #Включаем поддержку директивы Expires
  ExpiresActive On
 # Задаем время для хранения файлов (картинок) в кэше для каждого типа 
  ExpiresDefault "access 7 days"
  ExpiresByType application/javascript "access plus 1 year"
  ExpiresByType text/javascript "access plus 1 year"
  ExpiresByType text/css "access plus 1 year"
  ExpiresByType text/html "access plus 7 day"
  ExpiresByType text/x-javascript "access 1 year"
  ExpiresByType image/gif "access plus 1 year"
  ExpiresByType image/jpeg "access plus 1 year"
  ExpiresByType image/png "access plus 1 year"
  ExpiresByType image/jpg "access plus 1 year"
  ExpiresByType image/x-icon "access 1 year"
  ExpiresByType application/x-shockwave-flash "access 1 year"
</IfModule>
# Cache-Control
<ifModule mod_headers.c>
# Задаем 30 дней для данного типа файла
<filesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|swf)$">
  Header set Cache-Control "max-age=2592000, public"
</filesMatch>

# Задаем 30 дней для данного типа файла
<filesMatch "\.(css|js)$">
 Header set Cache-Control "max-age=2592000, public"
</filesMatch>

# Задаем 2 дня для данного типа файла
<filesMatch "\.(xml|txt)$">
Header set Cache-Control "max-age=172800, public, must-revalidate"
</filesMatch>

# Задаем 1 день для данного типа файла
<filesMatch "\.(html|htm|php)$">
 Header set Cache-Control "max-age=172800, private, must-revalidate"
</filesMatch>
</ifModule>

# использование кеша браузеров
FileETag MTime Size
<ifmodule mod_expires.c>
<filesmatch ".(jpg|jpeg|gif|png|ico|css|js)$">
 ExpiresActive on
 ExpiresDefault "access plus 1 year"
</filesmatch>
</ifmodule>

#Запрет отдачи HTTP-заголовков Vary браузерам семейства MSIE
<IfModule mod_setenvif.c>
 BrowserMatch "MSIE" force-no-vary
 BrowserMatch "Mozilla/4.[0-9]{2}" force-no-vary
</IfModule>

Проверка gzip и кэширования в Nginx и Apache

Создаем тестовый файл php_info.php в домашней директории вашего сайта со следующими строками:

<?php
phpinfo();
?>

И открыв его в браузере по ссылке вида http://host_or_IP/php_info.php посмотреть что есть в поле “Loaded Modules“, вы должны увидеть там что-то вроде:

Использование кеша на стороне браузера apache

Использование кеша на стороне браузера apache

Если в списке нет mod_expires или mod_headers  – выполните в консоли сервера (подключившись по ssh) по очереди следующие команды (это установит/включит mod_expires, mod_headers):

# a2enmod headers
# a2enmod expires
# service apache2 restart

Для индексной странички видим, что gzip включён, но для URL из js нет:

$ curl -I -H 'Accept-Encoding: gzip,deflate' http://linux-notes.org/ | grep gzip

А после добавления gzip_types получаем такое:

$ curl -I -H 'Accept-Encoding: gzip,deflate' http://linux-notes.org/test/test.js

ИЛИ еще:

# curl --header "Accept-Encoding: gzip,deflate,sdch" -I http://linux-notes.org

HTTP/1.1 200 OK
Server: nginx
Date: Thu, 25 Jun 2015 11:27:22 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Vary: Accept-Encoding
Set-Cookie: wfvt_3183169984=558be599d6523; expires=Thu, 25-Jun-2015 11:57:21 GMT; path=/; httponly
X-Pingback: http://linux-notes.org/xmlrpc.php
X-UA-Compatible: IE=edge,chrome=1
Expires: Fri, 26 Jun 2015 11:27:22 GMT
Cache-Control: max-age=86400
Pragma: public
Cache-Control: max-age=86400, public, must-revalidate, proxy-revalidate
Content-Encoding: gzip

Проверка Gzip онлайн ресурсами

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

http://checkgzipcompression.com/
http://www.whatsmyip.org/http-compression-test/

На этом все, я завершаю свою тему «Включить сжатие gzip и кэширование в Nginx и Apache».

The post Включить сжатие gzip и кэширование в Nginx и Apache first appeared on linux-notes.org.]]>
https://linux-notes.org/vklyuchit-szhatie-gzip-i-ke-shirovanie-v-nginx-i-apache/feed/ 15