nginx не может прокси через Docker-контейнер - PullRequest
0 голосов
/ 08 октября 2019

У меня есть док-контейнер с небольшим приложением Flask с Gunicorn, работающим на 0.0.0.0:5000. Я пытаюсь прокси в этот апи-сервер апстрима через nginx. Вот мое nginx.conf:

worker_processes 4;
pid /run/nginx.pid;

events {
    worker_connections 768;
}

http {

    ##
    # Basic Settings
    ##

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    # server_tokens off;

    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ##
    # Logging Settings
    ##

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    ##
    # Mount to /tmp
    ##

    client_body_temp_path  "/tmp/client_body" 1 2;
    proxy_temp_path "/tmp/proxy" 1 2;
    fastcgi_temp_path "/tmp/fastcgi" 1 2;
    scgi_temp_path "/tmp/scgi" 1 2;
    uwsgi_temp_path "/tmp/uwsgi" 1 2;

    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";

    upstream api_server {
        server localhost:5000;
    }

    server {
        listen 8080 default_server;
        listen [::]:8080 default_server ipv6only=on;
        server_name insecure;
        return 301 https://app.example.org$request_uri;

    }

    server {
        listen 8443 default_server;
        listen [::]:8443 default_server ipv6only=on;

        root /usr/share/nginx/html;
        index index.html index.htm;

        server_name localhost;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ /index.html;
                # Uncomment to enable naxsi on this location
                # include /etc/nginx/naxsi.rules
        }

        location /api {
            proxy_pass http://api_server;
        }
    }
}

Местоположение в / отображает поиск (это просто базовая структура шаблона для веб-страницы), но контент, обслуживаемый upsteam api_server, не работает с500 внутренняя ошибка сервера. Он работал при работе на порте 80, но мне нужно запустить его на порте выше 1024, потому что этот контейнер работает в OpenShift и не может иметь привилегии root. Я не уверен, почему этот прокси не работает. Он IS способен извлекать контент, который ему нужен, он просто не может доставить этот контент на панели карт на веб-странице.

index.html Веб-страница для справки:

<html>
    <head>
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/css/bootstrap.min.css" integrity="sha384-rwoIResjU2yc3z8GV/NPeZWAv56rSmLldC3R/AZzGRnGxQQKnKkoFVhFQhNUwEyJ" crossorigin="anonymous">
        <script src="https://code.jquery.com/jquery-3.1.1.slim.min.js" integrity="sha384-A7FZj7v+d/sdmMqp/nOQwliLvUsJfDHW+k9Omg/a/EheAdgtzNs3hpfag6Ed950n" crossorigin="anonymous"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.4.0/js/tether.min.js" integrity="sha384-DztdAPBWPRXSA/3eYEEUWrWCy7G5KFbe8fFjk5JAIxUYHKkDx6Qin1DkWx51bBrb" crossorigin="anonymous"></script>
        <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/js/bootstrap.min.js" integrity="sha384-vBWWzlZJ8ea9aCX4pEW3rVHjgjt7zpkNpZk+02D9phzyeVkE+jo0ieGizqPLForn" crossorigin="anonymous"></script>
        <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
    </head>
    <style>
      body {
        background-color: #232b2b;
      }
    </style>
    <body>
      <nav class="navbar navbar-toggleable-md navbar-dark bg-faded">
        <a class="navbar-brand">Skyhook</a>
        <div class="collapse navbar-collapse" id="navbarSupportedContent">
          <ul class="navbar-nav mr-auto">
            <li class="nav-item">
                <a class="nav-link" href="/"s>Reports</a>
            </li>
          </ul>
          <form class="form-inline my-2 my-lg-0">
            <input class="form-control mr-sm-2" onkeyup="search_function()" type="text" id="search" placeholder="Search Reports">
            <button class="btn my-2 my-sm-0" type="submit">Search</button>
          </form>
        </div>
      </nav>
      <br />
      <div class="container-fluid">
        <style>
          .card {
            max-width: 24rem;
          }
        </style>
            <div class="card-deck" id="reports">

            </div>
      </div>
    </body>
    <script type="text/javascript">
      function render_reports(report) {
        var date = new Date(report.latest_run);
        var host_name = "/api/report/";
        var card_top = '<div class="card card-block m-2">';
        var card_title = '<h4 class="card-title">' + report.name + '</h4>';
        var card_content_top = '<ul class="list-group list-group-flush">';
        var list = '<li class="list-group-item report_desc">' + report.description + '</li>' + '<li class="list-group-item"><b>Frequency:&nbsp;</b>' + report.frequency + '</li>';
        var more_list = '<li class="list-group-item"><b>File Name:&nbsp;</b>' + '<a href="' + host_name + report.file_name + '">' + report.file_name + '</a></li>';
        var last_run = '<li class="list-group-item"><b>Last Run:&nbsp;</b>' + date + '</li>'
        var card_content_bottom = '</ul>'
        var card_bottom = '</div>';
        var subscribe_form = `
          <li class="list-group-item">
            <form class="form-inline" action="/api/subscribe" method="post">
              <div class="row">
              <input type="text" name="email" class="form-control mb-2 mr-sm-2 mb-sm-0" placeholder="Subscription Email">
              </div>
              <input type="hidden" name="topic_arn" value="${report.topic_arn}">
              <div class="row">
              <button type="submit" class="btn btn-success">Subscribe</button>
              </div>
            </form>
          </li>
        `;
        return card_top + card_title + card_content_top + list + more_list + last_run + subscribe_form + card_content_bottom + card_bottom;
      }
      var reportsURL = window.location.hostname + "/api/reports";
      $(window).on('load', function(e) {
        $.ajax({
          type: "GET",
          dataType: "json",
          url: "/api/reports",
          crossDomain: true,
          success: function(data) {
            console.log(data);
            console.log(window.location);
            $("#reports").hide();
            $.each(data.reports, function(index, report) {
              $("#reports").append(render_reports(report));
            });
            $("#reports").fadeIn();
          }
        });
      });
      function search_function() {
        var input, filter, cards, card, title, desc, i;
        input = $("#search").val();
        filter = input.toUpperCase();
        cards = $(".card");
        for(i = 0; i < cards.length; i++) {
          card = cards[i]
          desc = card.getElementsByClassName("report_desc")[0];
          title = card.getElementsByTagName("h4")[0];
          if (title.innerHTML.toUpperCase().indexOf(filter) > -1 || desc.innerHTML.toUpperCase().indexOf(filter) > -1) {
            $(card).show();
          } else {
            $(card).hide();
          }
        }
      }
      function ValidateEmail(inputText) {
        var mailformat = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/;
        if(inputText.value.match(mailformat))
        {
          document.form1.text1.focus();
          return true;
        }
        else
        {
          alert("You have entered an invalid email address!");
          document.form1.text1.focus();
          return false;
        }
      }
    </script>

</html>
...