Показаны сообщения с ярлыком nginx. Показать все сообщения
Показаны сообщения с ярлыком nginx. Показать все сообщения

Поднимаем свой DNS-over-TLS сервер на nginx proxy debian 9

# cat /etc/nginx/nginx.conf
load_module modules/ngx_stream_module.so;
worker_processes 1;
events {
}

stream {
    # DNS upstream pool
    upstream dns {
        server 127.0.0.1:53;
    }

    # DoT server for decryption
    server {
        listen 853 ssl;
        ssl_certificate /root/.acme.sh/dns.myserver.com/fullchain.cer;
        ssl_certificate_key /root/.acme.sh/dns.myserver.com/dns.myserver.com.key;
        ssl_protocols TLSv1.2;
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout 1d;

        proxy_pass dns;
    }
}


На 127.0.0.1 запускаем всеми любимый pdns-recusor или unbound или все что угодно,
при использовании unbound в конфиг пишем access-control: 127.0.0.0/8 allow_snoop чтобы работал dig +trace (администраторам это важно)

# crontab -l
15 15 * * * /root/.acme.sh/acme.sh --issue -d dns.myserver.com --standalone --pre-hook "service nginx stop" --post-hook "service nginx start"  > /dev/null

На роутере следовательно используем ваш сервер DNS-over-TLS не завися от выкрутасов провайдера (подмена DNS) или google / cloudflare (у них также DNS есть с TLS на 8.8.8.8 и 1.1.1.1 на 853 порту

nginx php-fpm : чпу для joomla : rewrite

Так как .htaccess в php-fpm не работает, то достаточно одной строки чтобы работали ЧПУ ссылки в joomla:
try_files $uri $uri/ /index.php?args;

Пример виртуального хоста ниже:

server {
    server_name example.ru www.example.ru;
    charset UTF-8;
    index index.php index.html;
    disable_symlinks if_not_owner from=$root_path;
    include /etc/nginx/vhosts-includes/*.conf;
    include /etc/nginx/vhosts-resources/example.ru/*.conf;
    access_log /var/www/httpd-logs/example.ru.access.log;
    error_log /var/www/httpd-logs/example.ru.error.log notice;
    ssi on;
    set $root_path /var/www/default_user/data/www/example.ru;
    root $root_path;
    listen 10.11.10.11:80;
    location / {
        try_files $uri $uri/ /index.php?args;
        location ~ [^/]\.ph(p\d*|tml)$ {
            try_files /does_not_exists @php;
        }
    }
    location @php {
        fastcgi_index index.php;
        fastcgi_param PHP_ADMIN_VALUE "sendmail_path = /usr/sbin/sendmail -t -i -f webmaster@example.ru";
        fastcgi_pass unix:/var/www/php-fpm/default_user.sock;
        fastcgi_split_path_info ^((?U).+\.ph(?:p\d*|tml))(/?.+)$;
        try_files $uri =404;
        include fastcgi_params;
    }
}


Ускоряем производительность в nginx proxy

При включении nginx в качестве front-end proxy проседают "попугаи". Это в целом естественно, так как есть задержка на передачу пакетов между nginx <-> apache, но можно несколько ускорить и выиграть до 15%

# vim /etc/nginx/nginx.conf

worker_processes  3;    #Numcores -1

events {
...
    use epoll;
}


http {
... 
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
...
}

# vim /etc/nginx/vhosts/www-root/example.com

location @fallback {
....
    proxy_buffering off;

...
}

Nginx Unit + Bitrix настройка

Установка с модулем

yum install unit unit-php

Настраиваем nginx

[root@nginx-unit ~]# cat /etc/nginx/conf.d/default.conf
upstream unit_bitrix_urlrewrite {
    server 127.0.0.1:8090;
}
upstream unit_bitrix_direct {
    server 127.0.0.1:8091;
}

server {
    listen      80;

    root        /var/www/html/;

    index index.php;

    proxy_read_timeout 90s;
    client_max_body_size 64m;

    location / {
        try_files $uri @urlrewrite_php;
    }

    location @urlrewrite_php {
        proxy_pass       http://unit_bitrix_urlrewrite;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
    location ~* \.php$ {
        try_files        $uri =404;
        proxy_pass       http://unit_bitrix_direct;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}


Настраиваем unit

[root@nginx-unit ~]# cat bitrix.json
{
    "listeners": {
        "127.0.0.1:8090": {
         "application": "bitrix_urlrewrite"
        },

        "127.0.0.1:8091": {
          "application": "bitrix_direct"
        }
    },

    "applications": {
        "bitrix_urlrewrite": {
            "type": "php",
              "processes": {
               "max": 20,
               "spare": 5
              },
            "user": "apache",
            "group": "apache",
            "root": "/var/www/html/",
            "script": "bitrix/urlrewrite.php"
        },

        "bitrix_direct": {
            "type": "php",
              "processes": {
               "max": 20,
               "spare": 5
              },
            "user": "apache",
            "group": "apache",
            "root": "/var/www/html/",
            "index": "index.php"
        }
    }
}



Заливаем конфиг

curl -X PUT -d @bitrix.json --unix-socket /run/unit/control.sock http://localhost/config
 

Полезные ссылки

https://unit.nginx.org/howto/wordpress/
https://habr.com/ru/company/itsumma/blog/337346/
https://sysadmin.pm/nginx-unit/
Скрипт проверки соответствия Bitrix http://www.1c-bitrix.ru/download/files/scripts/bitrix_server_test.php
  

Примечание

На unit.nginx.org указано в action": { "pass" - такая конфигурация не проходит контроль на unit-1.8.0-1.el7.remi

nginx не передает заголовок Last-Modified от Apache

указал в конфигурации nginx в /etc/nginx/nginx.conf в секции http
ssi_last_modified on;

и все стало работать, заголовок выдается

$ wget -O /dev/null -S site.ru 2>&1 | grep Last
  Last-Modified: Thu, 20 Dec 2018 13:14:47 GMT


Скрипт для генерации заголовка на php
<? header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); ?>

nginx с ngx_pagespeed и поддержкой alpn для centos / debian / ubuntu

update:
актуальные бинарники доступны по ссылке https://dl.ispsystem.info/nginx-binary/lasted/


Готовая сборка Nginx с модулем ngx_pagespeed (google pagespeed) для популярных операционных систем CentOS 6.9, 7.4 / Debian 7, 8, 9 / Ubuntu 14.04/16.04 x86_64

Также для CentOS 6 / Debian 7,8 / Ubuntu 14.4 nginx собран с openssl 1.0.2 (--with-openssl=/root/openssl-1.0.2l) чтобы была поддержка ALPN для http2, в CentOS 7.4 и других системах системный OpenSSL поддерживает ALPN начиная с версии 1.0.2

В CentOS 7.3 (в дистрибутиве openssl 1.0.1e) и меньших версиях необходимо для запуска nginx обновить пакет openssl (yum install openssl обновит до 1.0.2k-8) иначе будет ошибка запуска nginx связанная со старой библиотекой в системе

Для Debian 7 новые версии pagespeed не поддерживаются, новый nginx 1.13.6 также не собирается со старым ngx_pagespeed, поэтому используется nginx 1.12.2 stable и pagespeed старой версии 1.11.33.1-beta (bash <(curl -f -L -sS https://ngxpagespeed.com/install) -n 1.12.2 -v 1.11.33.1).
Настоятельно рекомендую мигрировать на более новую версию операционной системы

Ссылки на бинарный файл nginx - его надо просто положить в /usr/sbin/nginx вместо исходного файла (предварительно установив nginx через пакетный менеджер системы):

https://dl.ispsystem.info/nginx-binary/nginx-1.13.6-pagespeed-1.12.34.2-openssl-1.0.2l-centos6
https://dl.ispsystem.info/nginx-binary/nginx-1.13.6-pagespeed-1.12.34.2-centos7
https://dl.ispsystem.info/nginx-binary/nginx-1.12.2-pagespeed-1.11.33.1-openssl-1.0.2l-debian7
https://dl.ispsystem.info/nginx-binary/nginx-1.13.6-pagespeed-1.12.34.2-openssl-1.0.2l-debian8
https://dl.ispsystem.info/nginx-binary/nginx-1.13.6-pagespeed-1.12.34.2-debian9 
https://dl.ispsystem.info/nginx-binary/nginx-1.13.6-pagespeed-1.12.34.2-openssl-1.0.2l-ubuntu14.04
https://dl.ispsystem.info/nginx-binary/nginx-1.13.6-pagespeed-1.12.34.2-ubuntu16.04

Также собраны бинарники для замены /usr/sbin/nginx с openssl 1.0.2 без модуля pagespeed для старых операционных систем где openssl не имеет поддержки alpn (требуется для http2):

https://dl.ispsystem.info/nginx-binary/nginx-1.13.6-openssl-1.0.2l-centos6
https://dl.ispsystem.info/nginx-binary/nginx-1.13.6-openssl-1.0.2l-debian7
https://dl.ispsystem.info/nginx-binary/nginx-1.13.6-openssl-1.0.2l-debian8
https://dl.ispsystem.info/nginx-binary/nginx-1.13.6-openssl-1.0.2l-ubuntu14.04

Ключи сборки соответствуют стандартным с официального репозитория nginx (посмотреть как nginx -V), за исключением опции компиляции и линковки при использовании внешнего openssl
Debian 7/8:
--with-cc-opt='-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie'
изменено на
--with-cc-opt='-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-z,relro -Wl,-z,now' --with-openssl=/root/openssl-1.0.2l

CentOS 6:
--with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'
изменено на
--with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic' --with-ld-opt='-Wl,-z,relro -Wl,-z,now' --with-openssl=/root/openssl-1.0.2l

Так как иначе openssl не собирается с ошибками
/usr/bin/ld: /root/openssl-1.0.2l/.openssl/lib/libssl.a(s23_meth.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
/root/openssl-1.0.2l/.openssl/lib/libssl.a: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
objs/Makefile:365: recipe for target 'objs/nginx' failed


Возможно, это пригодится кому-либо при компиляции nginx с собственным openssl

Подключается pagespeed в nginx.conf секции http - собственно включение, запрет оптимизировать phpmyadmin и админ-панель сайтов на bitrix (с ними работает некорректно), путь к каталогу кэша nginx и ограничения.
Процесс очистки кэша будет запускаться раз в час и очищаться если размер превысит 512Mb или 100000 inodes

pagespeed on;
pagespeed Disallow */phpmyadmin/*;
pagespeed Disallow */bitrix/admin/*;
pagespeed FileCachePath /var/cache/ngx_pagespeed/;
pagespeed FileCacheSizeKb            524288;
pagespeed FileCacheInodeLimit        100000;
pagespeed FileCacheCleanIntervalMs   3600000;

Далее необходимо просто создать директорию
mkdir /var/cache/ngx_pagespeed/

После перезапуска nginx в ней появятся поддиректории с файлами кэша

Подключается http2 просто добавлением http2 в server
listen 443 ssl http2;

При использовании ISPmanager 5 можно отредактировать шаблон /usr/local/mgr5/etc/templates/default/nginx-vhosts-ssl.template

заменить

listen {% $NGINX_SSL_LISTEN_ON %} default_server;
на
listen {% $NGINX_SSL_LISTEN_ON %} ssl http2 default_server;

listen {% $NGINX_SSL_LISTEN_ON %}
на
listen {% $NGINX_SSL_LISTEN_ON %} ssl http2;

Чтобы не переписывался при обновлениях файл /usr/bin/nginx можно сделать в Debian/Ubuntu:

# dpkg-divert --divert /usr/sbin/nginx.unuse --rename /usr/sbin/nginx
# mv /usr/sbin/nginx.unuse /usr/sbin/nginx
 
В CentOS:
# yum install yum-plugin-versionlock
# yum versionlock nginx


Полезные ссылки:
https://www.modpagespeed.com/doc/build_ngx_pagespeed_from_source 
https://habrahabr.ru/post/301452/
http://nginx.org/ru/download.html

ЧПУ в nginx php-fpm в server

listen 188.112.121.100:80;
    location / {
        try_files $uri $uri/ @handler;
        location ~ [^/]\.ph(p\d*|tml)$ {
            try_files /does_not_exists @php;
        }
    }
    location @handler {
        rewrite ^(.*) /index.php?$1 last;
    }

    location @php {
        fastcgi_index index.php;
        fastcgi_param PHP_ADMIN_VALUE "sendmail_path = /usr/sbin/sendmail -t -i -f webmaster@example.ru";
        fastcgi_pass unix:/var/www/php-fpm/www-root.sock;
        fastcgi_split_path_info ^((?U).+\.ph(?:p\d*|tml))(/?.+)$;
        try_files $uri =404;
        include fastcgi_params;
    }


Редирект на https
return 301 https://$host:443$request_uri;

Сжатие - кэширование
    gzip on;
    gzip_comp_level 3;
    gzip_disable "msie6";
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;
    expires 8d;

Заблокировать поисковые боты в Nginx по User-Agent

Прописываем вначале server

if ($http_user_agent ~ WordPress|SemrushBot|SputnikBot|Crowsnest|PaperLiBot|peerindex|ia_archiver|Slurp|Aport|NING|JSKit|rogerbot|BLEXBot|MJ12bot|Twiceler|Baiduspider|Java|CommentReader|Yeti|discobot|BTWebClient|Tagoobot|Ezooms|igdeSpyder|AhrefsBot|Teleport|Offline|DISCo|netvampire|Copier|HTTrack|WebCopier|GrapeshotCrawler|coccocbotweb|HybridBot|magpiecrawlerHostTracker|Riddler|SentiBot|HostTracker) {

return 403;
}

nginx limit ограничение на число подключений с одного IP

# vi /etc/nginx/nginx.conf



http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    limit_conn_zone $binary_remote_addr zone=zone:1m;
    limit_conn zone 8;


nginx подключаем ssl https в том же server чтобы его не дублировать

Иногда бывает нет необходимости делать копию server ради того, чтобы включить https для сайта, поэтому делать можно так

server {
listen 82.146.13.20;
listen 82.146.13.20:443 ssl;
server_name server.ru www.server.ru;
ssl_certificate /etc/nginx/ssl/server.ru.crt;
ssl_certificate_key /etc/nginx/ssl/server.ru.key;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";


Просто добавьте еще один listen указав для него ssl и путь к файлу сертификата+CA и к файлу ключа
Проверяем что Grade A — https://www.ssllabs.com/ssltest/
Набор шифров — https://cipherli.st/
ssl_protocols правильные уже давно стоят по-умолчанию, поэтому достаточно только указать что серверные шифры более приоритетнее чем клиентские и их список

PHP скрипт в режиме как CGI не работает дольше 60 секунд — Timeout waiting for output from CGI script

PHP скрипт не смотря на настройки max_execution_time в php.ini завершает свою работу через 60 секунд выдавая ошибку в лог-файл apache

Timeout waiting for output from CGI script /var/www/user/data/php-bin/php

Решение:
Необходимо прописать в /etc/httpd/conf/httpd.conf директиву

Timeout 300

(где 300 — число секунд которые сможет выполняться данный скрипт)
По-умолчанию в CentOS 7 эта директива не прописана и равна 60 секундам

Чтобы nginx (если используется) при этом не выдавал ошибку 502 следует также прописать в его конфигурации
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;

Nginx error 502 upstream sent too big header while reading response header from upstream

Nginx может выдавать ошибку 502 и упорно писать в логи upstream sent too big header

2016/11/04 22:17:08 [error] 29848#29848: *57721 upstream sent too big header while reading response header from upstream, client: 168.112.124.141, server: example.ru, request: "GET /index.php?page=search&Region=2 HTTP/1.1", upstream: "http://127.0.0.1:8080/index.php?index.php?page=search&Region=2", host: "example.ru"

Исправляется прописыванием в секцию http /etc/nginx/nginx.conf
proxy_buffers 8 16k;
proxy_buffer_size 32k;


(по умолчанию 4 8/16)

Но не больше
proxy_buffers 8 32k;
proxy_buffer_size 64k;