a nginx não ouve a porta 80 duas vezes?

Editar: leia isto, primeiro:

para além da resposta aceite, estes erros ocorrem quando a nginx é iniciada Sem systemd. Kill nginx: ps -ax | grep nginx → find the nginx master pidkill ###; Executar nginx com systemd: systemctl start nginx.

Se o systemctl não for usado para iniciar o nginx, o systemctl parar o nginx não parece funcionar (pelo menos no meu servidor); por isso, o systemctl reiniciar o nginx dá este erro quando tenta iniciar o nginx um segundo tempo.

Sobre a minha configuração. Estou no Debian 10, Buster, com um servidor ao vivo. Eu testei ambos os nomes de domínio, e eles transmitem por si mesmos usando esses arquivos de configuração, mas eles não transmitem quando ambos os arquivos de configuração estão ativos.

O que estou a tentar fazer ... Como posso criar dois sítios Web num único endereço ip usando a nginx?

mensagem(s) de erro:

nginx: [emerg] a duplicate default server for 0.0.0.0:80 in /etc/nginx/sites-enabled/example.com:22 linha 2.

nginx: [emerg] a duplicate default server for 0.0.0.0:443 in /etc/nginx/sites-enabled/example.com:22 linha 2. default_server é utilizado no Porto 443.

nginx: [emerg] duplicate listen options for [::]:443 in /etc/nginx/sites-enabled/example.com:23 linha 3. default_server tentado como http2 num ficheiro e é usada a porta 443.

nginx: [emerg] duplicate listen options for [::]:80 in /etc/nginx/sites-enabled/example.com:23 linha 3. default_server tentei como http2 num ficheiro.

nginx: [emerg] invalid parameter "example.com" in /etc/nginx/sites-enabled/example.com:23 linha 3: default_server tentou como example.com

ficheiros de Configuração (Sem comentários):

existem dois desses arquivos (código visto abaixo). Meus arquivos de configuração são exatamente como visto no bloco de código abaixo com apenas uma diferença: em ambos os arquivos, example.com é um nome de domínio real e único que eu possuo.

A Minha os ficheiros de configuração vivem em /etc/nginx/sites-available, e estão ligados a /etc/nginx/sites-enabled.

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /var/www/example.com; #example.com is different in both files.
    index index.html index.htm index.nginx-debian.html;

    server_name example.com www.example.com; #example.com is different in both files.

    location / {
        try_files $uri $uri/ =404;
    }
}

dissonância Primária:

outra questão de pilha diz para reescrever estas linhas ou comentar uma delas. As reescritas ou não resolvem o erro ou resultam em uma situação em que os arquivos não são servidos publicamente (example.com não vai a lado nenhum).

resumo:

esta pergunta parece ser sobre a linha 2, linha 3, ou linha 2 e 3.

Essencialmente, todos os principais how-to's ou diz expressamente ao leitor para usar o código acima - ou - eles não mencionam estas linhas.

Author: Wolfpack'08, 2020-02-23

4 answers

Quando indicar a opção default_server numa directiva listen, o nginx irá usar esse server bloco para servir qualquer pedido em que o cabeçalho HTTP Host não corresponda ao server_name em qualquer outro bloco do servidor (ou o cabeçalho Host em falta). Você pode usar a opção default_server em qualquer IP: combinação de portos dada como parâmetro da Directiva listen apenas uma vez. Mas você pode usar esta bandeira várias vezes em diferentes IP:combinações de portas.

Alguns exemplos, assumindo que o seu servidor tem várias redes interfaces:

server {
    listen 1.2.3.4:80 default_server; # this will be default server block for any request coming to 1.2.3.4 IP address on port 80
    ...
}
server {
    listen 5.6.7.8:80 default_server; # this will be default server block for any request coming to 5.6.7.8 IP address on port 80
    ...
}
server {
    listen 80 default_server; # this will be default server block for any request coming to any other IP address (except 1.2.3.4 and 5.6.7.8) on port 80
    ...
}

Exemplo de trabalho:

Normalmente, quando preciso de servir vários sites no mesmo servidor, uso a seguinte configuração (claro que isto é simplificado, hoje em dia normalmente usamos HTTPS com http://example.com para https://example.com redireccionamento):

Ficheiro de configuração do 'Site 1'

server {
    listen 80;
    server_name example1.com www.example1.com;
    ...
}

Ficheiro de configuração do 'Site 2'

server {
    listen 80;
    server_name example2.com www.example2.com;
    ...
}

Ficheiro de configuração do servidor por omissão

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

Por causa da bandeira default_server na listen directiva, o terceiro bloco do servidor é usado quando o cabeçalho Host do request não contém nenhum dos nomes dos meus sites (ou o pedido não tem nenhum cabeçalho Host). Eu não espero visitantes que não saiba que site eles estão visitando (estes são tipicamente scanners portuários, buscadores de vulnerabilidade, etc.), então eu uso código especial nginx 444 (fechar conexão sem qualquer resposta) para eles.

 4
Author: Ivan Shatsky, 2020-09-22 02:31:50

Como a mensagem de erro sugere, não pode ter dois ouvintes predefinidos no mesmo endereço IP e Porto. Remover default_server das declarações listen num ou em ambos os blocos do seu servidor.

    listen 80;
    listen [::]:80 ipv6only=on;
 1
Author: Calum Halpin, 2020-02-23 13:56:10

Você não pode executar duas aplicações no mesmo endereço com o mesmo Porto.

O que você precisa fazer é apenas mudar o porto de sua aplicação um com 80 e outro aplicativo com algum outro porto digamos 3000.

Se quiser que a sua aplicação corra apenas com 80 portas do que apenas remover o ficheiro por omissão de

/etc/nginx/sites-available/default

E , opcionalmente, também de

/etc/nginx/sites-enabled/default

Podes correr

sudo rm -rf /etc/nginx/sites-available/default

sudo rm -rf /etc/nginx/sites-enabled/default

Agora você será capaz para executar uma das suas aplicações no porto 80

 1
Author: Parveen yadav, 2020-02-23 14:18:16
Cheguei a esta questão quando confino três nomes num IP.

Uso um certificado ssl gratuito que só pode assinar num nome de máquina. Por isso, aplico três certificados ssl.

server {
    listen      443 backlog=50000;
    server_name example1.com;
server {
    listen       443;
    server_name  example2.com;
server {
    listen       443  backlog=50000;
    server_name  example3.com;

Quando USO nginx -t para testar o ficheiro de configuração, ele mostra

Nginx: [emerg] duplicate listen options for 0. 0. 0. 0: 443 in /etc/nginx / conf.d / example1_ https.conf: 2

Nginx: ficheiro de configuração /etc/nginx / nginx.teste conf falhou

Eu arranjei-o por ... remover o backlog=50000 do example3.com
 1
Author: LF00, 2020-04-22 08:15:05