Ответы пользователя по тегу Nginx
  • Как настроить сервер для правильного обновления веб-приложения React?

    @MadridianFox
    Web-программист, многостаночник
    Кэшируйте отдаваемые ассеты. Тогда nginx сможет ответить на запрос старого файла даже после того как вы обновили содержимое папки.
    Ответ написан
    Комментировать
  • Как запустить php и nginx в одном контейнере?

    @MadridianFox
    Web-программист, многостаночник
    1) Запуск нескольких процессов в одном контейнере противоречит концепции докера. Докер сделан так, чтобы запускать один процесс (не считая дочерних процессов)

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

    Проще всего с загружаемыми файлами. Они в любом случае не должны храниться в контейнере и скорее всего это будет volume, который монтируется в оба контейнера.
    Взаимодействие между контейнерами по сети тоже штука не сложная, но зависит от способа запуска контейнера.
    Если контейнеры запущены через docker run в одной сети (поведение по умолчанию), то они видят друг друга по сети и могут использовать имя контейнера как dns имя.
    Если два контейнера запущены в рамках одного docker-compose.yml файла (это ещё называется docker compose project), то они тоже друг друга видят, но уже не по имени контейнера, а по имени сервиса (ключ под которым контейнер указан в секции services).
    Если приложение запускается в kubernetes, то там по умолчанию все контейнера pod'a имеют общий локалхост и могут обращаться к друг другу через 127.0.0.1.

    Всё это - поведение по умолчанию, которое можно изменить явно указывая какую сеть использовать, какой hostname должен быть у контейнера и т.д.

    Важно: nginx работает с dns в обход стандартных инструментов операционной системы. Если вы используете в директивах proxy_pass, fastcgi_pass доменное имя, а не ip адрес, вам нужно дополнительно указать в конфиге директиву resolver <dns-ip>;, где в качестве нужно указать ip адрес dns сервера.
    Для докера это обычно 127.0.0.11, для кубера это адрес внутреннего dns сервера.

    Раздавать статику можно по разному. Два концептуально разных способа:
    - собрать образ nginx в котором есть статика, тут можно либо наследовать образ как сделали это вы, либо копировать статику в чистый образ nginx, что несколько чище и красивее
    - убрать статику из образа вообще, выделив её в volume или cdn, но тут придётся при отгрузке сервиса актуализировать статику во внешнем хранилище

    2) если очень хочется запустить несколько процессов в контейнере, то нужно запустить один процесс, который запустит остальные. Есть такие программы - менеджеры процессов. Это может быть supervosord, pm2, runit и т.п.
    Это такая программа, основной задачей которой является запуск других программ. Обычно у неё есть свой файл конфигурации, в котором вы описываете какие программы запустить и как это сделать.
    Ещё раз повторю - докер придуман не для этого. Не стоит делать этот приём основным при работе с докером.
    Это костыль. Он иногда нужен, но очень редко.

    3) То что nginx отдаёт код index.php, это проблема не настройки контейнеров, а конфигурации nginx. Если бы проблема была только в контейнерах, то вы бы получили не код скрипта, а 502.
    Первое что бросается в глаза в вашем конфиге - это регулярка в локейшене для обработки php скриптов.
    Попробуйте сделать как здесь.
    Ответ написан
    Комментировать
  • Почему я не могу переназначить адрес nginx location?

    @MadridianFox
    Web-программист, многостаночник
    Nginx принимает запрос и проксирует его дальше на основании каких-то правил. Ответ он не преобразует. За ссылки отвечает приложение, т.е. tomcat. Вам нужно так написать код сайта, чтобы в нем была возможность настроить т.н. корень, от которого строятся ссылки.
    Ответ написан
    Комментировать
  • Почему не работает внутреняя авторизация на nginx ларавел?

    @MadridianFox
    Web-программист, многостаночник
    Не работает потому что nginx и веб-приложение используют один и тот же http заголовок для передачи данных авторизации. Универсального решения нет.
    Как вариант, если приложение и так закрыто своей авторизацией, то basic можно и не делать. Или можно изменить заголовок авторизации в веб-приложении. Или попытаться разнести бэк и фронт на разные домены, чтобы одно было закрыто бейсиком, а другое собственной авторизацией.
    Ответ написан
  • Как отдавать docker container с сервера по адресу домена?

    @MadridianFox
    Web-программист, многостаночник
    Домен привязывается не к контейнеру, а к ip адресу.
    Вы не уточнили где именно поднята эта виртуальная машина и с какой целью.

    Если у вас на компьютере для личного использования, то проще всего использовать nip.io или прописать соотвествие домена и ip адреса виртуальной машины в файле hosts.

    Если вы арендовали виртуальную машину у какого-то провайдера и хотите сделать её доступной для всех по домену, то нужно купить домен и в его настройках указать ip адрес виртуальной машины.
    Ну или использовать всё тот же nip.io если это общий сервис для малого круга лиц.

    UPD:

    чтобы по разным доменам открывались разные веб-приложения, вам необходим http прокси, который на основании домена, указанного в http запросе, будет проксировать этот запрос на тот или иной внутренний адрес.
    Обычно для этого устанавливают nginx, который сам слушает 80 и 443 порты.
    Все домены настраивают так, чтобы вели на адрес этого сервера.
    В конфиге nginx описывают какое приложение должно отвечать по определённому домену, примерно вот так:

    server {
        listen 80;
        server_name site-1.domain.com;
        location / {
            proxy_pass http://127.0.0.1:27073;
        }
    }
    server {
        listen 80;
        server_name site-2.domain.com;
        location / {
            proxy_pass http://127.0.0.1:12345;
        }
    }
    Ответ написан
    8 комментариев
  • Как открыть другой сайт не меняя текущий адрес при проксирование в nginx?

    @MadridianFox
    Web-программист, многостаночник
    Вообще poxy_pass делает ровно то, что вам нужно.
    Посмотрите что именно отвечает сервер, когда вы делаете запрос. Может быть такое, что ваш nginx правильно проксирует, но сервер гугла видит, что запросе что-то не так, и возвращает редирект, конечно же на свой домен, а не на ваш. В таком случае браузер сделает ещё один запрос и поменяет домен в адресной строке.

    Если это так, попробуйе добавить заголовок с хостом гугла при обращении к гуглу:
    proxy_pass https://google.com/;
    proxy_set_header Host google.com;
    Ответ написан
  • Как выполнить http-запрос между двумя сайтами в laradock?

    @MadridianFox
    Web-программист, многостаночник
    Конкретно про ларадок не скажу, но объясню как оно вообще работает.

    Когда контейнеры запускаются в одной сети, они доступны друг другу по доменам, которые равны названию контейнера. При запуске через docker-compose немного не так. Контейнеры видят друг друга по именам сервисов.
    Т.е. если у вас вот такой docker-compose.yml
    services:
       front:
          image: ....
       back:
           image: ....

    то фронт сможет обратиться к бэку по домену back, примерно вот так:
    file_get_contents("http://back:8080/path/to/file.txt");

    Ещё, если вы хотите чтобы сервисы обращались друг к другу по публичным доменам, а не по внутренним, можете задать в docker-compose.yml у контейнеров hostname.
    но в docker-compose.yml у контейнера можно задать его hostname,
    вот так:
    services:
       front:
          hostname: site1.ru
          image: ....
       back:
           hostname: site2.ru
           image: ....
    Ответ написан
    Комментировать
  • Как решить проблему nginx при сборке docker-compose?

    @MadridianFox
    Web-программист, многостаночник
    Попробуйте использовать директиву upstream. Она более лояльна к отсутствию целевого хоста на момент страта nginx.
    Ответ написан
    Комментировать
  • Могу ли я читать данные в Nginx?

    @MadridianFox
    Web-программист, многостаночник
    Можно, для этого есть конструкция map
    которая даже умеет подтягивать варианты из отдельного файла

    Однако это довольно статичный вариант, подходящий для случаев, когда вам достаточно один раз настроить и забыть.
    Если нужна интерактивность, то можно попытаться добавить её через модуль njs - он позволяет написать код на js, который устанавливает значение переменной.
    Однако этот довольно нетипичный вариант и с 99% случаев его использование это костыли и велосипеды.

    В случае, когда вам нужно проксирование на ддинамически формируемый список сервисов, посмотрите в сторону разного рода настраиваемых прокси и service discovery, например HAProxy или Consul.
    Ответ написан
    4 комментария
  • Как решить проблему запроса на сервер?

    @MadridianFox
    Web-программист, многостаночник
    CORS - это защита встроенная в браузер.
    Именно браузер блокирует запросы на другой домен, если не настроены заголовки CORS.
    Соотвественно, чтобы браузер пропускал запросы, вам необходимо настроить CORS на сервере.
    Ответ написан
    Комментировать
  • Nginx в режиме обратного прокси нужно сайта сдвинуть в?

    @MadridianFox
    Web-программист, многостаночник
    Как уже написали в комментарии - то где искать стили решает приложение и по хорошему надо в каждом бэке сделать пути для подгрузки статики настраиваемыми.

    Однако, если все бэки находятся на одной машине, можно подставить костыль.
    Вы можете создать особый location, даже несколько, которые будут искать запрошенный файл сначала в одной папке, потом в другой, потом в третьей.
    location ~* \.(css|js)$ {
        root /path/to/back1;
        try_files $uri @back2;
    }
    
    location @back2 {
       root /path/to/back2;
       try_files $uri @back3;
    }
    
    location @back3 {
       root /path/to/back3;
       try_files $uri =404;
    }


    Если один из бэков находится не на этой же машине, то можно его поставить в конец и делать на него проксирование:
    location @back3 {
       proxy_pass http://external-service.com;
    }


    Ещё, можно рассмотреть вариант с условиями, которые смотрят на загловки запроса, ну там referer какой-нибудь или origin, и в зависимости от этого проксируют на тот или иной бэк.
    Ответ написан
  • Редирект с nginx + upstream. Как?

    @MadridianFox
    Web-программист, многостаночник
    У вас основная секция server слушает 443, а новые правила редиректов вы вставили в server, который слушает 80 и предназначен для редиректов http -> https
    Кроме того, в www редиректе вы не меняете хост, т.е. даже если он отработает, то он вызовет бесконечный редирект.
    Ответ написан
    Комментировать
  • Нужен совет: корректна ли связка Nginx - Docker - Nginx (proxy)?

    @MadridianFox
    Web-программист, многостаночник
    В этом нет ничего криминального. Если вам надо именно так - делайте. Если видите способ упростить систему - упрощайте.
    Главное не забыть прокинуть реальный ip и схему в заголовке.

    Кстати, k8s например примерно так и работает. Там 80,443 порт слушает т.н. ингрес - обычно тот же nginx, конфиг которого задаётся через yml файл. И вот он принимает все запросы и в зависимости от настроек проксирует их на бэкэнды, в том числе и на внутренние nginx'ы.
    Ответ написан
    Комментировать
  • Кто нибудь делил приложение Node.JS на несколько частей?

    @MadridianFox
    Web-программист, многостаночник
    Годно
    Ответ написан
    Комментировать
  • Как сконфигурировать nginx для того чтобы он работал как http прокси?

    @MadridianFox
    Web-программист, многостаночник
    Чтобы nginx проксировал запросы другому серверу надо в папку /etc/nginc/conf.d/ добавить файл с расширением .conf в котором написано:
    server{
      listen 5556
      server_name _;
      location / {
        proxy_pass localhost:5555
      }
    }


    Но если можно сконфигугрировать вашу вещь, которая слушает localhost:5555 чтобы она слушала 0.0.0.0:5555 то она и сама станет доступной из локальной сети.
    Ответ написан
    Комментировать