Назад | Перейти на главную страницу

Ошибка nginx 500 при выполнении запроса api к внутреннему контейнеру

У меня возникли проблемы с настройкой системы, состоящей из nginx, настроенного как обратный прокси-сервер, обрабатывающий https-запросы на виртуальной машине, которая находится на моем локальном компьютере. Этот обратный прокси-сервер работает с компонентами, которые являются контейнерами докеров, созданными из docker-compose.yml.

а) контейнер внешнего интерфейса, включая apache, который отправляет запрос к бэкэнду под www.mymachine.org/api/document/1 читать документ. б) API Python, представляющий собой контейнерное приложение uwsgi (порт 3031)

Это конфигурация моего сайта:

upstream frontend {
server 127.0.0.1:8080;
}

server {

listen 443 ssl;
listen [::]:443 ssl;

include snippets/self-signed.conf;
include snippets/ssl-params.conf;
server_name mymachine-dev.mydomain.com;

location ^~ / {
  proxy_pass http://frontend/;
 }

location ^~ /api/ {
              uwsgi_pass 127.0.0.1:3031;
              include uwsgi_params;
              # proxy_redirect     off;

              # proxy_set_header   Host              $http_host;
              # proxy_set_header   X-Real-IP         $remote_addr;
              # proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
              # proxy_ssl_server_name on;
              # proxy_set_header Host mymachine-dev.mydomain.com;
              }
}

server {
    listen 80;
    listen [::]:80;
    server_name mymachine-dev.mydomain.com;
    return 302 https://$server_name$request_uri;
}

Симптом: когда интерфейс делает запрос к бэкэнду, это приводит к ошибкам http 500 - Internal Server, аналогичным следующей:

XHR GET https://mymachine-dev.mydomain.com/api/documents/1

Status500
Internal Server Error
VersionHTTP/1.1
Transferred391 B (145 B size)

Однако из журналов я вижу, что запросы, сделанные фронтендом, поступают в контейнер uwsgi и что он обрабатывает данные:

wedaq_frontend_1 | 172.17.0.1 - - [19/Jul/2020:12:43:49 +0000] "GET /documents/1 HTTP/1.0" 200 890
wedaq_frontend_1 | 172.17.0.1 - - [19/Jul/2020:12:43:49 +0000] "GET /css/app.582869e8.css HTTP/1.0" 200 7172
wedaq_frontend_1 | 172.17.0.1 - - [19/Jul/2020:12:43:49 +0000] "GET /css/chunk-vendors.3cb806b4.css HTTP/1.0" 200 251267
uwsgi_1     | Note: entering document generation
uwsgi_1     | [pid: 14|app: 0|req: 3/3] 192.168.178.112 () {52 vars in 1064 bytes} [Sun Jul 19 12:43:49 2020] GET /api/docuements/1 => generated 145 bytes in 6 msecs (HTTP/1.1 500) 5 headers in 154 bytes (1 switches on core 0)
wedaq_frontend_1 | 172.17.0.1 - - [19/Jul/2020:12:43:49 +0000] "GET /js/app.144c2789.js.map HTTP/1.0" 200 426026
wedaq_frontend_1 | 172.17.0.1 - - [19/Jul/2020:12:43:49 +0000] "GET /js/chunk-vendors.f3c2a7c6.js.map HTTP/1.0" 200 4511322

У меня проблемы с отладкой, где на самом деле возникает ошибка. Мое лучшее предположение заключалось в том, что у меня что-то не так с сертификатами - я использую самоподписанные сертификаты, которые отображаются как недействительные в окне браузера. Я попытался заменить оригинальные сертификаты Ubuntu snakeoil сертификатами, которые я создал самостоятельно, но ошибка осталась прежней. Теперь у меня вопрос, может ли проблема ssl вызвать ошибку 500 и что мне нужно делать после этого, или мне нужно копаться в совершенно другом регионе? Это журнал nginx, жалующийся на рукопожатие ssl:

2020/07/19 12:56:39 [info] 3367#3367: *53 SSL_do_handshake() failed (SSL: error:14094416:SSL routines:ssl3_read_bytes:sslv3 alert certificate unknown:SSL alert number 46) while SSL handshaking, client: 192.168.178.112, server: 0.0.0.0:443
2020/07/19 12:56:39 [info] 3367#3367: *54 SSL_do_handshake() failed (SSL: error:14094416:SSL routines:ssl3_read_bytes:sslv3 alert certificate unknown:SSL alert number 46) while SSL handshaking, client: 192.168.178.112, server: 0.0.0.0:443
2020/07/19 12:56:39 [info] 3367#3367: *58 SSL_do_handshake() failed (SSL: error:14094416:SSL routines:ssl3_read_bytes:sslv3 alert certificate unknown:SSL alert number 46) while SSL handshaking, client: 192.168.178.112, server: 0.0.0.0:443
2020/07/19 12:56:39 [warn] 3368#3368: *55 an upstream response is buffered to a temporary file /var/lib/nginx/proxy/1/01/0000000011 while reading upstream, client: 192.168.178.112, server: mymachine-dev.mydomain.com, request: "GET /css/chunk-vendors.3cb806b4.css HTTP/1.1", upstream: "http://127.0.0.1:8080/css/chunk-vendors.3cb806b4.css", host: "mymachine-dev.mydomain.com", referrer: "https://mymachine-dev.mydomain.com/documents/1"
2020/07/19 12:56:39 [warn] 3367#3367: *59 an upstream response is buffered to a temporary file /var/lib/nginx/proxy/2/01/0000000012 while reading upstream, client: 192.168.178.112, server: mymachine-dev.mydomain.com, request: "GET /js/app.144c2789.js.map HTTP/1.1", upstream: "http://127.0.0.1:8080/js/app.144c2789.js.map", host: "mymachine-dev.mydomain.com"
2020/07/19 12:56:39 [warn] 3368#3368: *55 an upstream response is buffered to a temporary file /var/lib/nginx/proxy/3/01/0000000013 while reading upstream, client: 192.168.178.112, server: mymachine-dev.mydomain.com, request: "GET /js/chunk-vendors.f3c2a7c6.js.map HTTP/1.1", upstream: "http://127.0.0.1:8080/js/chunk-vendors.f3c2a7c6.js.map", host: "mymachine-dev.mydomain.com"

Примечание. Я получил предупреждение о буферизации, но ответ восходящего потока буферизируется во временный файл предполагает, что это не связано.

Заголовок ответа выглядит так:

    HTTP/1.1 500 Internal Server Error
    Server: nginx/1.14.0 (Ubuntu)
    Date: Tue, 21 Jul 2020 19:40:35 GMT
    Content-Type: text/html
    Content-Length: 145
    Connection: keep-alive
    X-Frame-Options: DENY
    Vary: Origin
    X-Content-Type-Options: nosniff

и это содержимое полезной нагрузки ответа:

    <!doctype html>
    <html lang="en">
    <head>
      <title>Server Error (500)</title>
    </head>
    <body>
      <h1>Server Error (500)</h1><p></p>
    </body>
    </html>