Edit: Read this, first:
Apart from the accepted answer, these errors occur when nginx is started without systemd. Kill nginx: ps -ax | grep nginx
→ find the nginx master pid → kill ###
; run nginx with systemd: systemctl start nginx
.
If systemctl is not used to start nginx, systemctl stop nginx doesn’t seem to work (at least on my server); so, systemctl restart nginx gives this error when it tries to start nginx a second time.
About my setup:
I’m on Debian 10, Buster, with a live server. I have tested both domain names, and they broadcast by themselves using these config files, but they do not broadcast when both config files are active.
What I’m trying to accomplish:
How do I set up two websites on a single ip address using nginx?
Error message(s):
nginx: [emerg] a duplicate default server for 0.0.0.0:80 in /etc/nginx/sites-enabled/example.com:22
line 2.
nginx: [emerg] a duplicate default server for 0.0.0.0:443 in /etc/nginx/sites-enabled/example.com:22
line 2. default_server
is used on port 443.
nginx: [emerg] duplicate listen options for [::]:443 in /etc/nginx/sites-enabled/example.com:23
line 3. default_server
tried as http2
in one file and port 443 is used.
nginx: [emerg] duplicate listen options for [::]:80 in /etc/nginx/sites-enabled/example.com:23
line 3. default_server
tried as http2
in one file.
nginx: [emerg] invalid parameter "example.com" in /etc/nginx/sites-enabled/example.com:23
line 3: default_server
tried as example.com
Config files (comments stripped):
There are two of these files (code seen below). My config files are exactly as-seen in the code block below with only one difference: in both files, example.com
is a real, unique domain name that I own.
My config files live in /etc/nginx/sites-available
, and they are symlinked to /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;
}
}
Primary dissonance:
Another stack question says to rewrite these lines or comment one of them out. The rewrites either do not resolve the error or result in a situation where files are not publicly served (example.com goes nowhere).
Summary:
This question seems to be about line 2, line 3, or line 2 and 3.
Essentially, all of the leading how-to’s either expressly tell the reader to use the code above -or- they don’t mention these lines.
4
Answers
As the error message suggests, you can’t have two default listeners on the same IP address and port. Remove
default_server
from thelisten
declarations in one or both of your server blocks.When you specify
default_server
flag on alisten
directive, nginx will use thatserver
block to serve any request where HTTPHost
header does not match theserver_name
in any other server blocks (or the request missingHost
header at all). You can usedefault_server
flag on any particular IP:port combination given as parameter oflisten
directive only once. But you can use this flag several times on different IP:port combinations.Some examples, assuming your server have several network interfaces:
Working example:
Typically, when I need to serve several sites on the same server, I use the following configuration (of course this is simplified, nowadays we typically use HTTPS with
http://example.com
tohttps://example.com
redirection):Site 1 config file
Site 2 config file
Default server config file
Because of
default_server
flag onlisten
directive third server block is used when the request’sHost
header doesn’t contain one of my sites names (or the request does not haveHost
header at all). I don’t expect visitors that doesn’t know what site they are visiting (these are typically port scanners, vulnerability searchers etc.), so I use special nginx 444 code (close connection without any response) for them.You can’t run two applications on the same address with the same port.
What you need to do is just change port of your application one with 80 and other application with some other port say 3000.
If you want your application to run only with 80 port than just remove the default file from
/etc/nginx/sites-available/default
and optionally also from
/etc/nginx/sites-enabled/default
You can run
sudo rm -rf /etc/nginx/sites-available/default
sudo rm -rf /etc/nginx/sites-enabled/default
Now you will be able to run one of your application on port 80
I came to this issue when I config three host name on one IP.
I use a free ssl cercificate which can only sign on one hostname. So I apply three ssl certificates.
When I use
nginx -t
to test the config file, it showsI fixed it by remove the
backlog=50000
from the example3.com