У меня есть док-контейнер с небольшим приложением 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: </b>' + report.frequency + '</li>';
var more_list = '<li class="list-group-item"><b>File Name: </b>' + '<a href="' + host_name + report.file_name + '">' + report.file_name + '</a></li>';
var last_run = '<li class="list-group-item"><b>Last Run: </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>