Collectives™ on Stack Overflow
Find centralized, trusted content and collaborate around the technologies you use most.
Learn more about Collectives
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
Learn more about Teams
I'm working with an angular 2 app, nginx and docker. Everytime I'm reloading a page with /site it gives me a 404. My server block looks like this right now:
server {
listen 0.0.0.0:80;
listen [::]:80;
root /var/www/project/html;
index index.html;
server_name project.com;
location / {
try_files $uri $uri/ /index.html;
I have tried a lot, and have seen ALL other stackoverflow questions and have tried every possibility. But nothing works. Can someone please help?
UPDATE:
The whole nginx.conf:
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
the sites-enabled/default:
server {
listen 0.0.0.0:80;
listen [::]:80;
root /var/www/project/html;
index index.html;
server_name project.com;
location / {
try_files $uri $uri/ /index.html;
And the Dockerfile:
FROM nginx
COPY ./docker/sites-enabled /etc/nginx/sites-enabled
COPY ./docker/nginx.conf /etc/nginx/nginx.conf
COPY ./dist /var/www/project/html
COPY ./dist /usr/share/nginx/html
EXPOSE 80
–
–
–
–
In your nginx.conf, you are loading additional configs from two locations:
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
The second one loads your sites.enabled/default
config with the server name project.com
.
The first one, though, loads the default config default.conf
which is part of the nginx docker image per default. That config looks similar to
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
So if you try to access your site with localhost
, your sites-enabled/default
is never used (since you specified the server_name project.com
and that doesn't match with localhost
). Instead the request runs in the default.conf
since there the server_name is localhost
.
And in the default.conf
the location part is:
location / {
root /usr/share/nginx/html;
index index.html index.htm;
That means, if you just go to localhost
, the index.html
is served and everything works as expected. But as soon as you try accessing localhost/something
, Nginx is trying to find the file/directory /usr/share/nginx/html/something
which doesn't exist (-> 404).
So you have to options:
Remove include /etc/nginx/conf.d/*.conf;
from your nginx.conf (or delete the default.conf
) and change the server_name in your sites-enabled/default
to localhost
. Then your request will run into your config.
Add the try_files $uri $uri/ /index.html;
to the location in the default.conf
like you have it in your sites-enabled/default
.
I would recommend the first solution, do not include the default.conf
and change your server_name
to localhost
in your sites-enabled/config
. If you later need your real domain, you can still use regex to match for either localhost or your domain.
–
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.