问题
I wrote an endpoint with Flask to handle http post request data in json format. When trying to deploy it on apache2, post requests got 404 error: "The requested URL /bridge was not found on this server" . I'm using python 3.5.2, apache 2.4, OpenSSL/1.0.2g, ubuntu 16.04, mod_wsgi4.3.0 compiled for python 3.5.1+
Anyone has any idea? Apache cannot see /var/www but why? or there is a problem in SSL configuration? (https works for the webiste)
I have
at /var/www/bridge/bridge.wsgi
#!/usr/bin/python3
import sys
sys.path.insert(0,'/var/www/bridge')
from bridge import app as application
conf file at /etc/apache2/sites-enabled/bridge.conf
<VirtualHost *:443>
ServerName www.newocto.org
WSGIDaemonProcess bridge user=www-data group=www-data threads=5 home=/var/www/bridge/
WSGIScriptAlias /bridge /var/www/bridge/bridge.wsgi
<Directory /var/www/bridge>
WSGIProcessGroup bridge
WSGIApplicationGroup %{GLOBAL}
Require all granted
</Directory>
my 000-default.conf file is like this:
<VirtualHost *:443>
# The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
ServerName www.newocto.org
DocumentRoot /var/www/html
SSLEngine on
SSLCertificateFile /etc/ssl/certs/newocto_org.crt
SSLCertificateKeyFile /etc/ssl/private/newocto.key
SSLCertificateChainFile /etc/ssl/certs/COMODORSAAddTrustCA.crt
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{SERVER_NAME}/$1 [R,L]
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# For most configuration files from conf-available/, which are
# enabled or disabled at a global level, it is possible to
# include a line for only one particular virtual host. For example the
# following line enables the CGI configuration for this host only
# after it has been globally disabled with "a2disconf".
#Include conf-available/serve-cgi-bin.conf
</VirtualHost>
<VirtualHost *:80>
ServerName newocto.org/
Redirect / https://newocto.org/
</VirtualHost>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
and my flask code at /var/www/bridge/bridge.py is
#!/usr/bin/python3
from flask import Flask
app = Flask(__name__)
@app.route('/', methods =['POST'])
def deliver():
from flask import request
raw=request.get_json(force=True)
return raw
import mysql.connector
dbconn= mysql.connector.connect(host='xxxx',port='3306',database='xx',user='root',password='xxx')
cursor=dbconn.cursor()
query="""insert into bridge_test2 (email) values ('{}')""".format(raw)
cursor.execute(query)
dbconn.commit()
dbconn.close()
if __name__ == '__main__':
app.run()
#file permissions are like this:
#4 -rwxr-xr-x 1 root www-data 537 Dec 20 13:46 bridge.py
#4 -rwxr-xr-x 1 root www-data 117 Dec 20 14:10 bridge.wsgi
回答1:
You can't have two VirtualHost
sections for same ServerName
and port, it will only use the first it sees.
Copy the contents of the VirtualHost
in bridge.conf
into that in 000-default.conf
for same ServerName
and port.
来源:https://stackoverflow.com/questions/47906730/404-url-not-found-error-for-flask-app-on-apache2