Ответы пользователя по тегу Nginx
  • Почему редиректит с поддомена на домен?

    Если вы перенесли WordPress на поддомен, то нужно изменить настройки в БД, nginx тут скорее всего не при делах как и Apache.

    Через phpMyAdmin выполняете (www.oldsite.ru и www.newsite.ru замените на свои):

    Вначале смотрим старые настройки
    mysql> SELECT option_name,option_value FROM wp_options WHERE option_name = 'home' OR option_name = 'siteurl';
    +-------------+-----------------------+
    | option_name | option_value          |
    +-------------+-----------------------+
    | home        | http://www.oldsite.ru |
    | siteurl     | http://www.oldsite.ru |
    +-------------+-----------------------+
    2 rows in set (0.00 sec)


    Потом меняем старые на новые:
    UPDATE wp_options SET option_value = REPLACE(option_value, 'http://www.oldsite.ru', 'http://www.newsite.ru') WHERE option_name = 'home' OR option_name = 'siteurl';
    UPDATE wp_posts SET guid = REPLACE(guid, 'http://www.oldsite.ru','http://www.newsite.ru');
    UPDATE wp_posts SET post_content = REPLACE(post_content, 'http://www.oldsite.ru', 'http://www.newsite.ru');
    Ответ написан
  • Как можно определить устаревшего ssl клиента и отправить его на http?

    1. Напишите вывод команды
    nginx -V

    Возможно проблема в том, что у Вас nginx собран с openssl < 1.0.2 и как следствие нет поддержки ALPN, а браузер на ваших старых NT 5.1 наверняка новый, в котором уже нет поддержки NPN

    2. Какие шифры сконфигурированы в nginx ? Напишите что у вас прописано в ssl_ciphers. Возможно Вы открываете ваш сайт в браузере, который не поддерживает тот набор шифров что прописан у Вас в nginx.
    Протестируйте сайт на https://www.ssllabs.com/ssltest/index.html

    P.S. Если бы Вы написали какая точно у вас версия Windows и какой браузер, то гадать бы пришлось меньше.
    Ответ написан
  • Nginx: https to https?

    Проксирование nginx методом https -> http, не прокатывает, так как jira возмущается и не правильно работает. Соответственно для Jira была настроена Catalina на работу с https с портом 8883, в результате при обращении на этот порт все работает.


    1. Настройте Jira на работу по http only либо на работу в 2-х режимах - http и https - такое возможно, мануалы есть, пользуйтесь гуглом.
    2. Как и посоветовал ТыжСисАдмин , настройте проксирование nginx https -> jira http - это будет самое правильное решение.
    Ответ написан
  • Безопасно ли подгружать конф для nginx из директории пользователя?

    Безопасно ли подгружать конф для nginx из директории пользователя?


    Нет это не безопасно, более того - это опасно! Не делайте так!

    Если хочется чтобы пользователи сами писали редиректы, то поставьте бесплатную панель хостинга ISPConfig, в ней есть нужный вам функционал.
    Ответ написан
  • При редиректе с HTTP на HTTPS возникает ошибка, в чем дело??

    1. Кусок
    server {
            listen 80;
            server_name universal-chat.net *.universal-chat.net;
            return 301 https://$host$request_uri;
    }


    Замените на 2 блока, так будет правильнее и тогда:

    server {
            listen 80;
            server_name universal-chat.net www.universal-chat.net;
            return 301 https://universal-chat.net$request_uri;
    }
    server {
            listen 80;
            server_name api.universal-chat.net;
            return 301 https://api.universal-chat.net$request_uri;
    }


    Читаем статью для просвещения.

    2. Рекомендую поменять еще некоторые дерективы:

    worker_processes 4;
    на
    worker_processes auto;

    Добавить
    worker_cpu_affinity auto;
    worker_shutdown_timeout 30;

    30 замените на ваше желаемое число, см офф. документация

    Добавить в секцию http директиву:
    server_tokens off;

    Если у Вас используется
    sendfile on;
    то разумно выставить
    sendfile_max_chunk 128k;
    Она ограничивает объём данных, который может передан за один вызов sendfile(). Нужно для исключения ситуации когда одно соединение может целиком захватить воркер.

    По желанию добавить в секцию http:
    keepalive_timeout 60s;
    keepalive_requests 500;
    client_body_timeout 30s;
    client_max_body_size 256m;
    send_timeout 30s;
    types_hash_max_size 2048;
    server_names_hash_max_size 8192;
    server_names_hash_bucket_size 128;

    Тестируем редиректы так:
    curl -D - -o /dev/null -s http://universal-chat.net

    и
    curl -D - -o /dev/null -s http://api.universal-chat.net
    Ответ написан
  • Как удалить лишние пробелы в статике используя Nginx?

    Посмотрите в сторону Nginx JS (nginScript) - среда выполнения JavaScript в Nginx.
    Во первых - это уже встроено в nginx в виде модуля и не нужно собирать какие-то доп. модули, во вторых - это протестировано и надежно работает и не валит nginx.

    3 мес. назад стояла задачка по прозрачной замены библиотеки создания превьюшек phpThumb на ресайз через nginx-module-image-filter, вначале долго мучился со всякими сторонними модулями, чтобы парсить url и выцеплять из запроса нужные данные, потом их обрабатывать, потом плюнул и за пару часов сделал на nginScript тоже самое, пример всех конфигов тут, все никак не могу оформить это в виде нормальной понятной обывателю статьи.
    Ответ написан
  • NGINX: как узнать какие файлы (из каких папок) скачивают пользователи?

    Прежде чем удалять /data/2017, мне нужно точно убедиться, что данные берутся именно из /mnt/2017.


    1. Отключите в конфиге nginx использование /data/2017 и станет сразу все понятно, откуда будут браться ваши данные.
    2. Не удаляйте /data/2017, а просто переименуйте например в /data/2017.old, поживите так N дней, проверьте что все работает корректно.
    3. Анализируйте access.log на предмет 404 для файлов которые лежали в /data/2017, а сейчас уже берутся из /mnt/2017
    4. Только убедившись, что все хорошо, удаляйте /data/2017
    Ответ написан
  • Что не нравится Nginx?

    Что не нравится Nginx?


    nginx не нравится, что Вы подсунули ему неправильный файл сертификата cert.crt, правильный должен иметь примерно такой вид (многострочный):

    -----BEGIN CERTIFICATE-----
    MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/
    ................
    ................
    JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo
    Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
    -----END CERTIFICATE-----


    Сделайте:

    openssl x509 -in /etc/ssl/certs/domains/sea3.ru/cert.crt -noout -text -purpose


    Если файл сертификата корректный, то вы увидите всю информацию о сертификате, иначе будет ошибка.
    Ответ написан
  • Переадресация по доменным именам NGINX?

    Когда захожу в конфиг GNIX на 192.168.0.2, там 2 файла и вот что там прописано:


    Вы что-то не договориваете или не понимаете и пишите не полную информацию.

    Где это сервер (192.168.0.2) на вашей картинке?
    Откуда все таки вы взяли конфиг nginx, с какого сервера? По моему это конфиг с сервера виртуального сервера 10.102.10.32, потому что его IP фигурирует.

    У вас на картинке есть роутер, если я правильно понял внешний динамический IP от провайдера получает именно он и на нем же ddns.
    Тогда вопрос: Какие правила редиректа подключений на 80 порт есть на этом роутере?
    Ответ написан
  • Почему медленно работает сайт?

    listen = 127.0.0.1:9001


    1. Используйте unix socket, это увеличит скорость работы связки nginx + php-fpm

    Пример пула php-fpm:

    [site.ru]
    listen = /var/lib/php5-fpm/siteru.sock
    listen.owner = site
    listen.group = site
    listen.mode = 0660
    ...


    Пример настройки nginx:
    location ~ \.php$ {
      ...
      fastcgi_pass unix:/var/lib/php5-fpm/siteru.sock;
      ...
    }


    pm = ondemand


    2. Используйте модель dynamic, при ondemand скорее всего вы упираетесь в pm.max_children

    Пример для dynamic:

    pm = dynamic
    pm.max_children = 10
    pm.start_servers = 2
    pm.min_spare_servers = 1
    pm.max_spare_servers = 5
    pm.max_requests = 500


    3. Включите лог медленных запросов на mysql, включите дебаг в yii2, включите отладочные логи на php-fpm

    Пример включения отладочных логов для php-fpm:
    ; Перенаправлять вывод процесса в лог
    catch_workers_output = yes
    ; Если скрипт выполняется больше указанного времени, писать отладочную информацию в slowlog
    request_slowlog_timeout = 3
    ; Лог-файл для медленных запросов
    slowlog = /var/log/fpm-php/siteru.slow.log
    Ответ написан
  • Большое количество сайтов на nginx?

    В консоле сервера:

    Проверим soft limit:
    # ulimit -Sn

    Проверим hard limit:
    # ulimit -Hn

    Если мало, то динамически изменим текущие лимиты:
    # ulimit -n 65525

    Теперь добавляем лимиты в файлы настроек, чтобы при старте системы они выставились какие нам нужны:
    В файле /etc/security/limits.conf дописываем:
    * soft nofile 65525
    * hard nofile 100000
    nginx hard nofile 65000

    Теперь меняем лимиты в nginx, для этого в файле /etc/nginx/nginx.conf в самом начале, примерно после строк
    user www-data;
    worker_processes auto;
    пишем
    worker_rlimit_nofile 65000;

    В консоле:
    # nginx -t && nginx -s reload
    Ответ написан
  • Как правильно настроить alias на Nginx, чтобы работал php?

    Если я правильно понял вашу хотелку, то может так:

    ...
            location /aaaa {
                    root /var/www/aaaa;
                    index index.php index.html index.htm;
                    location ~ (.+\.php)$ {
                           try_files $uri = 404;
                           root /var/www/aaaa/;
                           include /etc/nginx/fastcgi_params;
                           fastcgi_pass unix:/var/lib/php5-fpm/aaaa.sock;
                           fastcgi_index index.php;
                           fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                    }
            }
    ...
    Ответ написан
  • Почему не работает map в nginx?

    Думаю Алексей Виноградов хочет сделать красивый конфиг nginx для работы WP Super Cache без горы if, как во многих статьях типа этой, что похвально, т.к. If is Evil

    Но судя по всему в map у nginx для нескольких значений регулярка не работает, поэтому ни так ~* ни так ~(.*) и ни так ~^(.*)$ работать не будет.

    Но я бы позвал сюда эксперта по nginx, чтобы он авторитетно либо подтвердил мою догадку, либо опроверг.
    Ответ написан
  • Как решить проблему с SSL?

    Если верить nslookup, то IP адрес с вашего скрина не совпадает с данными из DNS => что сайт открывается не с вашего сервера => там левый ssl сертификат

    # nslookup portal.tggroup.kz
    Server:         127.0.0.1
    Address:        127.0.0.1#53
    
    Non-authoritative answer:
    Name:   portal.tggroup.kz
    Address: 178.62.251.156
    Ответ написан
  • Какие прорехи в безопасности могут быть в конфигурации nginx?

    1. Постоянный редирект с / на index.php

    location = / {
            rewrite ^ $scheme://$host/index.php permanent;
        }
    
        location / {
            deny all;
            return 404;
        }
        location ~* ^/index\.php$ {
            try_files $uri $uri/ =404;
            fastcgi_index index.php;
            fastcgi_pass php5-fpm-sock;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include /etc/nginx/fastcgi_params;
        }



    Очень странная логика, особенно использование $host и некорректное использование try_files. Про try_files почитайте тут.

    $host
    в порядке приоритета: имя хоста из строки запроса, или имя хоста из поля “Host” заголовка запроса, или имя сервера, соответствующего запросу


    Если у вас не определен default_server и server_name site.ru; стоит первым в списке, то к вам будут прилетать все запросы с любым полем Host, в том числе пустым, что является очень опасной практикой.
    Лучше использовать переменную $server_name, но все равно, если вам нужно обращения по любым url обрабатывать только через index.php, то правильно это делается так:

    /NONEXISTENTFILE меняете на заранее фейковый файл который не может существовать, например /d7sdhsdhsdf8sfhgsfd8fh438dfjh

    ...
            error_page 404 = @cms;
    
            location / {
                try_files /NONEXISTENTFILE @cms;
            }
    
            location @cms {
                    fastcgi_pass      unix:/var/lib/php5-fpm/xxxxx.sock;
                    fastcgi_index    index.php;
                    fastcgi_param   SCRIPT_FILENAME $document_root/index.php;
                    fastcgi_param   SCRIPT_NAME /index.php;
                    include             /etc/nginx/fastcgi_params;
            }
    ...


    2. Запрещаем любую статику кроме gif|jpg|png|js|css|ttf|woff|ico
    location ~* \.(gif|jpg|png|js|css|ttf|woff|ico)$ {
            try_files $uri =404;
            expires 30d;
        }



    Логичнее и правильнее будет сделать так:

    try_files $uri =404; нам не понадобится, т.к. у нас есть error_page 404 = @cms; который в случае отсутствия картинки перенаправит запрос в @cms

    ...
            error_page 404 = @cms;
    
            location ~* ^.+\.(gif|jpg|png|js|css|ttf|woff|ico)$ {
                    expires 30d;
                    access_log off;
                    log_not_found off;
            }
    
            location / {
                try_files /NONEXISTENTFILE @cms;
            }
    ...


    По поводу json.php и в принципе ограничения доступа, правильнее делать это через map или geo, например так:

    http {
    ....
            geo $my_client_ip $denied {
                    default 1;
                    127.0.0.1 0;
                    XX.XX.XX.XX 0; # <- IP1 с которого можно заходить
                    YY.YY.YY.YY 0;    # <- IP2 с которого можно заходить
            }
    
    server {
            listen       443 ssl;
            server_name  site.ru;
            root         /var/www/html/;
    ...
            set $my_client_ip $remote_addr;
            if ($http_x_forwarded_client_ip ~ "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}") {
                    set $my_client_ip $http_x_forwarded_client_ip;
            }
    
            error_page 403 = @deny;
    
            location @deny {
                    root /var/www/deny;
                    rewrite ^(.*)$ /index.html break;
            }
    
            location ~* ^/json\.php$ {
                    if ($denied) {
                            return 403;
                    }
                    try_files /NONEXISTENTFILE @json;
            }
    
            location @json {
                    try_files       $uri = 404;
                    fastcgi_pass    unix:/var/lib/php5-fpm/xxxxx.sock;
                    fastcgi_index   index.php;
                    fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
                    include         /etc/nginx/fastcgi_params;
            }
    
    }
    }


    4. Разрешаем доступ к /admin только с 1-го IP, для /admin/phpmyadmin


    Не делайте так! Организуйте для phpMyAdmin отдельный поддомен с отдельным виртуальным сервером и отдельной обработкой php5-fpm через отдельный сокет.
    Никогда не храните "левые" (вспомогательные) утилиты в общем каталоге web-приложения, это плохая практика. К примеру: Если в phpMyAdmin будет найдена критическая уязвимость, то даже в случае ограничения доступа к нему с определенного IP существует вероятность, что она может быть проэксплуатирована и тогда через неё поломают ваше web-приложение - оно вам нужно?

    По поводу location ~* /admin/ аналогично как для json.php.

    Ну и все рекомендации выше от Кирилл Несмеянов относительно hsts, ssl, ciphers, dh, ocsp stapling поддерживаю.
    Ответ написан
  • [Wordpress] Как изменить wp-admin на другой адрес с nginx?

    Вообще если честно, то блокировка админки WordPress базовой аутентификацией или смена её местоположения - это глупость.
    Куда надежнее использовать двух факторную аутентификацию, fail2ban для блокировки попыток доступа к админке с ошибочными паролями, обязательно HTTPS и конечно же самое главное - надежные пароли.
    Ответ написан
  • Как правильно организовать балансировку нагрузки?

    Если Вы уверены, что Web-приложение справляется с нагрузкой, то возможно на балансировщике стоит увеличить таймауты, добавьте в location /

    proxy_connect_timeout 120s;
    proxy_send_timeout 120s;
    proxy_read_timeout 120s;


    На 3-х вебсерверах если Вы используете php-fpm то лучше работать через unix-сокеты, а не через tcp, через сокеты будет быстрее.

    Возможно стоит посмотреть в сторону параметра least_conn в upstream, то есть запросы сначала будут отправляются бэкенду с наименьшим количеством активных подключений (но с учетом весов). Подробнее тут.
    Если какой-то бэкенд мощнее других, то используйте определение веса через weight
    Так же настройте директивы max_fails и fail_timeout в блоке upstream (в моем примере ниже параметры проставлены для примера).

    Так же включите логи на балансировщике, это сильно упростит отладку:

    http {
        ...
        log_format upstream_log '[$time_local] $remote_addr - $remote_user - $server_name to: $upstream_addr: $request upstream_response_time $upstream_response_time msec $msec request_time $request_time';
    
    upstream servers {
                    least_conn;
                    server ip1;
                    server ip2 max_fails=3 fail_timeout=30s;
                    server ip3 max_fails=5 fail_timeout=30s;
                    keepalive 16;
            }
    
    server {
                    listen 80;
                    access_log /var/log/nginx/servers-access.log upstream_log;
                    error_log /var/log/nginx/servers-error.log debug;
    
                    location / {
                            proxy_pass http://servers;
                            proxy_http_version 1.1;
                            proxy_set_header Connection "";
                            proxy_connect_timeout 120s;
                            proxy_send_timeout 120s;
                            proxy_read_timeout 120s;
            }
    }
    Ответ написан
  • Nginx не проксирует на удаленный хост?

    Что мешает обратиться к официальной документации с примерами настроек, а не городить огород?

    https://github.com/ONLYOFFICE/document-server-prox...

    У меня в одном проекте проксирование HTTPS-to-HTTPS на Nginx настроено так:
    http {
    
            # Websocket
            map $http_upgrade $connection_upgrade {
                    default upgrade;
                    ''      close;
            }
    
    server {
    ...  
              lingering_time 86400;
              proxy_ssl_verify off;
              proxy_ssl_session_reuse on;
              proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
              proxy_cache off;
              proxy_store off;
    
              set $ssl off;
              set $port 80;
              if ($scheme = https) {
                  set $ssl on;
                  set $port 443;
              }
    
            location / {
                proxy_pass https://192.168.XX.XX:8443/;
                gzip off;
                proxy_read_timeout          600s;
                proxy_connect_timeout       600s;
                proxy_redirect              off;
                proxy_buffering             off;
                proxy_request_buffering     off;
                proxy_http_version          1.1;
                proxy_set_header Host                   $http_host;
                proxy_set_header X-Real-IP              $remote_addr;
                proxy_set_header X-Forwarded-Ssl        $ssl;
                proxy_set_header X-Forwarded-For        $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto      $scheme;
                proxy_set_header X-Forwarded-Port       $port;
                proxy_set_header X-Frame-Options        SAMEORIGIN;
                proxy_set_header Upgrade                $http_upgrade;
                proxy_set_header Connection             $connection_upgrade;
                proxy_set_header Referer "";
            }
    }
    }
    Ответ написан
  • Nginx сайты на одном ip?

    1. Для понимания того как Nginx обрабатывает запросы обязательно почитайте это
    2. Так же обязательно определите default_server, например в файле /etc/nginx/conf.d/fallback.conf (путь может меняться, см. include в nginx.conf) можно написать:
    server {
            listen XX.XX.XX.XX:80 default_server;
            server_name _;
            return 444;
    }

    default_server пригодиться для обработки неправильных запросов, например запросов без поля "Host"
    В моем примере чуть выше nginx просто будет закрывать соединение для таких запросов, для этого служит спец. код 444.
    Ответ написан
  • Как убрать No input file specified?

    Причин появления ошибки No input file specified несколько:
    1. У вас не установлена переменная SCRIPT_FILENAME в конфиге nginx;
    2. Задан неправильный аргумент root в конфиге nginx;
    3. Переменная open_basedir в /etc/php5/fpm/php.ini или в конфиге php5-fpm пула содержит путь, который не соответствует аргументу root в конфиге nginx;
    4. Пользователь с правами которого работает php5-fpm или конкретный пул php5-fpm не имеет прав доступа к каталогу или файлу с php-скриптом;

    Пример правильного конфига nginx + php5-fpm:
    server {
    ....
    root /var/www/mysite.com;
    index index.php index.html index.htm;
    
    location / {
            try_files $uri $uri/ =404;
    }
    location ~ \.php$ {
            try_files $uri = 404;
            fastcgi_pass unix:/var/lib/php5-fpm/mysite.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include /etc/nginx/fastcgi_params;
    }
    ...
    }
    Ответ написан