• Как ускорить загрузку гифки 22Кб со своего же сервера (используется JS)?

    @xtreme
    coderisimo: К сожалению, я не знаю, что имели ввиду авторы Plesk под данной опцией. Предпочитаю контролировать конфиг самостоятельно. Возможно она действительно поможет.
  • Как ускорить загрузку гифки 22Кб со своего же сервера (используется JS)?

    @xtreme
    Сложно выдать какой-то ресурс, в котором бы все было описано. К тому же, nginx инструмент довольно мощный и вряд ли какой-то ресурс в красках и живописно охватит все аспекты его применения и способов конфигурации.
    Скажем так - для начала неплохо было бы почитать официальную документацию на nginx.ru (nginx.org). Не надо читать прямо сейчас, когда жёппа в огне. Дома, не спеша, пройтись два-три раза, чтобы хотя бы иметь представление, что и где искать в случае надобности.
    Дальше - начать применять nginx по-частям. Не сразу с корабля на бал с конфигом в 30 файлах, с адскими регулярками, проверкой куков и прочее... А, например, на каком-то простом проекте начать с простого

    upstream local {
      server 127.0.0.1:81;
    }
    
    server {
      
    listen 80;
      server_name www.trololo.com;
    
      location / {
        proxy_pass http://local;
      }
    }


    Т.е. просто спрятать все за nginx, заставив его просто проксировать все на бэкенд.
    Затем, включить локейшн для отдачи картинок, чтобы не терзать ими апач.

    location ~ \.(jpg|png|gif) {
      root /var/www/trololo.com;
    }


    Затем включить gzip (ну, видимо уже сталкивался), ну а дальше наворачивать и наворачивать :)

    Если интересно - пиши, помогу, чем смогу, если время будет :)
  • Как ускорить загрузку гифки 22Кб со своего же сервера (используется JS)?

    @xtreme
    coderisimo: А как ты понял, что файл отдается nginx? Браузером это не увидеть - nginx его в любом случае отдаст. Другое дело - кто читает этот файл с диска - сам nginx (это быстро) или nginx передает твой запрос бэкенду (обычно апач), и потом уже бэкенд считывает с диска файл и отдает по цепочке обратно (это медленно)?
    Я привел выше пример секции конфига nginx для отдачи всех урлов, имеющих в составе /img/ напрямую с диска.
    Возможно, секция будет выглядеть по-другому, например:
    location ~ .+\.(git|png|jpg|css|js) {
    root /var/www/.... ;
    expires 1y;
    }
    И то, будет ли оно работать, зависит от местоположения location в конфиге.

    Как почти стопроцентный вариант узнать, отдает ли nginx файл сам или проксирует запрос на него в апач - сделать свой logformat, например:

    log_format useragent '$remote_addr - [$time_local] "$host" "$request" $status ($bytes_sent) "$http_referer" '
            '[$request_time] gzip:"$gzip_ratio" cache:"$upstream_cache_status" "$content_length" '
            'agent:"$http_user_agent" "upstream: $upstream_addr time:$upstream_response_time sec.";


    и к директиве access_log у сервера приписать формат лога useragent... В таком случае в логах запись будет формата:
    80.60.50.12 - [02/Dec/2015:16:45:34 +0300] "trololo.com" "GET /Feed/Games?lng=ru HTTP/1.1" 200 (5343) "https://trololo.com/games/" [0.019] gzip:"-" cache:"EXPIRED" "-" agent:"Mozilla/5.0 (Windows NT 6.3; WOW64; rv:42.0) Gecko/20100101 Firefox/42.0" "upstream: 127.0.0.1:80 time:0.018 sec."

    Обрати внимание, что здесь указан адрес апстрима (т.е. куда nginx направил запрос) и время его ответа. Здесь явно видно, что запрос GET /Feed/Games?lng=ru HTTP/1.1 был отправлен на апстрим, находящийся на адресе 127.0.0.1:80 и апстрим ответил за 0.018 секунд. А сам nginx отработал запрос за 0.019 секунд (значение в квадратных скобках).
    А, например, запрос на файл, который отдавался самим nginx-ом будет выглядеть примерно так:
    80.60.50.12 - [02/Dec/2015:16:52:21 +0300] "trololo.com" "GET /img/76.png HTTP/1.1" 200 (1870) "https://trololo.com/" [0.000] gzip:"-" cache:"-" "-" agent:"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:42.0) Gecko/20100101 Firefox/42.0" "upstream: - time:- sec." "UA=-"

    Т.е. указания апстрима нет, как и его времени ответа, как и многих других полей. Здесь можно точно сказать, что файл отдался nginx-ом. (Кстати, время обработки запроса при отдаче статики обычно такое, как здесь - [0.000])

    Подозреваю, что диск у тебя ни причем. Поскольку с самого твоего сервера отдается не так много ресурсов... MaxCDN используется? Да и файл бы уже попал в дисковый кеш и не читался бы с диска каждый раз. С 99% уверенностью могу утверждать, что дело у тебя как раз в том, что вместо того, чтобы отдать файл напрямую, nginx проксирует запрос на него в и так загруженный апач (ну или что там в качестве бэкенда). Дело осложняется тем, что, судя по заголовкам, у тебя установлен Plesk, а с ним у меня довольно сложные взаимоотношения :) Мы с ним никак не можем договориться, кто ответчает за конфиги - сисадмин или Plesk :)
  • Как правильно настроить Exim?

    @xtreme
    Кирилл:
    SPF - https://yandex.ru/support/pdd/set-mail/spf.xml
    Там все просто - просто TXT-запись в DNS домена, указывающая, кто может отсылать почту от имени данного домена.
    DKIM - habrahabr.ru/post/173605
    Все, что нужно для его поддержки - уже есть в современном exim.
    Всё подключение сводится к:
    1. Генерация секретного ключа, которым подписываются сообщения
    2. Генерация публичной части ключа
    3. Внесение публичной части ключа в DNS домена.
    4. Правка exim.conf для подписи исходящих писем.
    Все.
  • Падает WiFi на Macbook-ах, куда копать?

    @xtreme
    Значит, скорее всего, если я прав, то стоит кому-то подцепиться к WiFi - ровно через час коннект падает. Если это так - значит, как временный костыль - увеличить время аренды, если позволяет инфраструктура. У нас, например, это проблематично, поскольку устройств гораздо больше, чем адресов в выделенной подсети.
  • Как разрешить ошибку mail(): Multiple or malformed newlines found in additional_header?

    @xtreme
    По скриншоту. Все, что идет до первой пустой строки - это заголовки. Ниже первой пустой строки - уже не заголовки, а тело письма.
  • Есть ли железяка для переадресации звонков с GSM (мобильная сеть) на Skype?

    @xtreme
    Как другой вариант - арендовать телефонный номер у любого SIP-оператора (первым на ум почему-то приходит "задарма"), подцепиться смартфоном к оператору по SIP (там все просто - номер/логин, пароль и адрес сервера), переадресовать звонки с мобильного номера на арендованный и принимать звонки по SIP откуда угодно.
  • Есть ли железяка для переадресации звонков с GSM (мобильная сеть) на Skype?

    @xtreme
    Когда сам сталкивался с подобной ситуацией, в моем случае оказалось проще воткнуть обычный 3G-свисток (разлоченный для голоса) в рабочий сервер с Asterisk, а на смартфон поставить CSipSimple. Пара строк в диалплане для переадресации входящего звонка со свистка на sip-аккаунт и обратно, включение у оператора функции переадресации звонка с моего номера на номер в свистке (не оставлять же свою симку) и как будто никуда не уезжал. Из затрат - только свисток подходящей модели, который может принимать голос, время для нахождения способа разлочки с "только интернет", плюс интернет.
    Но, думаю, это будет несколько сложно и излишне, если вы никогда не использовали Asterisk и некуда его поставить.
  • Как разрешить ошибку mail(): Multiple or malformed newlines found in additional_header?

    @xtreme
    Просто посмотрите на исходники любого письма в своем почтовом ящике. Особенно от правильных сервисов. Там четко видно, что все заголовки идут подряд, а тело отделяется пустой строкой. Поэтому надо для начала определить, что у вас является телом письма, а что хедерами и только между ними вставлять два конца строки. Судя по коду выше у Вас в хедеры еще и контент письма вставляется... это же неправильно. Конечно проверка будет ругаться, потому что двойной перенос строк в теле письма не запрещен, а PHP при отправке считает тело хедером.
  • Как разрешить ошибку mail(): Multiple or malformed newlines found in additional_header?

    @xtreme
    Возможно. Как я уже сказал, я не силен в PHP :) Но по стандарту двойной перенос строки отделяет хедеры от тела письма. Если двойной перенос строки встречается в хедерах где-то еще - PHP формирует Warning и письмо не формируется.
  • Как разрешить ошибку mail(): Multiple or malformed newlines found in additional_header?

    @xtreme
    У Вас в коде:
    $headers .= "Content-Type: multipart/mixed; boundary=\"" . $boundary . "\"" . $eol . $eol;

    И практически везде дальше в хедерах набивается два $eol подряд в конце строки.

    Собственно, Вы сами привели ссылку на обсуждение бага. В самом нижнем сообщении от разработчика английским по белому написано, что чтобы посылать multipart-сообщения, пользователи должны соблюдать соглашение RFC 2822, в котором написано, что двойной перенос строки ( два $eol подряд в вашем случае) используется для разделения хедеров письма от тела письма. Поэтому, если пользователи неверно используют $additional_headers - они должны поправить свой код.
    У вас же в хедерах почти везде двойной перенос строки.
  • Permission denied при загрузке страниц на виртуальном хосте, что делать?

    @xtreme
    chmod -R 777 /var/www/arkston/system/cache
    и
    chown -R httpd: /var/www/arkston/system/cache
    конечно же
    Кто знает, что у вас там внутри еще есть...
  • Permission denied при загрузке страниц на виртуальном хосте, что делать?

    @xtreme
    chmod 777 /var/www/arkston/system/cache
    chown httpd: /var/www/arkston/system/cache

    (вместо httpd - пользователь, из-под которого запускается apache)
  • Периодически не подгружаются картинки на сайте, почему?

    @xtreme
    Только если будешь ставить nginx - я тебе только секцию server написал. Остальные конфиги по-умолчанию можно сначала оставить. И дефолтный server убрать (закомментить или удалить, по-желанию) на всякий пожарный. Если будешь делать по-моему - тогда в апаче в Listen укажи именно
    Listen 127.0.0.1:80
    Если используешь apache-2.2 и виртхосты, тогда также
    NameVirtualHost 127.0.0.1:80
    и также в VirtualHost тоже указать 127.0.0.1, а nginx повесить только на внешний интерфейс.
    Стоит учесть, что и nginx и apache будут работать на 80 порту, но на разных интерфейсах. Если вдруг интерфейсы и порты в конфигах пересекутся - при перезагрузке или перезапуске один из демонов не запустится с ругнёй на невозможность прибиндиться на уже занятый порт.
  • Как правильно настроить nginx proxy?

    @xtreme
    OKNOZA: Это и так уже понятно из конфига.

    Для начала стоит определиться, по каким локейшнам у тебя что будет доступно.
    Проще всего разделить по локейшнам, например, следующим образом:
    Предположим, что имя сервера testchat.com. Корень, где расположены статические и php-файлы расположены в /var/www/chat/, php обрабатывается с помощью php-fpm, висящем на порту 9000, индексный файл, который должен открыться по-умолчанию - index.php, а в случае его отсутствия - index.html, а на node.js мы будем отправлять все uri, которые начинаются на /nodejs/.
    В этом случае конфиг будет выглядеть примерно так:
    server {
      listen 80;
      server_name testchat.com;
      index index.php;
      location / {
        root /var/www/chat;
      }
      location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
      }
      location ~ ^/nodejs/ {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
      }
    }


    Проблемы, которые могут здесь возникнуть - придется переписывать ссылки, которые должны вести в node.js, чтобы они начинались на /nodejs/, чтобы попасть в верный локейшн. И в самом node.js надо учитывать, что uri, который будет приходить туда, будет начинаться на /nodejs/, хотя это можно обойти, вписав "rewrite ^/nodejs/(.*)$ /$1 break" в локейшн /nodejs/.

    Второй вариант - создать локейшны для обработки известных тебе директорий и файлов, а все остальное отправлять на node.js. Этот вариант описан выше. В том числе и используя try_files, если имена файлов пересекаются так, что их не вытащишь регулярками.
  • Как правильно настроить nginx proxy?

    @xtreme
    Если надо, чтобы по "GET /" запрос уходил в .html, вынеси index index.html; выше по уровню из локейшна в секцию server. Кстати, в
    location ~ \.html$ {
      root   html;
      index  index.html index.htm;
    }

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

    @xtreme
    OKNOZA: Тогда задача немного некорректна. Если Cannot GET /, то я так понял ты запрашиваешь "GET /", а он на .html не заканчивается, а значит уйдет на node.js.
    Т.к. я не знаю, какая у тебя там иерархия директорий, то могу посоветовать два варианта:
    1. Если у тебя статичные js лежат в отдельной директории (например, /js/):
    location ~ /js/.+\.js$ {
      root html;
    }


    2. Конструкция через try_files, когда проверяется существование статического файла и в случае неудачи запрос уходит в другой локейшн. Она немного более затратная из-за необходимости проверять существование файла, но работает.

    location ~ \.js$ {
      root html;
      try_files $uri @nodejs;
    }
    
    location @nodejs {
      proxy_pass http://127.0.0.1:3000;
      proxy_set_header Host $host;
    }


    Как вариант, во втором примере можно совместить .html и .js, чтобы не плодить локейшны.
    location ~ \.(html|js)$ {
  • Как настроить Nginx в качестве прокси?

    @xtreme
    Svav: Это уже зависит от настроек сервера на той стороне. Что ты ему передаешь, то он и видит. Но вообще, обычно, смотрится X-Forwarded-For, как заголовок, который используют неанонимные прокси-серверы для обозначения адреса клиента.
    Кстати, хотя nginx и умеет проксировать, все же для доступа большого числа клиентов к неограниченному (или ограниченному) числу сайтов лучше применять именно прокси-серверы. Был опыт установки nginx в качестве прокси для всего HTTP и могу сказать, что Squid с такой задачей справляется гораздо лучше.
  • Как настроить Nginx в качестве прокси?

    @xtreme
    Svav: искать на удаленном сервере оно должно, если ты ре врайт написал внутри локейшна с проксированием. Вариан с другим локейшном тоже нормально. Фактически, тебе надо корневой локейшн обрисовать и всё.
  • Как настроить Nginx в качестве прокси?

    @xtreme
    У тебя в реврайте с robots.txt написана чушь, которая никогда не сработает. Не вижу реврайт для logo.png, из-за чего могу предположить, что ты его не туда вставлял, оттого он и не работал.

    По поводу robots.txt, который стал недоступен - быть такого не может, если в конфиге остался root и других, кроме adb, локейшнов не вписано.