Настройка nginx в качестве прокси между докер-контейнерами веб-сервисов
Я пытаюсь настроить сервер для размещения определенного веб-приложения. Я зарегистрировал домен (скажем, example.org), создал VPN через digitalocean и настроил DNS для example.org, чтобы он указывал на него, поэтому, если я запускаю простой веб-сервер, я получаю к нему доступ, открывая example.org в веб-браузер.
Я хочу использовать этот сервер для размещения файлового браузера ( https://filebrowser.org/). Если я просто запущу его с помощью команды docker по умолчанию, он сработает. Однако я хочу
- пусть он (и любые другие веб-сервисы) работает по протоколу HTTPS.
- сделайте его доступным на example.org/files. Это сделано для того, чтобы я мог использовать домен и для других целей.
Идея состоит в том, чтобы запустить nginx в одном докер-контейнере с опубликованными портами 80 и 443. Затем у меня есть certbot в другом месте, следуя этому руководству: https://mindsers.blog/post/https-using-nginx-certbot-docker/ . И, наконец, я хочу запустить файловый браузер в третьем контейнере докеров. Таким образом, извне должен быть доступен только nginx, и он обрабатывает всю маршрутизацию к другим сервисам. Если я правильно понимаю, мне нужно только настроить ssl-сертификаты для контейнера nginx, и он сможет внутренне взаимодействовать с обычным http. Мой текущий docker-compose.yaml:
version: '3'
services:
webserver:
image: nginx:latest
ports:
- 80:80
- 443:443
volumes:
- ./nginx/conf/:/etc/nginx/conf.d/:ro
- ./nginx/www/:/srv/www/:ro
- ./certbot/www:/var/www/certbot/:ro
- ./certbot/conf/:/etc/nginx/ssl:ro
certbot:
image: certbot/certbot:latest
volumes:
- ./certbot/www/:/var/www/certbot/:rw
- ./certbot/conf/:/etc/letsencrypt/:rw
filebrowser:
image: filebrowser/filebrowser:latest
volumes:
- ./filebrowser/files:/srv
- ./filebrowser/filebrowser.db:/filebrowser.db
- ./filebrowser/filebrowser.json:/.filebrowser.json
Посмотрев на этот ответ /questions/525286/obratnyij-proksi-server-nginx-ne-zagruzhaet-resursyi/525295#525295 , я настроил nginx со следующей конфигурацией:
server {
listen 80;
listen [::]:80;
server_name example.org www.example.org;
server_tokens off;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
return 301 https://example.org$request_uri;
}
}
server {
listen 443 default_server ssl;
listen [::]:443 ssl;
http2 on;
server_name example.org;
ssl_certificate /etc/nginx/ssl/live/example.org/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/live/example.org/privkey.pem;
location / {
root /srv/www/;
}
location /files {
return 302 /files/;
}
location /files/ {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_redirect off;
add_header Pragma "no-cache";
add_header Cache-Control "no-cache";
proxy_pass http://filebrowser:8080/;
sub_filter 'action="/' 'action="/files/';
sub_filter 'href="/' 'href="/files/';
sub_filter 'src="/' 'src="/files/';
sub_filter_once off;
}
}
И, наконец, конфигурация для файлового браузера:
{
"port": 8080,
"baseURL": "",
"address": "",
"log": "stdout",
"database": "/filebrowser.db",
"root": "/srv"
}
Когда я запускаю это, фиктивный файл index.html, который nginx обслуживает по адресу /, отображается при переходе на example.org. Когда я пытаюсь перейти к example.org/files, я получаю страницу входа в файловый браузер, но когда я ввожу имя пользователя и пароль (которые, как я знаю, верны), я получаю сообщение об ошибке «Неправильные учетные данные» и консоль от nginx показывает ошибку о невозможности найти конкретный файл. Полный результат от бегаdocker compose up
и попытка входа в систему:
[+] Running 4/4
✔ Network webservices_default Created 0.1s
✔ Container webservices-certbot-1 Created 0.1s
✔ Container webservices-filebrowser-1 Created 0.1s
✔ Container webservices-webserver-1 Created 0.1s
Attaching to webservices-certbot-1, webservices-filebrowser-1, webservices-webserver-1
webservices-filebrowser-1 | 2023/07/26 12:49:57 Using config file: /.filebrowser.json
webservices-filebrowser-1 | 2023/07/26 12:49:57 Listening on [::]:8080
webservices-webserver-1 | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
webservices-webserver-1 | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
webservices-webserver-1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
webservices-webserver-1 | 10-listen-on-ipv6-by-default.sh: info: can not modify /etc/nginx/conf.d/default.conf (read-only file system?)
webservices-webserver-1 | /docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh
webservices-webserver-1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
webservices-webserver-1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
webservices-webserver-1 | /docker-entrypoint.sh: Configuration complete; ready for start up
webservices-webserver-1 | 2023/07/26 12:49:57 [notice] 1#1: using the "epoll" event method
webservices-webserver-1 | 2023/07/26 12:49:57 [notice] 1#1: nginx/1.25.1
webservices-webserver-1 | 2023/07/26 12:49:57 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14)
webservices-webserver-1 | 2023/07/26 12:49:57 [notice] 1#1: OS: Linux 5.15.0-78-generic
webservices-webserver-1 | 2023/07/26 12:49:57 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
webservices-webserver-1 | 2023/07/26 12:49:57 [notice] 1#1: start worker processes
webservices-webserver-1 | 2023/07/26 12:49:57 [notice] 1#1: start worker process 21
webservices-certbot-1 | Saving debug log to /var/log/letsencrypt/letsencrypt.log
webservices-certbot-1 | Certbot doesn't know how to automatically configure the web server on this system. However, it can still get a certificate for you. Please run "certbot certonly" to do so. You'll need to manually configure your web server to use the resulting certificate.
webservices-certbot-1 exited with code 1
webservices-webserver-1 | 89.8.210.16 - - [26/Jul/2023:12:50:17 +0000] "GET /files HTTP/2.0" 302 145 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0" "-"
webservices-webserver-1 | 89.8.210.16 - - [26/Jul/2023:12:50:17 +0000] "GET /files/ HTTP/2.0" 200 4439 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0" "-"
webservices-webserver-1 | 2023/07/26 12:50:17 [warn] 21#21: *1 an upstream response is buffered to a temporary file /var/cache/nginx/proxy_temp/1/00/0000000001 while reading upstream, client: 89.8.210.16, server: example.org, request: "GET /files/static/js/chunk-vendors.0f8eac7b.js HTTP/2.0", upstream: "http://172.20.0.4:8080/static/js/chunk-vendors.0f8eac7b.js", host: "example.org", referrer: "https://example.org/files/"
webservices-webserver-1 | 2023/07/26 12:50:17 [warn] 21#21: *1 an upstream response is buffered to a temporary file /var/cache/nginx/proxy_temp/2/00/0000000002 while reading upstream, client: 89.8.210.16, server: example.org, request: "GET /files/static/css/app.2991abc4.css HTTP/2.0", upstream: "http://172.20.0.4:8080/static/css/app.2991abc4.css", host: "example.org", referrer: "https://example.org/files/"
webservices-webserver-1 | 2023/07/26 12:50:17 [warn] 21#21: *1 an upstream response is buffered to a temporary file /var/cache/nginx/proxy_temp/3/00/0000000003 while reading upstream, client: 89.8.210.16, server: example.org, request: "GET /files/static/js/app.8ca2bdf9.js HTTP/2.0", upstream: "http://172.20.0.4:8080/static/js/app.8ca2bdf9.js", host: "example.org", referrer: "https://example.org/files/"
webservices-webserver-1 | 89.8.210.16 - - [26/Jul/2023:12:50:17 +0000] "GET /files/static/css/app.2991abc4.css HTTP/2.0" 200 50042 "https://example.org/files/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0" "-"
webservices-webserver-1 | 89.8.210.16 - - [26/Jul/2023:12:50:17 +0000] "GET /files/static/css/chunk-vendors.e9e545fd.css HTTP/2.0" 200 7539 "https://example.org/files/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0" "-"
webservices-webserver-1 | 89.8.210.16 - - [26/Jul/2023:12:50:17 +0000] "GET /files/static/js/chunk-vendors.0f8eac7b.js HTTP/2.0" 200 251297 "https://example.org/files/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0" "-"
webservices-webserver-1 | 89.8.210.16 - - [26/Jul/2023:12:50:17 +0000] "GET /files/static/js/app.8ca2bdf9.js HTTP/2.0" 200 102234 "https://example.org/files/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0" "-"
webservices-webserver-1 | 89.8.210.16 - - [26/Jul/2023:12:50:18 +0000] "GET /static/img/logo.svg HTTP/2.0" 404 153 "https://example.org/login?redirect=%2Ffiles%2Ffiles%2F" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0" "-"
webservices-webserver-1 | 2023/07/26 12:50:18 [error] 21#21: *1 open() "/srv/www/static/img/logo.svg" failed (2: No such file or directory), client: 89.8.210.16, server: example.org, request: "GET /static/img/logo.svg HTTP/2.0", host: "example.org", referrer: "https://example.org/login?redirect=%2Ffiles%2Ffiles%2F"
webservices-webserver-1 | 2023/07/26 12:50:53 [error] 21#21: *1 open() "/srv/www/api/login" failed (2: No such file or directory), client: 89.8.210.16, server: example.org, request: "POST /api/login HTTP/2.0", host: "example.org", referrer: "https://example.org/login?redirect=%2Ffiles%2Ffiles%2F"
webservices-webserver-1 | 89.8.210.16 - - [26/Jul/2023:12:50:53 +0000] "POST /api/login HTTP/2.0" 404 153 "https://example.org/login?redirect=%2Ffiles%2Ffiles%2F" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0" "-"
Похоже, что некоторые ресурсы запрашиваются не из службы файлового браузера, а из /srv/www, что означает, что проксирование не работает должным образом. Изначально у меня даже не было страницы входа в систему, и были похожие сообщения об ошибках, прежде чем я добавил дополнительные настройки вlocation /files/
-блокировать. Нужно ли мне добавлять еще какие-то sub_filters? Я полагаю, что эту проблему можно решить, используя поддомены (вместо этого files.example.org), но мне кажется, что это выглядит более аккуратно. Я также попробовал немного повозиться сbaseURL
иaddress
-поля в конфигурации файлового браузера, но это ни к чему не привело. Я также не смог найти никакой документации по этому поводу. Я также попробовал это: https://nginxproxymanager.com/ , но поведение в основном такое же, как и тогда, когда я делал это вручную. Я новичок в nginx и веб-сервисах в целом, поэтому буду благодарен за любую помощь.
1 ответ
Я решил это, установив для переменной baseURL значение «/files» в файле filebrowser.json. Затем я изменил конфигурацию nginx на простоproxy_pass http://filebrowser:8080
без косой черты и удалил всеsub_filter
-вещи. Таким образом, файловый браузер обрабатывает изменения в URL-адресах. Я по-прежнему получаю сообщения об ошибках в журналах, но, по крайней мере, приложение работает для моих нужд.