【问题标题】:Serving flask app on subdirectory nginx + uwsgi在子目录 nginx + uwsgi 上提供烧瓶应用程序
【发布时间】:2015-09-18 00:11:39
【问题描述】:

我正在尝试将flask部署在我网站的子目录中,这个脚本是超轻量级的,不需要(实际上它不能)滚动到主项目中。但是,当我到达终点时,我从烧瓶中收到 404 错误(可以确认它是烧瓶,因为日志显示活动)。我在我的 nginx 配置文件中传递了 uwsgi_param SCRIPT_NAME /upload;uwsgi_modifier1 30;,但这似乎不起作用。如何让 uwsgi 在 nginx 子位置(子目录)上服务我的烧瓶应用程序?

这是我的 nginx 配置(/upload 位置是问题所在):

upstream django {
    server app0.api.xyz.com:9002;
}

server {
    listen      443;
    ssl on;
    ssl_certificate /etc/nginx/ssl/cert_chain.crt;
    ssl_certificate_key /etc/nginx/ssl/api_xyz.key;

    charset     utf-8;
    server_name dev.api.xyz.com;

    location / {
            uwsgi_pass django;
            include /etc/nginx/uwsgi_params;
    }

    location /media  {
            alias /var/xyzdata;
    }

    location /upload {
        include /etc/nginx/uwsgi_params;
        uwsgi_pass unix:/var/sockets/upload.sock;
        uwsgi_param SCRIPT_NAME /upload;
        uwsgi_modifier1 30;
    }
}

我的 uwsgi.ini 文件:

[uwsgi]
chdir           = /home/ubuntu/uploadFlask
module          = images
callable        = app
socket          = /var/sockets/upload.sock
master          = true
processes       = 10
vacuum          = true
uid             = www-data
gid             = www-data
daemonize       = /var/log/uploads/error.log

最后是我的整个烧瓶应用程序:

import os
from flask import Flask, request, redirect, url_for,Response, jsonify
from werkzeug import secure_filename
import time

UPLOAD_FOLDER = '/var/xyzdata'
ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'])

app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
app.config['DEBUG'] = True

@app.route('/<user>', methods=['POST'])
def upload_file(user):
    file = request.files['file']
    if file:
            file_id = str(time.time()).replace('.','_')
            filename = "{0}/images/{1}.jpg".format(user, file_id)
            path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
            d = os.path.dirname(path)
            if not os.path.exists(d):
                    os.makedirs(d)
            file.save(path)
            return jsonify(physical_path=path, virtual_path=filename,
                           id=file_id)

@app.route('/delete/<user>/<id>/', methods=['POST'])
def delete_file(user, id):
    pass

这个脚本的重点是将图像上传到我的静态服务器。我的实际应用程序位于单独的服务器上,这就是为什么它不能坐在那里。

基本上我想要的是能够访问 dev.api.xyz.com/upload/123/ 并点击upload_file。我预计浏览器中会出现 405 错误,因为它仅限于 POST。但我收到 404 错误。以下是烧瓶/uwsgi 日志的示例输出:

[pid: 27900|app: 0|req: 4/5] 50.199.33.84 () {40 vars in 669 bytes} [Wed Jul  1 01:03:51 2015] GET /upload/things@things.com => generated 233 bytes in 0 msecs (HTTP/1.1 404) 2 headers in 72 bytes (1 switches on core 0)

所以烧瓶被击中,但 url 匹配不起作用。提前感谢您的帮助。

【问题讨论】:

    标签: python nginx flask uwsgi


    【解决方案1】:

    到目前为止,我发现的最佳解决方案是使用 uwsgi 的 mount 选项。在您的配置中添加该行

    mount = /upload=<scriptname>
    

    解决方案由https://serverfault.com/questions/461946提供

    【讨论】:

      【解决方案2】:

      最适合我的快速解决方案

      location ~ /upload(/.*) {
          include /etc/nginx/uwsgi_params;
          uwsgi_pass unix:/var/sockets/upload.sock;
          uwsgi_param PATH_INFO "$1";
      }
      

      希望这可以帮助你。干杯

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-01
        • 1970-01-01
        • 2012-11-28
        • 1970-01-01
        • 2015-07-18
        • 2017-11-16
        • 2019-04-05
        相关资源
        最近更新 更多