我有一个Docker容器,托管一个小型Flask应用程序,其中Gunicorn运行在0.0.0.0:5000
上。我正在尝试通过nginx代理到该上游api服务器。这是我的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;
}
}
}
/
位置上的位置呈现find(这只是网页的基本模板结构),但是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>