3

最新更新:问题确实与权限和用户组有关,今天我了解了为什么我们不简单地使用 root 来处理所有事情。感谢Jakub P.提醒我查看 apache 错误日志,并感谢domoarrigato提供有用的见解和解决方案。


StackOverflow 怎么了。

我遵循了如何在 DigitalOcean 提供的 Ubuntu VPS 上部署 Flask 应用程序教程,并通过向我的公共服务器 IP 发出请求,让我的应用程序Hello, I love Digital Ocean!在被外部访问时成功打印出来。GET

没事吧?并不真地。

之后,我编辑了教程脚本并编写了一个自定义的烧瓶应用程序,我在我的个人开发环境中测试了该脚本,它运行没有问题,我还在 DigitalOcean 服务器上对其进行了测试,方法是将其部署在本地主机上并发出另一个GET请求。

在我尝试从我的公共 DigitalOcean IP 访问它之前,所有工作都按预期进行,现在我突然看到了一个500 Internal Server Error.

是什么导致了这个问题,在这种情况下调试的正确方法是什么?

我尝试了什么?

  • 设置在没有调试报告的情况下app.debug = True给出相同的结果。500 Internal Server Error

  • 在我的台式电脑和 DigitalOcean 服务器的本地主机上运行应用程序没有错误,脚本按预期执行。

  • 教程代码运行良好,GET向 Digital Ocean 公共 IP 发出请求会返回预期的响应。

  • 我可以在教程应用程序和我自己的应用程序之间切换,并且清楚地看到我只是在我的自定义应用程序中遇到错误。但是,自定义应用程序在 localhost 上运行仍然没有问题。

我的代码

from flask import Flask, request, redirect
from netaddr import IPNetwork
import os
import time

app         = Flask(__name__)
APP_ROOT    = os.path.dirname(os.path.abspath(__file__))

# Custom directories
MODULES     = os.path.join(APP_ROOT, 'modules')
LOG         = os.path.join(APP_ROOT, 'log')


def check_blacklist(ip_adress):
    ipv4 = [item.strip() for item in open(MODULES + '//ipv4.txt').readlines()]
    ipv6 = [item.strip() for item in open(MODULES + '//ipv6.txt').readlines()]

    for item in ipv4 + ipv6:
        if ip_adress in IPNetwork(item):
            return True

        else:
            pass

    return False


@app.route('/')
def hello():
    ip_adress   = request.environ['REMOTE_ADDR']
    log_file    = open(LOG + '//captains_log.txt', 'a')

    with log_file as f:

        if check_blacklist(ip_adress):
            f.write('[ {}: {} ][ FaceBook ] - {} .\n'
                    .format(time.strftime("%d/%m/%Y"), time.strftime("%H:%M:%S"), request.environ))
            return 'Facebook'

        else:
            f.write('[ {}: {} ][ Normal User ] - {} .\n'
                    .format(time.strftime("%d/%m/%Y"), time.strftime("%H:%M:%S"), request.environ))
            return 'Normal Users'


if __name__ == '__main__':
    app.debug = True
    app.run()

教程代码:

from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
    return "Hello, I love Digital Ocean!"
if __name__ == "__main__":
    app.run()
4

1 回答 1

1

似乎以下行可能是一个问题:

log_file    = open(LOG + '//captains_log.txt', 'a')

如果它寻找的路径是:'/var/www/flaskapp/flaskapp/log//captains_log.txt'

在那里抛出异常是有道理的。文件可能位于不同的位置、服务器上或/需要删除 - 确保该open命令将找到正确的文件。

如果captains_log.txt在烧瓶应用程序目录之外,您可以将其复制并 chown 。如果 txt 文件需要在目录之外,那么您必须将用户添加到适当的组,或者打开实际目录的权限。

chown 命令应该是:

sudo chown www:www /var/www/flaskapp/flaskapp/log/captains_log.txt

运行可能很聪明:

sudo chown -r www:www /var/www
于 2016-05-27T12:45:18.190 回答