Ответы пользователя по тегу Nginx
  • Как установить PHP 5.4 на Nginx в Ubuntu Server 16.04?

    Если кратко, то можно так собрать:

    Установка php-5.4.45 + fpm

    mkdir -p /opt/php-5.4.45
    rm -rf /usr/local/src/php5-build && mkdir /usr/local/src/php5-build
    cd /usr/local/src/php5-build
    wget de2.php.net/distributions/php-5.4.45.tar.gz
    tar -vzxf php-5.4.45.tar.gz && cd php-5.4.45
    ./configure --prefix=/opt/php-5.4.45 --with-pdo-pgsql --with-zlib-dir --with-freetype-dir --enable-mbstring --with-libxml-dir=/usr --enable-soap --enable-calendar --with-curl --with-mcrypt --with-zlib --with-gd --with-pgsql --disable-rpath --enable-inline-optimization --with-bz2 --with-zlib --enable-sockets --enable-sysvsem --enable-sysvshm --enable-pcntl --enable-mbregex --enable-exif --enable-bcmath --enable-zip --with-pcre-regex --with-mysqli --with-mysql --with-pdo-mysql --with-mysqli --with-jpeg-dir=/usr --with-png-dir=/usr --enable-gd-native-ttf --with-openssl --with-fpm-user=www-data --with-fpm-group=www-data --with-libdir=/lib/x86_64-linux-gnu --enable-ftp --with-imap --with-imap-ssl --with-kerberos --with-gettext --with-xmlrpc --with-xsl --enable-fpm
    make && make install
    cp /usr/local/src/php5-build/php-5.4.45/php.ini-production /opt/php-5.4.45/lib/php.ini
    cp /opt/php-5.4.45/etc/php-fpm.conf.default /opt/php-5.4.45/etc/php-fpm.conf
    mkdir /opt/php-5.4.45/etc/php-fpm.d

    Редактируем некоторые параметры в /opt/php-5.4.45/etc/php-fpm.conf

    include=etc/php-fpm.d/*.conf
    [global]
    pid = run/php-fpm.pid
    log_level = error

    Меняем настройки в /opt/php-5.4.45/lib/php.ini по своему вкусу, у меня так:

    date.timezone = "Asia/Yekaterinburg"
    expose_php = Off
    short_open_tag = On
    max_execution_time = 600
    max_input_time = 300
    max_input_vars = 5000
    memory_limit = 512M
    error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT & ~E_NOTICE
    post_max_size = 128M
    ;default_charset = "UTF-8"
    upload_max_filesize = 128M
    default_socket_timeout = 120
    mysql.connect_timeout = 120

    Если в Linux используется sysv, то создаем файл /etc/init.d/php-5.4.45-fpm, см. https://gist.github.com/CHERTS/bcf1006e90777ead77c...

    Назначаем права и автостарт
    # chmod 755 /etc/init.d/php-5.4.45-fpm
    # insserv -v /etc/init.d/php-5.4.45-fpm
    Запускаем:
    # /etc/init.d/php-5.4.45-fpm start

    Если в Linux используется systemd, то создаем файл
    /lib/systemd/system/php-5.4.45-fpm.service
    исходник https://gist.github.com/CHERTS/bcf1006e90777ead77c...

    Если в Linux используется systemd выполняем:
    # chown root:root /lib/systemd/system/php-5.4.45-fpm.service
    # systemctl daemon-reload
    # systemctl enable php-5.4.45-fpm.service
    # systemctl start php-5.4.45-fpm.service

    Проверить статус можно командой
    # systemctl status php-5.4.45-fpm.service

    Удалить
    # systemctl stop php-5.4.45-fpm.service
    # systemctl disable php-5.4.45-fpm.service
    # systemctl daemon-reload
    # systemctl reset-failed
    # rm /lib/systemd/system/php-5.4.45-fpm.service
    # systemctl daemon-reload

    Далее в каталоге /opt/php-5.4.45/etc/php-fpm.d/ создаем файл пула php-fpm с именем к примеру mysite.conf
    Содержание mysite.conf например такое (mysiteuser и mysitegroup - это имена системного пользователя и группу от имени которых будет работать данный пулл, в php_admin_value[open_basedir] указывается путь до корневого каталога сайта, на этот каталог у mysiteuser и mysitegroup должны быть полные права):

    [mysite]
    listen = /var/lib/php5-fpm/mysite.sock
    listen.owner = mysiteuser
    listen.group = mysitegroup
    listen.mode = 0660
    user = mysiteuser
    group = mysitegroup
    pm = dynamic
    pm.max_children = 8
    pm.start_servers = 2
    pm.min_spare_servers = 1
    pm.max_spare_servers = 5
    pm.max_requests = 500
    chdir = /
    php_admin_value[open_basedir] = /var/www/mysite/web:/usr/share/php5:/usr/share/php:/tmp:/usr/share/phpmyadmin:/etc/phpmyadmin:/var/lib/phpmyadmin
    php_admin_value[session.save_path] = /var/www/mysite/tmp
    php_admin_value[upload_tmp_dir] = /var/www/mysite/tmp

    После рестартуем
    systemctl status php-5.4.45-fpm.service
    или
    /etc/init.d/php-5.4.45-fpm restart

    В настройках nginx в качестве сокета php-fpm указываем /var/lib/php5-fpm/mysite.sock

    Вот как то так.
    Ответ написан
    Комментировать
  • Ngx_http_auth_jwt_module и права доступа к API можно ли проверить?

    Модуль ngx_http_auth_jwt_module
    Модуль доступен как часть коммерческой подписки.


    Вы купили коммерческую подписку? Тогда Вам лучше задать вопрос им, как минимум Вы за это заплатили.
    Ответ написан
    Комментировать
  • Правильность и оптимизация конфига nginx?

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


    С точки зрения автономности + следуя рекомендациям разработчиков nginx - это неправильно, весь конфиг относящийся к сайту должен быть максимально в одном файле.

    Использование include с выносом общих частей в отдельные файлы удобно когда у вас на сервере 100500 сайтов с одинаковой конфигурацией и не предполагается её локальное (для одного сайта) изменение, а вот если у Вас на сервере 5 сайтов с разными конфигурациями, то вынося общие части в отдельные файлы и использую include Вы только усложните чтение конфига, ведь придется вспоминать что там у вас подключено через include или постоянно дергаться и смотреть в кучу файлов - это жутко неудобно, я уже не говорю про перенос конфигурации на другой сервер - с 1 файлом вы взяли и скопировали его, а с файлом содержащем include Вам нужно переносить всю кучку конфигов и про это надо помнить.
    Ответ написан
  • (113) No route to host?

    113: No route to host


    Nginx не может найти маршрут до бэкенд-сервера.

    server unix:///home/solovievga/phonebook-api/tmp/sockets/puma.sock;


    1. Запись должны быть вида

    server unix:/tmp/backend3;

    см. документация

    2. Nginx (пользователь с правами которого он работает, обычно nginx или www-data) должен иметь права 0660 на сокет /home/solovievga/phonebook-api/tmp/sockets/puma.sock

    listen   80 default;
    server_name 10.12.4.245;
    и
    ниже
    location / {
    ...
            try_files $uri @app;
    ...
    }
    и
       location @app {
         proxy_pass        http://10.12.4.245;


    Вы уверены что хотите проксировать сами на себя?
    Ответ написан
    Комментировать
  • Как сделать переадресацию в nginx c www?

    Все просто, делаете несколько server { } под нужный домен и настраиваете там 301 куда нужно.

    # с http://nene.ru -> 301 на https://nene.ru
    server {
            listen 242.24.144.84:80;
            server_name nene.ru;
            return 301 https://nene.ru$request_uri;
    }
    
    # с http://www.nene.ru -> 301 на https://nene.ru
    server {
            listen 242.24.144.84:80;
            server_name www.nene.ru;
            return 301 https://nene.ru$request_uri;
    }
    
    # с https://www.nene.ru -> 301 на https://nene.ru
    server {
            listen 242.24.144.84:443 http2 ssl;
            server_name www.nene.ru;
            ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
            ssl_certificate /etc/letsencrypt/live/nene.ru/fullchain.pem;
            ssl_certificate_key /etc/letsencrypt/live/nene.ru/privkey.pem;
            ...
            return 301 https://nene.ru$request_uri;
    }
    
    # Сам сайт https://nene.ru
    server {
            listen 242.24.144.84:443 http2 ssl;
            server_name nene.ru;
            ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
            ssl_certificate /etc/letsencrypt/live/nene.ru/fullchain.pem;
            ssl_certificate_key /etc/letsencrypt/live/nene.ru/privkey.pem;
            ...
            ...
            ...
    }
    Ответ написан
  • Как правильно настроить Nginx под Word Press?

    Во многих статьях по настройке Nginx для WP много лишнего и неправильного, самый простой (минимальный) и корректный конфиг который я использую на большинстве проектов (для HTTP only и использования php-fpm с пулами):

    1. Строку
    set $fastcgipass unix:/var/lib/php5-fpm/mysite.sock;
    исправьте на свой путь до сокета
    2. Строку XX.XX.XX.XX:80 замените на свой IP
    3. Упоминание mysite.ru замените на свой сайт
    4. Строку root /var/www/mysite.ru замените на свой путь до сайта

    server {
            listen XX.XX.XX.XX:80;
            server_name mysite.ru;
            root /var/www/mysite.ru;
            index index.php index.html index.htm;
    
            error_log /var/log/nginx/mysite.ru_error.log;
            access_log /var/log/nginx/mysite.ru_access.log main;
    
            set $fastcgipass unix:/var/lib/php5-fpm/mysite.sock;
    
            ## Disable .htaccess and other hidden files
            location ~* /\.(ht|svn|hg) {
                    deny all;
                    access_log off;
                    log_not_found off;
            }
    
            ## Disable .gitignore file and .git directory
            location ~ (/\.gitignore|/\.git) {
                    deny all;
                    access_log off;
                    log_not_found off;
            }
    
            location ~* ^.+\.(jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|exe|xls|doc|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|mov)$ {
                    expires 14d;
                    access_log off;
                    log_not_found off;
            }
    
            location ~* ^.+\.(css|js)$ {
                    expires 24h;
            }
    
            location = /favicon.ico {
                    log_not_found off;
                    access_log off;
            }
    
            location = /robots.txt {
                    allow all;
                    log_not_found off;
                    access_log off;
            }
    
            location ~* /(images|logs|tmp)/.*\.(php|pl|py|jsp|asp|sh|cgi)$ {
                    deny all;
                    access_log off;
                    log_not_found off;
            }
    
            location ~* /wp-content/.*\.php$ {
                    deny all;
                    access_log off;
                    log_not_found off;
            }
    
            location ~* /(?:uploads|files)/.*\.php$ {
                    deny all;
                    access_log off;
                    log_not_found off;
            }
    
            location ~ /wp-config.php {
                    deny all;
                    access_log off;
                    log_not_found off;
            }
    
            location ~ /xmlrpc.php {
                    deny all;
                    access_log off;
                    log_not_found off;
            }
    
            location / {
                    try_files $uri $uri/ /index.php;
            }
    
            location ~ \.php$ {
                    try_files       $uri @cms;
                    include         /etc/nginx/fastcgi_params;
                    fastcgi_pass    $fastcgipass;
                    fastcgi_index   index.php;
                    fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
            }
    
            location @cms {
                    fastcgi_pass    $fastcgipass;
                    fastcgi_index   index.php;
                    fastcgi_param   SCRIPT_FILENAME $document_root/index.php;
                    include         /etc/nginx/fastcgi_params;
            }
    
    
    }
    Ответ написан
    Комментировать
  • Почему nginx возвращает 403?

    1. Включите логгирование на Nginx
    2. Проверьте права на каталог /home/vasya/api-cms-server/public/uploads/ и на файлы в нем.
    Ответ написан
    1 комментарий
  • Как правильно настроить SSL на виртуальной системе?

    1. Создаете свою CA
    2. Выпускаете самоподписной сертификат этой CA для доменов site.dev, app.site.dev
    3. Подключаете этот сертификат к nginx
    4. Корневой сертификат CA добавляете на клиентских машинах в доверенные корневые.
    5. Profit... плучаете зеленый свет в Google Chrome

    Если детально, то читайте тут.
    Ответ написан
    Комментировать
  • Nginx + wordpress. Как отобразить новый контент по старым url?

    Напишите 301 редирект со старого контента на новый - это будет самый правильный вариант.

    Если цель существования старых ссылок - это продвижение сайта, то при наличии 301 редиректа через какое-то время поисковики проиндексируют новый сайт и редиректы можно будет убрать.
    Если цель существования старых ссылок - это переходы на эти ссылки с других сайтов, на которых они опубликованы, то оставляйте редиректы навсегда.
    Ответ написан
    Комментировать
  • Cтатистику по открытым соединениям для nginx?

    Расширенная статистика доступна только в Nginx Plus, скорее всего именно она вам и нужна, но есть несколько альтернативных модулей
    https://github.com/vozlt/nginx-module-vts
    https://github.com/vozlt/nginx-module-sts
    https://github.com/vozlt/nginx-module-stream-sts

    Смотрите, тестируйте.
    Ответ написан
    Комментировать
  • Как сконфигурировать nginx для того чтобы он работал как http прокси?

    Как установить Nginx можете почитать в моей статье.

    А как настроить проксирование Иван Корюков хоть и кривенько, но описал.
    Ответ написан
    Комментировать
  • Почему php-fpm не находит файл?

    Ошибка "FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream" говорит о том, что Nginx не может найти указанный в файле конфигурации скрипт, речь про эту строку:

    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;


    Рекомендация тут простая - проверьте все пути и убедитесь, что все нужные файлы существуют и лежат на своих местах.

    Конкретно в Вашем случае я не вижу определения директивы root за пределами location / или в нем.

    Если вы не можете разобраться, в каком каталоге Nginx ищет нужный скрипт, то на узле vh2_fphp7.0 запускаете:

    tcpdump port 9000 -A | strings

    Вывод покажет всю нужную информацию, в том числе путь к скрипту.

    Так же можно включить логирование:
    http {
       ...
       log_format scripts '$document_root$fastcgi_script_name > $request';
       server {
       ...
       access_log /var/log/nginx/mysite-scripts.log scripts;
       ...
       }
    }


    Так же возможно вы неправильно написали регулярку в директиве fastcgi_split_path_info, см. оф. документацию.

    Так же проверьте значение cgi.fix_pathinfo = 1 (в некоторых мануалах советуют cgi.fix_pathinfo = 0 что может привести к не правильной обработке переменной PHP_SELF не равной DOCUMENT_URI).

    Кстате строки

    if (!-f $document_root$fastcgi_script_name) {
            return 404;
        }


    по моему абсолютно излишни, уберите их или используйте try_files.
    Я конечно понимаю, что сами разработчики Nginx в этой статье написали так..., но....

    location ~ \.php$ {
            try_files       $uri = 404;
            fastcgi_pass    127.0.0.1:9001;
            include         /etc/nginx/fastcgi_params;
            fastcgi_index   index.php;
            fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
    Ответ написан
    Комментировать
  • Почему gzip не ускоряет время загрузки сайта?

    Вопрос - почему время загрузки страницы не ускорилось?


    Ну наверно потому, что у Вас неправильно настроено сжатие gzip.
    Например писать gzip_types image/png image/jpeg бессмысленно, т.к. бинарные данные картинок итак сжаты и никакого выигрыша Вы не получите.

    Правильно написать так:

    http {
       ....
       gzip on;
       gzip_http_version 1.0;
       gzip_min_length 512;
       gzip_buffers 64 8k;
       gzip_comp_level 5;
       gzip_proxied any;
       gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;
       ...
    }


    В секции server { } можете ничего не писать если не планируете менять параметры.

    Потом берем curl и проверяем:
    curl -H "Accept-Encoding: gzip,deflate" -I http://mysite.ru/index.html


    получаем ответ

    HTTP/1.1 200 OK
    Server: nginx
    Date: Fri, 24 Nov 2017 11:32:00 GMT
    Content-Type: text/html
    Last-Modified: Tue, 12 Apr 2016 06:48:17 GMT
    Connection: keep-alive
    ETag: W/"570c9a31-576"
    Content-Encoding: gzip


    Обращаем внимание на поле Content-Encoding

    Для теста из консоли берем утилиту Apache Benchmark:
    ab -n 1 -H "Accept-Encoding: gzip,deflate" http://mysite.ru/index.html


    Смотрим на поля помеченные жирным, при выключенном gzip они увеличиваются.

    Concurrency Level: 1
    Time taken for tests: 0.128 seconds
    Complete requests: 1
    Failed requests: 0
    Total transferred: 3405 bytes
    HTML transferred: 3025 bytes
    Requests per second: 7.80 [#/sec] (mean)
    Time per request: 128.249 [ms] (mean)
    Time per request: 128.249 [ms] (mean, across all concurrent requests)
    Transfer rate: 25.93 [Kbytes/sec] received

    Connection Times (ms)
    min mean[+/-sd] median max
    Connect: 90 90 0.0 90 90
    Processing: 38 38 0.0 38 38
    Waiting: 38 38 0.0 38 38
    Total: 128 128 0.0 128 128


    Ну и берем Firefox и смотрим там поля Передано и Размер, если сжатие работает, то Передано должно быть меньше Размер.
    Ответ написан
    1 комментарий
  • Почему редиректит с поддомена на домен?

    Если вы перенесли 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
    Ответ написан
    7 комментариев
  • Как удалить лишние пробелы в статике используя 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
    Ответ написан
    Комментировать