I want to connect to my nextcloud server via https, so I set up an Nginx server to handle it. Nextcloud and Nginx both run in docker. Https works, but when I try to connect I get "502 Bad Gateway". I can also access nextcloud over 192.168.0.28:7070, so its running.
cloud.conf
upstream cloud {
server localhost:7070;
}
server {
listen 443 ssl;
server_name 192.168.0.28;
access_log /etc/nginx/logs/cloud.access.log;
error_log /etc/nginx/logs/cloud.error.log;
include common.conf;
include /etc/nginx/ssl.conf;
location / {
proxy_pass http://cloud;
include common_location.conf;
}
}
error.log
2020/11/27 11:41:26 [error] 210#210: *114 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.0.178, server: 192.168.0.28, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:7070/", host: "192.168.0.28"
2020/11/27 11:41:26 [error] 210#210: *114 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.0.178, server: 192.168.0.28, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:7070/", host: "192.168.0.28"
cloud.yml
version: '2'
volumes:
cloud:
db:
services:
db:
container_name: cloud_database
hostname: cloud_database
image: mariadb
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
restart: "unless-stopped"
volumes:
- db:/var/lib/mysql
- /etc/localtime:/etc/localtime:ro
environment:
- MYSQL_ROOT_PASSWORD= password
- MYSQL_PASSWORD= password
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
app:
container_name: cloud
hostname: cloud
image: nextcloud
links:
- db
volumes:
- /var/docker/cloud:/var/www/html
- /etc/localtime:/etc/localtime:ro
restart: "unless-stopped"
ports:
- 7070:80
Related
I'm trying to build a FastAPI app in docker, I find the site comes to a '502-Bad Gate Way' error and nginx log shows:
nginx_1 | 2020/12/21 18:23:13 [error] 29#29: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.27.0.1, server: , request: "GET /user HTTP/1.1", upstream: "http://172.27.0.3:8000/user", host: "localhost:8080"
Here is my docker-compose.yaml file:
version: '3.7'
services:
fastapi:
build: ./api
command: uvicorn main:app --reload --host 0.0.0.0 --port 8000
volumes:
- ./fastapi/:/fastapi/
ports:
- 8000:8000
depends_on:
- db
db:
image: mongo:latest
container_name: mongo4
ports:
- "27017:27017"
volumes:
- "./data/mongo/data:/data/db"
nginx:
image: nginx:latest
ports:
- "8080:8080"
volumes:
- ./nginx_config.conf:/etc/nginx/conf.d/default.conf
depends_on:
- fastapi
Nginx config file:
server {
listen 8080;
location /user {
proxy_pass http://fastapi:8000/user;
}
}
Thanks for help.
I'm getting this failed to connect issues when it comes to communicating with other docker containers e.g Java server end.
This is the issue I'm getting
nginx_1 | 2019/12/14 17:39:47 [error] 6#6: *2 connect() failed (111:
Connection refused) while connecting to upstream, client: 172.19.0.1,
server: , request: "GET /api/cards HTTP/1.1", upstream:
"http://172.19.0.4:80/api/cards", host: "localhost", referrer:
"http://localhost/"
Here is my Docker-Compose configuration (docker-compose.development.yml)
version: '3'
services:
auth:
build:
context: ./auth
dockerfile: dev.Dockerfile
volumes:
- ./auth:/var/app
- ~/.gradle/:/root/.gradle/
client:
build:
context: ./client
dockerfile: dev.Dockerfile
volumes:
- ./client:/var/app/
- /var/app/node_modules
server:
build:
context: ./server
dockerfile: dev.Dockerfile
volumes:
- ./server:/var/app/
- ~/.gradle/:/root/.gradle/
nginx:
image: nginx
volumes:
- ./server.dev.conf:/etc/nginx/conf.d/default.conf
ports:
- "80:80"
depends_on:
- auth
- client
- server
Here is my nginx docker configuration (server.dev.conf)
server {
listen 80;
location /login/ {
proxy_pass http://auth:80/login/;
}
location /api/ {
proxy_pass http://server:80/api/;
}
location /resource/ {
proxy_pass http://server:80/resource/;
}
location / {
proxy_pass http://client:80;
rewrite ^/home/.*$ / last;
}
}
Remind you this is for our development hosted locally. The production version uses SSL
Heyo!
Update: I figured it out and added my answer.
I'm currently in the process of learning docker and I've written a docker-compose file that should launch nginx, gitea, nextcloud and route them all via domain name as a reverse proxy.
All is going well except for with nextcloud. I can access it via localhost:3001 but not via the nginx reverse proxy. All is well with gitea, it works both ways.
The error I'm getting is:
nginx_proxy | 2018/08/10 00:17:34 [error] 8#8: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.19.0.1, server: cloud.example.ca, request: "GET / HTTP/1.1", upstream: "http://172.19.0.4:3001/", host: "cloud.example.ca"
docker-compose.yml:
version: '3.1'
services:
nginx:
container_name: nginx_proxy
image: nginx:latest
restart: always
volumes:
// Here I'm swapping out my default.conf for the container's by mounting my
directory over theirs.
- ./nginx-conf:/etc/nginx/conf.d
ports:
- 80:80
- 443:443
networks:
- proxy
nextcloud_db:
container_name: nextcloud_db
image: mariadb:latest
restart: always
volumes:
- nextcloud_db:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/cloud_db_root
MYSQL_PASSWORD_FILE: /run/secrets/cloud_db_pass
MYSQL_DATABASE: devcloud
MYSQL_USER: devcloud
secrets:
- cloud_db_root
- cloud_db_pass
networks:
- database
gitea_db:
container_name: gitea_db
image: mariadb:latest
restart: always
volumes:
- gitea_db:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/cloud_db_root
MYSQL_PASSWORD_FILE: /run/secrets/cloud_db_pass
MYSQL_DATABASE: gitea
MYSQL_USER: gitea
secrets:
- cloud_db_root
- cloud_db_pass
networks:
- database
nextcloud:
image: nextcloud
container_name: nextcloud
ports:
- 3001:80
volumes:
- nextcloud:/var/www/html
restart: always
networks:
- proxy
- database
gitea:
container_name: gitea
image: gitea/gitea:latest
environment:
- USER_UID=1000
- USER_GID=1000
restart: always
volumes:
- gitea:/data
ports:
- 3000:3000
- 22:22
networks:
- proxy
- database
volumes:
nextcloud:
nextcloud_db:
gitea:
gitea_db:
networks:
proxy:
database:
secrets:
cloud_db_pass:
file: cloud_db_pass.txt
cloud_db_root:
file: cloud_db_root.txt
My default.conf that gets mounted into /etc/nginx/conf.d/default.conf
upstream nextcloud {
server nextcloud:3001;
}
upstream gitea {
server gitea:3000;
}
server {
listen 80;
listen [::]:80;
server_name cloud.example.ca;
location / {
proxy_pass http://nextcloud;
}
}
server {
listen 80;
listen [::]:80;
server_name git.example.ca;
location / {
proxy_pass http://gitea;
}
}
I of course have my hosts file setup to route the domains to localhost. I've done a bit of googling but nothing I've found so far seems to align with what I'm running into. Thanks in advance!
Long story short, one does not simply reverse proxy to port 80 with nextcloud. It's just not allowed. I have it deployed and working great with a certificate over 443! :)
While experimenting with docker-compose, I'm running into some issues with NGINX and the dns. The error is the regular "connection refused while connecting to upstream" in NGINX. I think the problem arises due to the port numbers.
Examples online like this one run the NGINX on port 80, which doesn't cause the issue.
The docker-compose.yml:
version: '3'
services:
http-server:
networks:
- mynetwork
image: nginx_image
ports:
- 8080:8080
depends_on:
- frontend
- rest_api
frontend:
networks:
- mynetwork
image: frontend_image
ports:
- 8001:8001
rest_api:
networks:
- mynetwork
image: rest_api_image
ports:
- 8000:8000
networks:
mynetwork:
driver: bridge
nginx.conf for nginx_image has this block:
server {
listen 8080;
location /static/js/ {
proxy_pass http://frontend;
}
location /static/css/ {
proxy_pass http://frontend;
}
location /static/ {
proxy_pass http://rest_api;
}
location / {
proxy_pass http://frontend;
}
location /rest_api/ {
proxy_pass http://rest_api;
}
}
Now, both the frontend and api are called over port 80, while it should be 8001 and 8000.
What am I missing? I would expect docker-compose to make the port mapping automatically.
Thanks in advance!
Kind regards,
DA
EDIT1: here's the error (including the hostname suggestion)
EDIT2: updated the question
http-server_1 | 2018/06/04 14:47:50 [error] 14#14: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.18.0.1, server: , request: "GET /rest_api/admin/ HTTP/1.1", upstream: "http://172.18.0.2:80/rest_api/admin/", host: "localhost:8080"
you have to specify hostnames:
frontend:
image: frontend_image
hostname: frontend
ports:
- 8001:8001
rest_api:
hostname: rest_api
I have a docker setup with the following
rails api backend
mysql db
redis db
node/react frontend (webpack)
nginx serving the frontend
(the rails backend is currently being served through the builtin puma server - I think I will move it to the same nginx server runing the node app)
My problem is that the frontend will request stuff on the backend, but this does not work.
I have set up a proxy on nginx as follows:
#nginx.conf
server {
listen 8080;
# Always serve index.html for any request
location / {
# Set path
root /wwwroot/;
try_files $uri /index.html;
}
location /api/ {
proxy_pass http://127.0.0.1:3000;
}
}
But when I when I initiate an api call I get the following in the nginx log:
nginx-server | 2017/05/13 20:56:08 [error] 5#5: *19 connect() failed (111: Connection refused) while connecting to upstream, client: 172.21.0.1, server: , request: "POST /api/authenticate HTTP/1.1", upstream: "http://127.0.0.1:3000/api/authenticate", host: "localhost:8080", referrer: "http://localhost:8080/"
nginx-server | 172.21.0.1 - - [13/May/2017:20:56:08 +0000] "POST /api/authenticate HTTP/1.1" 502 575 "http://localhost:8080/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36" "-"
And I do not see any thing hitting the puma server.
I am not sure where I should be looking. Is this a problem with my docker-compose file or is it a nginx issue (or both).
I have included my docker-compose.yml below:
version: '2'
services:
nginx:
build:
context: .
dockerfile: docker.nginx
image: pt-nginx
container_name: nginx-server
ports:
- "8080:8080"
volumes:
- wwwroot:/wwwroot
webpack:
build:
context: ./frontend
dockerfile: docker.webpack
image: pt-webpack
container_name: react-frontend
ports:
- "35729:35729"
volumes:
- ./frontend:/app
- /app/node_modules
- wwwroot:/wwwroot
db:
build:
context: ./backend
dockerfile: docker.mysql
image: pt-mysql
container_name: mysql-server
env_file: ./backend/.env
ports:
- "3306:3306"
volumes:
- ./sql/data/:/var/lib/mysql
redis:
build:
context: ./backend
dockerfile: docker.redis
image: pt-redis
container_name: redis-server
app:
build:
context: ./backend
dockerfile: docker.rails
image: pt-rails
container_name: rails-server
command: >
sh -c '
rake resque:start_workers;
bundle exec rails s -p 3000 -b 0.0.0.0;
'
env_file: ./backend/.env
volumes:
- ./backend:/usr/src/app
- /Users/mh/Pictures/ROR_PT/phototank:/Users/martinhinge/Pictures/ROR_PT/phototank
ports:
- "3000:3000"
expose:
- "3000"
depends_on:
- db
- redis
volumes:
wwwroot:
driver: local
The problem is that your nginx service is requesting upstream of localhost (127.0.0.1). But the application is in another container (with another IP). You can reference the rails application by DNS at appsince they are both in a default network. The upstream in nginx configuration would look something like proxy_pass http://app:3000; instead.
Read more about the networking at https://docs.docker.com/compose/networking/, specifically:
Within the web container, your connection string to db would look like postgres://db:5432, and from the host machine, the connection string would look like postgres://{DOCKER_IP}:8001.