Nginx ssl как настроить второй сайт?

Всем привет. На серваке крутится https-сайт, хочу добавить ещё один, но не получается настроить второй конфиг так, чтобы nginx нормально стартанул после добавления нового сайта. Испробовала разные мануалы, пока безрезультатно. Если настроить 2-й конфиг без ssl (80), то всё работает. Оба сайта на одном IP, сертификаты успешно генерены с помощью Let’s Encrypt. Может, кто подскажет дельное руководство на русском или английском? В интернете много устаревшей инфы

debian 8
nginx 1.6.2

Погоди. Давай по порядку. Скинь конфиг первого сайта и второго, а так же ошибку которую выдает nginx при перезапуске.

$ systemctl status nginx.service
● nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled)
   Active: failed (Result: exit-code) since Пт 2018-03-16 09:36:12 +06; 16s ago
  Process: 27780 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=exited, status=0/SUCCESS)
  Process: 5443 ExecReload=/usr/sbin/nginx -g daemon on; master_process on; -s reload (code=exited, status=0/SUCCESS)
  Process: 2329 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
  Process: 27783 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=1/FAILURE)
 Main PID: 2332 (code=exited, status=0/SUCCESS)

Если отключить приведённый ниже конфиг второго сайта или настроить его только на 80 порт, то всё работает


battles.txt (2.37 KB)

Конфиг основного сайта


default.txt (2.24 KB)

Проблема ещё в том, что при проверке второго сайта на https://www.ssllabs.com/ssltest он пишет ошибку, что типа на этом IP уже висит сайт (первый). Но при отключенном втором конфиге (когда nginx нормально стартовал) в браузере адрес второго сайта с https-протоколом запускается нормально, правда, отображает главную страницу первого сайта

так в твоем конфиге только пример одного сайта, нужны оба конфига))

Вот пример из рабочего конфига:

server {
    listen 443;
    server_name server.com;

    location = /favicon.ico { access_log off; log_not_found off; }
.....
   ssl on;
   ssl_certificate /path/to/ssl/cert.pem;
   ssl_certificate_key /path/to/ssl/ssl/cert.key;

   ssl_ciphers E......;
   ssl_prefer_server_ciphers on;

   ssl_protocols TLS.....;
   add_header Strict-Transport-Security ....;

Спасибо, заработало. Всё сделала как у вас, убрала лишние ssl-блоки и исправила ошибки вылезшие через sudo nginx -t
Тест на https://www.ssllabs.com/ssltest тоже теперь проходит нормально
Можно теперь и другие проекты перевести на https, двое ещё на http болтаются, и гугл на них жалуется иногда

У меня к вам ещё вопрос по теме: основной сайт на указанном IP работает отлично, а вот второй сайт на этом же IP начал пестрить ошибками в логах. Дело в том, что у них есть похожие адреса, например:

https://site.one/event/spitc
https://site.two/event/46542

И вот в логах второго сайта появляются 404 сообщения типа страница /event/spitc не найдена. Т.е. как будто обращение к первому сайту идёт по айпишнику, и на этот запрос пытается ответить второй сайт…

Как исправить эту проблему?

Я уж подумала, что это была плохая идея размещать два сайта на одном IP, однако народ говорит, что в техническом плане это не проблема. Как же тогда избавиться от перекрёстных запросов? Можно, конечно, на втором сайте настроить URL’ы так, чтобы не было идентичных адресов, но решит ли это проблему?

Запретите вообще обращение по ip-адресу. Заодно закроете уязвимость - подверженность атаке anti dns pinning.

На 80 порту закрыла вот так:

server {
        listen 000.000.000.000:80 default_server;
        server_name _;
        return 444;
}

а с 443 как настроить? проблема пока осталась, видимо, потому, что оба сайта на https работают

server {
  listen 443 ssl default_server;
 
  ssl_certificate /blahblah.pem;
  ssl_certificate_key /blahblah.pem;
  ssl_trusted_certificate /blahblah.pem;

  location / {
    deny all;
  }
}

Генерите рандомный серт и подсовываете его. Обратившись, клиент сначала получит предупреждение о невалидности сертификата и только после этого - 403 ошибку.

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

Недавно мне стало интересно, можно ли видеть на какой сайт идет человек, если используется TLS. Наткнулся на отсыл к RFC 3546

3.1. Server Name Indication

   [TLS] does not provide a mechanism for a client to tell a server the
   name of the server it is contacting.  It may be desirable for clients
   to provide this information to facilitate secure connections to
   servers that host multiple 'virtual' servers at a single underlying
   network address.
In order to provide the server name, clients MAY include an extension
   of type "server_name" in the (extended) client hello.  The
   "extension_data" field of this extension SHALL contain
   "ServerNameList" where... 

Т.е. клиент может, но не обязан посылать имя сайта, на который он коннектится. Вначале происходит установка защитного соединения, а потом по защищенному соединению идет get запрос на сайт. Правда это TLS1.0. Попробовал посмотреть в новых, но явно там такого подпункта не написано. Возможно это будет полезно в понимании причин поведения, которые наблюдает ТС. Но для меня пока не вполне ясно, есть ли гарантированный метод определять к какому сайту идет TLS соединение.

Ну вот и ответ из оф документации
http://nginx.org/ru/docs/http/configuring_https_servers.html#name_based_https_servers
оно никак не может определить к какому сайту коннект и предлагает дефултный сертификат.
Можно включить расширение SNI, но если клиент не укажет сайт, то с этим ничего сделать нельзя будет.

Ну мне вот интересно, почему всё же имеют место перекрёстные ссылки. У меня весь лог второго сайта заполнен такими ошибками. И, анализируя адреса, я могу точно сказать, что на втором сайте нигде на страницах нет подобных ссылок. А значит, ссылки идут с основного сайта - и видимо, они относительные, без указания домена. Таким образом вижу 2 варианта решения: либо вешать второй сайт на другой IP, либо делать все ссылки абсолютными. Иначе так и будут километровые логи, в которых сложно найти действительно важные ошибки

Сайты на разных доменах, за nginx’ом что-то есть php-fpm, Apache? По http все нормально работает? На самоподписанных сертификатах все работает?

Сайты, конечно, на разных доменах
php-fpm есть, апача нет

Тогда не понимаю в чем проблема, стандартная кофигурация:

  • Каждый сайт в отдельной папке
  • Для каждого сайта отдельный nginx конфиг
  • Для каждого сайта свой сертификат

Если это разные сайты, то какие перекрестные ссылки здесь имеются в виду?

Пример 443 конфига:

...
server {
    listen 443;
    server_name myWebServer;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        ....;
    }

   location /media/ {
        ....;
    }

    location / {
        ....
        proxy_pass ...php-fpm-project.sock;
    }
ssl on;
ssl_certificate /etc/nginx/ssl/comodo.pem;
ssl_certificate_key /etc/nginx/ssl/comodo.key;

...

Прошу пардона, но

listen 443 ssl http2;
listen [::]:443 ssl http2;