Я пытаюсь развернуть приложение Flask на Apache 2.4 на сервере, используя mod_fcgid и flup.
My Flask - большое приложение на Python3.6.
Я зарегистрировал его как службу (bot.service) на сервере с помощью systemctl и создал конфигурацию виртуального хоста для Apache. После перезапуска apache и systemctl я запускаю свой bot.service и спрашиваю его статус (sudo systemctl status bot) и получаю следующее сообщение об ошибке:
May 31 11:18:06 vlg00086 systemd[1]: bot.service: Unit entered failed state.
May 31 11:18:06 vlg00086 systemd[1]: bot.service: Failed with result 'exit-code'.
May 31 11:18:06 vlg00086 systemd[1]: bot.service: Service RestartSec=100ms expired, scheduling restart.
May 31 11:18:06 vlg00086 systemd[1]: Stopped Chatbot_classification_system.
May 31 11:18:06 vlg00086 systemd[1]: bot.service: Start request repeated too quickly.
May 31 11:18:06 vlg00086 systemd[1]: Failed to start Chatbot_classification_system.
May 31 11:18:06 vlg00086 systemd[1]: bot.service: Unit entered failed state.
May 31 11:18:06 vlg00086 systemd[1]: bot.service: Failed with result 'start-limit'.
О МОЕЙ ЗАЯВКЕ:
Мое приложение находится здесь: / имя_папки / папка_данных / local_html / Chatbot_classification_system /
и имеет следующую структуру:
Chatbot_classification_system/
bot/
module1/…
module2/…
...
module…/…
templates/…
__init__.py
__main__.py
bot.fcgi
config.py
forms.py
… (other .py modules)
lib/…
templates/…
tests/…
wwww/
.htaccess
__init__.py
bot.service
bot_exe.sh
config.json
globals.py
requieremnts.txt
setup.py
Он устанавливается вместе с pip в виртуальной среде python3.6.
РАБОТАЕТ НА МЕСТЕ ВСТРОЕННОГО КОЛБА:
Он может работать на встроенном локальном хосте Flask с
python3.6 __main__.py.
После выполнения некоторых шагов, специфичных для программы (создание идентификатора пользователя и т. Д.), Приложение перенаправляет пользователя на локальный хост фляги и показывает HTML-страницу - форму с вопросами.
РАБОТА С СЕРВЕРОМ:
Я создал файл bot.fcgi.
Я не использую от бота. main .py оператор приложения импорта, а просто копирую нужный мне код из файла main.py , потому что есть много дополнительных шаги до app.run и я не хочу потеряться в импорте.
Вот так выглядит мой bot.fcgi:
#!/folder_name/data_folder/local_html/pythons/python3.6.3/bin/python3.6
import sys, os
print("1")
from flup.server.fcgi import WSGIServer
print("2")
import pandas as pd
import json
from flask import Flask, render_template, flash, request
from bot.forms import ReusableForm
import re
from werkzeug.datastructures import ImmutableMultiDict
# …
# (other imports)
print("test imports done...")
list_of_meta_labels = {...}
# (… programm specific code)
#--------------------------------------------------------------------------
# App configuration:
#--------------------------------------------------------------------------
app = Flask(__name__)
app.config.from_object(__name__)
app.config['SECRET_KEY'] = '...'
app.config['EXPLAIN_TEMPLATE_LOADING'] = True
print("app configured...")
# … (Programm specific code)
def submit(name):
# ...
def try_strip(inp):
# ...
def read_conf(): READ CONFIGURATION FILE # get Environment variables
# …
@app.route("/", methods=['GET', 'POST']) # URL to trigger our function
def support_form(test=None):
# … (programm specific steps)
form = ReusableForm(request.form)
# … (programm specific steps)
#------------------------------------------------------------------------
# Update "form" with the answer and send it the response page:
#------------------------------------------------------------------------
parameters = request.form.to_dict()
parameters['answer'] = answer_html
form = ImmutableMultiDict(parameters)
return render_template('success_landing_page.html', title='Index',
form=form)
if __name__ == '__main__':
app.debug = True
WSGIServer(app).run()
Мой файл bot.service:
[Unit]
Description=Chatbot_classification_system
[Service]
ExecStart= /folder_name/data_folder/local_html/Chatbot_classification_system/bot/bot.fcgi
Restart=always
Group=dlm_nagios
Environment=NODE_ENV=production
WorkingDirectory /folder_name/data_folder/Chatbot_classification_system/
[Install]
WantedBy=multi-user.target
Конфигурация Apache:
/ etc / apache2 / vhosts.d / 50006.conf file:
LoadModule fcgid_module ./usr/lib64/apache2/mod_fcgid.so
<VirtualHost *:50006>
ServerRoot /folder_name/data_folder/local_html/Chatbot_classification_system
DocumentRoot /folder_name/data_folder/local_html/Chatbot_classification_system/templates
AddHandler fcgid-script .fcgi
ScriptAlias / /folder_name/data_folder/local_html/Chatbot_classification_system/bot/bot.fcgi/
<Location />
SetHandler fcgid-script
</Location>
</VirtualHost>
Я перезагружаю все:
service httpd restart
sudo systemctl daemon-reload
sudo systemctl start bot
* * Выходы тысяча сорок-девять
Выход
sudo systemctl status bot
это
* bot.service - Chatbot_classification_system
Loaded: loaded (/etc/systemd/system/bot.service; enabled; vendor preset: disabled)
Active: failed (Result: start-limit) since Fri 2019-05-31 12:13:59 UTC; 29min ago
Process: 20899 ExecStart=/folder_name/data_folder/local_html/Chatbot_classification_system/bot.fcgi (code=exited, status=203/EXEC)
Main PID: 20899 (code=exited, status=203/EXEC)
May 31 12:13:59 vlg00086 systemd[1]: bot.service: Main process exited, code=exited, status=203/EXEC
May 31 12:13:59 vlg00086 systemd[1]: bot.service: Unit entered failed state.
May 31 12:13:59 vlg00086 systemd[1]: bot.service: Failed with result 'exit-code'.
May 31 12:13:59 vlg00086 systemd[1]: bot.service: Service RestartSec=100ms expired, scheduling restart.
May 31 12:13:59 vlg00086 systemd[1]: Stopped Chatbot_classification_system.
May 31 12:13:59 vlg00086 systemd[1]: bot.service: Start request repeated too quickly.
May 31 12:13:59 vlg00086 systemd[1]: Failed to start Chatbot_classification_system.
May 31 12:13:59 vlg00086 systemd[1]: bot.service: Unit entered failed state.
May 31 12:13:59 vlg00086 systemd[1]: bot.service: Failed with result 'start-limit'.
Выход
sudo apache2ctl -S
есть
VirtualHost configuration:
*:50006 server_name.sss.sss.corp (<it is our Server name>) (/etc/apache2/vhosts.d/50006.conf:3)
ServerRoot: "/folder_name/data_folder/local_html/Chatbot_classification_system"
Main DocumentRoot: "/folder_name/data_folder/local_html/Chatbot_classification_system"
Main ErrorLog: "/var/log/apache2/error_log"
Mutex ssl-cache: using_defaults
Mutex default: dir="/run/" mechanism=default
Mutex mpm-accept: using_defaults
Mutex fcgid-pipe: using_defaults
Mutex ssl-stapling-refresh: using_defaults
Mutex fcgid-proctbl: using_defaults
Mutex ssl-stapling: using_defaults
PidFile: "/var/run/httpd.pid"
Define: SYSCONFIG
Define: DUMP_VHOSTS
Define: DUMP_RUN_CFG
User: name="wwwrun" id=30
Group: name="www" id=8
Я пытался запустить свое приложение с
§ python3.6 bot.fcgi
Конечно, таким образом приложение не получает никакой информации о конфигурации Сервера, но позволяет проверить, что сам код запускается без ошибок.
Я вижу операторы печати "1", "2", "импорт теста завершен ..." и "приложение настроено ..." и следующее сообщение:
WSGIServer: missing FastCGI param REQUEST_METHOD required by WSGI!
WSGIServer: missing FastCGI param SERVER_NAME required by WSGI!
WSGIServer: missing FastCGI param SERVER_PORT required by WSGI!
WSGIServer: missing FastCGI param SERVER_PROTOCOL required by WSGI!
Status: 301 MOVED PERMANENTLY
Content-Type: text/html; charset=utf-8
Content-Length: 241
Location: http://localhost/
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>Redirecting...</title>
<h1>Redirecting...</h1>
<p>You should be redirected automatically to target URL: <a href="http://localhost/">http://localhost/</a>. If not click the link.
Полагаю, это означает, что программа запускается без ошибок, а затем не находит конфигурацию сервера (что является нормальным, потому что она находится в apache) и показывает сообщение об ошибке 404.
Кажется, что проблема где-то в моей конфигурации Apache.
Я был бы очень рад, если бы кто-нибудь мог мне помочь!