我的网站是用Python编写的,目前在Apache的mod_python下运行.最近我不得不加入一些让我认为可能值得将网站转换为mod_wsgi的丑陋黑客.但我已经习惯了使用一些mod_python的的工具类的,特别是FieldStorage和Session(有时Cookie),并从扫描PEP 333,我看不出有任何等同于这些.(这并不奇怪,因为我了解这些实用程序不属于WSGI规范)
问题是,我可以在WSGI中使用这些mod_python实用程序类的"标准"(即通常接受的)替换,还是我/我应该自己编写?
(仅供参考:目前正在使用Python 2.5)
我正在用Django创建一个Web应用程序.由于我非常熟悉Apache,因此我设置了我的开发环境,让Django使用mod_wsgi运行Apache.我唯一的烦恼就是每次更改代码时都必须重新启动Apache.有没有解决的办法?
我正在尝试同时运行两个Django项目.我碰巧使用mod_wsgi,发现该网站表现得很奇怪.也许会有一个解决方法,但我想知道我错过了什么,以及如何解决问题.
在apache配置中
# Setup the Python environment
# As root owns basically everything on a Amazon AMI and root
# cannot be used. Create a folder under /var/run/wsgi
# with the owner as ec2-user and group ec2-user.
WSGISocketPrefix /var/run/wsgi
# Call your daemon process a name
WSGIDaemonProcess pydaemon processes=1 threads=5
# Call your daemon process group a name
WSGIProcessGroup pydaemon
# Point to where the handler file is. This will be different
# If you are using some other framework. …Run Code Online (Sandbox Code Playgroud) 我查看了很多相关的帖子,但似乎没有任何帮助.
相关信息:
Django版本 - 1.4
Apache版本 - 2.2
Python版本 - 2.7
操作系统 - Xubuntu 12.04
DB - Mysql
我正在尝试让Apache同时提供django app和静态文件.管理站点中的问题变得明显,无法显示任何CSS样式或图像.我的管理网站目前看起来像:
(好吧,我会包含一个图像,但堆栈溢出不让我.只需说它看起来像其他人发布在这个主题上的管理页面,请参阅Apache不提供django管理静态文件 )
像我的登录页面和一些动态内容这样的应用程序工作正常,但是当我尝试提供静态内容时,我收到403错误.另外,当我尝试通过查看管理页面的渲染html并单击指向样式表的链接时手动导航到样式表
http://localhost/static/admin/css/base.css
Run Code Online (Sandbox Code Playgroud)
我收到403错误.我可以在终端中导航,并更改了文件夹的权限,以便Apache的www-data用户显式访问所有文件.
以下是我的httpd.conf的相关部分:
#AliasMatch ^/([^/]*\.css) /usr/local/wsgi/static/styles/$1
Alias /media/ "/usr/local/wsgi/media/"
Alias /static/ "/usr/local/wsgi/static/"
<Directory "/usr/local/wsgi/static">
Order deny,allow
Allow from all
</Directory>
<Directory "/usr/local/wsgi/media">
Order deny,allow
Allow from all
</Directory>
WSGIScriptAlias / "/home/noah/Documents/Web/Basic/apache/django.wsgi"
<Directory "/usr/local/wsgi/scripts">
Order allow,deny
Allow from all
</Directory>
Run Code Online (Sandbox Code Playgroud)
根据朋友的建议,我还将上述内容复制到我的网站 - 可用默认值:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www
TypesConfig /etc/mime.types
<Directory />
Options FollowSymLinks
AllowOverride None …Run Code Online (Sandbox Code Playgroud) 我已经运行了Apache + mod_wsgi + django.出于某种原因,服务器上的某些内容发生了变化,现在apache完全挂起 - 它停止响应所有其他请求,并且必须停止并启动 - 当我发布请求时.最终我们看到"脚本标题过早结束:django.wsgi"错误.
我们做了一个strace,我看到一件似乎可疑的事情是"GATEWAY_INTERFACE\0CGI/1.1\0SERVER_PROTOCOL ......"(我们也看到发布了关机.)
"GATEWAY_INTERFACE\0CGI/1.1"是否指定它是为CGI而不是WSGI设置的?(我已经读过,如果将脚本设置为CGI,则会导致脚本过早结束.)
我们的虚拟主机指定:
WSGIDaemonProcess [host] threads=25
WSGIProcessGroup [host]
WSGIScriptAlias / /path/to/apache/django.wsgi
Run Code Online (Sandbox Code Playgroud)
我只是在加载WSGI模块的httpd.conf中看到与CGI无关.
感谢下面的答案,我有一个before_request功能,/login如果用户尚未登录,则会将用户重定向到:
这是我的before_request的副本:
@app.before_request
def before_request():
if 'logged_in' not in session and request.endpoint != 'login':
return redirect(url_for('login'))
Run Code Online (Sandbox Code Playgroud)
除非用户已登录,否则不会提供静态目录中的文件.
在我的/login页面上,我从/static目录中获取一个css文件,但由于这个原因无法加载before_request.
我使用apache mod_wsgi部署了这个应用程序,在我的apache配置文件中,我甚至将该/static目录作为站点的DocumentRoot 包含在内.
如何/static在没有用户登录的情况下添加异常来提供应用程序的文件,但仍然将其before_request用于我的flask应用程序定义的路由?
我正在尝试使用以下Apache配置为django项目提供服务:
Apache虚拟主机配置:
<VirtualHost *>
ServerName servername
[...]
<Directory "/path/to/project/project">
<Files wsgi.py>
Require all granted
</Files>
</Directory>
WSGIDaemonProcess project python-path=/path/to/project:/path/to/Envs/venv/lib/python3.5/site-packages
WSGIScriptAlias / /path/to/project/project/wsgi.py
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
我也有以下wsgi.py:
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "example.settings")
application = get_wsgi_application()
Run Code Online (Sandbox Code Playgroud)
我没有问题来提供STATIC文件和MEDIA文件.
我还检查了权限并尝试递归使用755,然后777到我的virtualenv的site-package目录.它没用.
但是当我试图访问我的网站的根目录时,我得到以下内容:
from django.core.wsgi import get_wsgi_application
ImportError: No module named 'django'
Run Code Online (Sandbox Code Playgroud)
我猜这是一个Python路径相关的问题,因为django安装在我的virtualenv中.但我添加了相关的python路径WSGIDaemonProcess的python-path属性,所以我不明白为什么它不起作用.
我也猜测我可以通过使用site模块将相关目录添加到我的wsgi.py中的Python路径中,但我想了解为什么我尝试的Apache配置还不够.我错过了什么?
我知道不建议在生产中运行Bottle或Flask应用程序,python myapp.py --port=80因为它只是一个开发服务器.
我认为也不建议运行它python myapp.py --port=5000并将其链接到Apache:RewriteEngine On,RewriteRule /(.*) http://localhost:5000/$1 [P,L](或者我错了?),因为WSGI是首选.
所以我现在正在设置Python app <-> mod_wsgi <-> Apache(没有gunicorn或其他工具来保持简单).
问题:当使用WSGI时,我知道它是Apache,mod_wsgi并且会myapp.py在请求到来时自动启动/停止运行足够的进程,但是:
例:
我做了一些更改myapp.py,并且我想重新启动运行它的所有进程,这些进程已由mod_wsgi启动(注意:我知道mod_wsgi可以观察源代码的更改,并重新启动,但这仅适用于对其进行的更改. wsgi文件,而不是.py文件.我已经读过touch myapp.wsgi可以解决这个问题,但更一般地说我希望能够手动停止并重新启动)
我想暂时停止整个应用程序myapp.py(它的所有实例)
我不想用service apache2 stop它,因为我也用Apache 运行其他网站,而不仅仅是这个(我有几个VirtualHosts).出于同样的原因(我使用Apache运行其他网站,而某些客户端可能同时下载1 GB文件),我不希望这样做service apache2 restart会对使用Apache的所有网站产生影响.
我正在寻找比kill pidSIGTERM等更清洁的方式(因为我读过它不建议在这种情况下使用信号).
注意:我已经阅读了如何从mod_wsgi执行优雅的应用程序关闭,它有所帮助,但这里是补充问题,而不是重复.
我正在使用mod_wsgi在apache2上部署一个django项目,但问题是服务器不提供页面并在发出错误之前挂起10分钟:
End of script output before headers
Run Code Online (Sandbox Code Playgroud)
这是我的site-available/000-default.conf:
ServerAdmin webmaster@localhost
DocumentRoot /home/artfact/arTfact_webSite/
Alias /static /home/artfact/arTfact_webSite/static
<Directory /home/artfact/arTfact_webSite/static>
Order allow,deny
Allow from all
Require all granted
</Directory>
<Directory /home/artfact/arTfact_webSite>
Order allow,deny
Allow from all
<Files wsgi.py>
Require all granted
</Files>
</Directory>
WSGIDaemonProcess artfact_site processes=5 threads=25 python-path=/home/artfact/anaconda/lib/python2.7/site-packages/:/home/artfact/arTfact_webSite
WSGIProcessGroup artfact_site
WSGIScriptAlias / /home/artfact/arTfact_webSite/arTfact_webSite/wsgi.py
Run Code Online (Sandbox Code Playgroud)
settings.py
"""
Django settings for arTfact_webSite project.
Generated by 'django-admin startproject' using Django 1.8.5.
For more information on this file, see
https://docs.djangoproject.com/en/1.8/topics/settings/
For the full list of settings …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 Python 3.5.2 上使用 Django 和 mod_wsgi 在 Apache 2.4 上构建一个网站。但是当 apache 守护进程 httpd 启动时,会在 /var/log/httpd/error_log 上输出以下错误信息。
[Fri Sep 16 17:44:57.145900 2016] [wsgi:warn] [pid 20593] (13)Permission denied: mod_wsgi (pid=20593): Unable to stat Python home /home/ec2-user/.pyenv/versions/ 3.5.2. Python 解释器可能无法正确初始化。验证提供的路径和整个路径的访问权限。
致命的 Python 错误:Py_Initialize:无法获取语言环境编码
ImportError:没有名为“encodings”的模块
所以,我探索了一些关于类似问题的文章,例如
但上述错误信息的原因尚未解决。
请注明需要检查的要点或需要阅读的文件等。
我的开发环境如下。
(1) 主机和操作系统
(2) Django 项目
我在/home/ec2-user/django-sites目录中创建了名为testprj 的Django 项目 ,用户帐户为ec2-user。
[ec2-user@MyEC2 django-sites]$ pwd
/home/ec2-user/django-sites …Run Code Online (Sandbox Code Playgroud) mod-wsgi ×10
apache ×7
django ×7
python ×6
bottle ×1
django-admin ×1
flask ×1
mod-python ×1
pythonpath ×1
restart ×1
static ×1
wsgi ×1