После настройки нескольких доменов и некоторых поддоменов для работы под nginx мне удалось заставить несколько блоков сервера работать нормально. По-прежнему остаются грязные результаты, как показано ниже.
Это после настройки нескольких доменов с использованием certbot для создания сертификатов и редактирования файлов конфигурации nginx.
Глядя на файлы конфигурации nginx, становится очевидным, что это было бы намного чище, если бы исходный файл конфигурации по умолчанию не содержал закомментированных строк. Все еще видны несколько странных очевидных дубликатов серверных блоков для доменов в конфигурационном файле по умолчанию.
Я использую статические файлы, обслуживаемые nginx для domain.tld и www.domain.tld, а nodejs обслуживает blah.domain.tld, хотя в будущем это сочетание может измениться.
Итак, несколько быстрых вопросов о хорошей / плохой практике. - один сертификат для покрытия domain.tld, www.domain.tld и blah.domain.tld? - должен ли / etc / nginx / sites-available / default исключать все ссылки на серверные блоки для различных доменов, настроенных в /etc/nginx/sites-available/domain.tld? - похоже, что certbot редактирует / etc / nginx / sites-available / default, чтобы добавить ссылки для различных конфигураций домена. Я не хочу редактировать какие-либо файлы конфигурации, редактируемые certbot, но хаотичный беспорядок дубликатов указывает на то, что очистку можно выполнить.
также: какие могут быть подозрительные символы?
sudo nginx -t
nginx: [warn] server name "blah.domain.tld/" has suspicious symbols in /etc/nginx/sites-enabled/blah.domain.tld:41
nginx: [warn] conflicting server name "www.domain.tld" on [::]:443, ignored
nginx: [warn] conflicting server name "blah.domain.tld" on [::]:443, ignored
nginx: [warn] conflicting server name "www.domain.tld" on 0.0.0.0:443, ignored
nginx: [warn] conflicting server name "blah.domain.tld" on 0.0.0.0:443, ignored
nginx: [warn] conflicting server name "www.domain.tld" on 0.0.0.0:80, ignored
nginx: [warn] conflicting server name "blah.domain.tld" on 0.0.0.0:80, ignored
nginx: [warn] conflicting server name "www.domain.tld" on [::]:80, ignored
nginx: [warn] conflicting server name "blah.domain.tld" on [::]:80, ignored
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Следующий блок
ubuntu@blah:/etc/nginx/sites-available$ grep -rn ' domain.tld' /etc/nginx/sites-available/
/etc/nginx/sites-available/domain.tld:39: server_name domain.tld;
/etc/nginx/sites-available/domain.tld:96: if ($host = domain.tld) {
/etc/nginx/sites-available/domain.tld:104: server_name domain.tld;
Следующий блок
ubuntu@blah:/etc/nginx/sites-available$ grep -rn ' www.domain.tld' /etc/nginx/sites-available/
/etc/nginx/sites-available/blah.domain.tld:110: server_name www.domain.tld; # managed by Certbot
/etc/nginx/sites-available/blah.domain.tld:148: if ($host = www.domain.tld) {
/etc/nginx/sites-available/blah.domain.tld:155: server_name www.domain.tld;
/etc/nginx/sites-available/default:110: server_name www.domain.tld; # managed by Certbot
/etc/nginx/sites-available/default:148: if ($host = www.domain.tld) {
/etc/nginx/sites-available/default:155: server_name www.domain.tld;
Следующий блок
ubuntu@blah:/etc/nginx/sites-available$ grep -rn ' blah.domain.tld' /etc/nginx/sites-available/
/etc/nginx/sites-available/blah.domain.tld:41: server_name blah.domain.tld/;
/etc/nginx/sites-available/blah.domain.tld:182: server_name blah.domain.tld; # managed by Certbot
/etc/nginx/sites-available/blah.domain.tld:219: if ($host = blah.domain.tld) {
/etc/nginx/sites-available/blah.domain.tld:226: server_name blah.domain.tld;
/etc/nginx/sites-available/default:182: server_name blah.domain.tld; # managed by Certbot
/etc/nginx/sites-available/default:219:
if ($host = blah.domain.tld) {
/etc/nginx/sites-available/default:226: server_name blah.domain.tld;
извиняюсь за беспорядочный вопрос и благодарим за первые ответы, после сна исправление стало очевидным.
копия теперь работающего / etc / nginx / sites-available / default ниже. очевидно, это должно быть разделено на default, domain.tld и subdomain.domain.tld для лучшей практики и очистки символических ссылок.
# Default server configuration
#
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html;
server_name _;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
}
server {
root /var/www/domain.tld/html;
index index.html;
server_name www.domain.tld domain.tld; # managed by Certbot
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
listen [::]:443 ssl; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/domain.tld/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/domain.tld/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
#redirect from http to https for www.domain.tld
server {
if ($host = www.domain.tld) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80 ;
listen [::]:80 ;
server_name www.domain.tld;
return 404; # managed by Certbot
}
#redirect from http to https for domain.tld
server {
if ($host = domain.tld) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80 ;
listen [::]:80 ;
server_name domain.tld;
return 404; # managed by Certbot
}
server {
root /var/www/subdomain.domain.tld/html;
index index.html;
server_name subdomain.domain.tld; # managed by Certbot
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
#try_files $uri $uri/ =404;
proxy_pass http://localhost:4000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
listen [::]:443 ssl; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/domain.tld/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/domain.tld/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = subdomain.domain.tld) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80 ;
listen [::]:80 ;
server_name subdomain.domain.tld;
return 404; # managed by Certbot
}
Основная проблема заключается в том, что certbot по умолчанию дублирует серверные блоки, когда добавляются сертификаты для поддоменов, когда были созданы оригинальные сертификаты для домена.
Исправление заключалось в удалении отдельных файлов конфигурации сервера, очистке всех блоков сервера по умолчанию, пока они не заработали.
Проблемы с «конфликтующим именем сервера», вероятно, возникают из-за того, что вы настроили 2 разных серверных блока для прослушивания одного и того же uri. Один для ipv6 и один для ipv4
Я думаю, вам следует сделать 1 серверный блок, который одновременно прослушивает и ipv4, и ipv6.