我正在开发一个带有 nginx 反向代理和 Gunicorn 应用服务器的 Django 应用程序。作为一名新手 Web 开发人员,我需要将www流量重定向到no wwwWeb 服务器级别的帮助。我目前正在应用程序内的中间件级别执行相同的操作,但需要提高性能。
目前我的nginx虚拟主机文件布局如下:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=100m inactive=6m;
upstream my_server {
server unix:/home/myuser/myproject/myfolder/myproject.sock fail_timeout=0;
}
server {
listen 80;
server_name example.com www.example.com;
# a bunch of 'location' blocks e.g. 'location /' or 'location @http_proxy_to_app', etc.
}
server {
listen 443 ssl;
server_name example.com www.example.com;
# SSL related stuff
# a bunch of 'location' blocks e.g. 'location /' or 'location @http_proxy_to_app', etc.
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我如何将www 重定向到 no-www …
我在我的一台 Ubuntu 服务器上托管了几个 Django 站点。直到最近,我一直在使用 Cherokee HTTPd,它可以选择启动后端应用程序,如 Django 站点,但我刚刚切换到 nginx。
在 cherokee 下,我只是“运行”Django 站点(站点存储在 中/web/):
cd /web/mywebsite/; python manage.py runfcgi workdir=/web/mywebsite method=threaded socket=/web/mywebsite/sock pidfile=/web/mywebsite/pid maxspare=3 maxrequests=500
Run Code Online (Sandbox Code Playgroud)
然后我将连接到/web/mywebsite/sock. Cherokee 也以我选择的用户身份运行它,就我而言www-data。
在 Cherokee 下,这种方法对我很有效,但现在我要转向 nginx,我手头上没有什么东西可以进行流程管理。
环顾四周,实际上有数百种不同的管理方式。初始化脚本、cron 检查、daemontools。但是当我在 Ubuntu 上(可能永远都是)Upstart 似乎是有道理的......但我从哪里开始呢?
有人能给我一个新贵脚本的例子,它运行上面的脚本并且如果它死了会重新生成它吗?
我有几个 django 站点/web/(它们是该目录中唯一的目录)所以如果有一种欺骗方式我可以让这个新贵脚本启动它们(使用相同的设置)并监视它们,那就是超级超级棒。
我有一个使用 Nginx 和 Gunicorn 的 Django 应用程序“djngxgun”。我刚刚安装了 Supervisor,以便我可以使用它来管理我的 Gunicorn 进程。问题是在我重新启动服务器后,Supervisor 没有启动 Gunicorn。当我通过主管启动 Gunicorn 时(“sudo supervisorctl start djngxgun”),我看到在我的 Gunicorn error.log 文件中重复出现以下错误:
2014-02-28 15:36:47 [4753] [INFO] Starting gunicorn 18.0
Traceback (most recent call last):
File "/home/djngxgun/venv/djngxgun/bin/gunicorn", line 9, in <module>
load_entry_point('gunicorn==18.0', 'console_scripts', 'gunicorn')()
File "/home/djngxgun/venv/djngxgun/local/lib/python2.7/site-packages/gunicorn/app/wsgiapp.py", line 71, in run
WSGIApplication("%(prog)s [OPTIONS] [APP_MODULE]").run()
File "/home/djngxgun/venv/djngxgun/local/lib/python2.7/site-packages/gunicorn/app/base.py", line 143, in run
Arbiter(self).run()
File "/home/djngxgun/venv/djngxgun/local/lib/python2.7/site-packages/gunicorn/arbiter.py", line 172, in run
self.start()
File "/home/djngxgun/venv/djngxgun/local/lib/python2.7/site-packages/gunicorn/arbiter.py", line 124, in start
self.pidfile.create(self.pid)
File "/home/djngxgun/venv/djngxgun/local/lib/python2.7/site-packages/gunicorn/pidfile.py", line 38, in create
fd, fname = …Run Code Online (Sandbox Code Playgroud) 这能正常工作吗?
CELERYBEAT_SCHEDULE = {
'task-number-one': {
'task': 'project.users.tasks.send_something',
'schedule': crontab(minute='*/2880'),
}
}
Run Code Online (Sandbox Code Playgroud) 我有一台云服务器只托管一个网站(django + gunicorn + nginx),postgres 数据库将部署到另一台云服务器。
在这种情况下,我应该为我的网站创建特殊用户吗?似乎使用 root 更容易,并且它会带来更多的安全风险,但如果我只在那里托管一个应用程序,则不会太多?
我偶然发现了这个看似最相关的部署选项,因为指南似乎要么使用 python2 引用 mod_wsgi,要么在预期路径不同的基于 deb 的系统上进行部署。
所以我按照以下步骤操作:
#repos for python3.6, wsgi for python3.6
yum install epel-release centos-release-scl
#base packages
yum install python36 python36-devel httpd httpd-devel rh-python36-mod_wsgi
#python3.6 venv
cd /var/www;
python36 -m venv django-venv
source django-venv/bin/activate
pip3 install django
#apache config to support wsgi
edit /etc/httpd/conf/httpd.conf to include
LoadModule wsgi_module modules/mod_wsgi.so
Run Code Online (Sandbox Code Playgroud)
Apache 配置服务位于 /var/www/mysite 的 django 内容
<VirtualHost *:80>
ServerAdmin foo@mysite.com
ServerName mysite.com
ServerAlias www.mysite.com
WSGIDaemonProcess mysite python-home=/var/www/django-venv/ python-path=/var/www/django-venv/lib/python3.6/site-packages
WSGIProcessGroup mysite
WSGIScriptAlias / /var/www/mysite/mysite/wsgi.py
Alias /static /var/www/mysite/static
<Directory /var/www/mysite/mysite/static>
Require …Run Code Online (Sandbox Code Playgroud) 我有一个虚拟主机太多的服务器,大约 500 个虚拟主机,其中一半使用 SSL。
所有这些主机都使用 mod_wsgi 为 Django 应用程序提供服务。
我注意到在一定数量的虚拟主机之后,我的所有服务器都停止工作并且所有站点都崩溃了,我可以使用以下行来处理降低每个虚拟主机的线程数:
WSGIDaemonProcess my.domain python-home=/var/www/env python-path=/var/www/my_app threads=1
Run Code Online (Sandbox Code Playgroud)
apache 在达到大约 1300 个线程时崩溃(当我检查 htop 时)。apache的错误日志显示没有找到Django模块,但这不是真正的错误,因为一切正常,只是在vhosts数量过高时发生。所以我认为我在 Linux 中的进程或线程达到了某种限制。我使用的是 Ubuntu 18.04、Apache 2.4,并且有足够的 RAM 和 CPU,服务器有 4 GB 的 RAM 并且只使用了 2 GB,平均 CPU 为 10% 到 20%。
我还检查了我的线程最大限制:
cat /proc/sys/kernel/threads-max
30893
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能在不创建另一台服务器的情况下增加我的 apache 中虚拟主机的容量。
我的服务器默认运行 Python 2.4,我曾经make altinstall为我的 Django webapp 安装一个备用的 Python 2.6。
但是, mod_wsgi 似乎默认使用/usr/bin/python(2.4) 而不是/usr/local/bin/python2.6.
有没有一种简单的方法可以强制 mod_wsgi 使用 Python 2.6?
我正在尝试从我的 django 应用程序发送电子邮件。
但是,这不适用于我的 NGINX(用于静态资源)+ GUNICORN 服务器。
但是,同样适用于 django 的默认网络服务器。到目前为止,我还没有设置邮件服务器本身。
我不确定问题是什么。
让我解释整个情况,因为这个问题没有得到很好的解释。
如果我使用默认调试 WSGI 从 Django 中的 Web 应用程序发送电子邮件,
和以下代码
from django.core.mail import send_mail
send_mail('Subject here', 'Here is the message.', 'from@example.com',
['to@example.com'], fail_silently=False)
Run Code Online (Sandbox Code Playgroud)
我可以发送电子邮件。
但是,我已经设置了一个 nginx 服务器和一个 gunicorn wsgi。我无法发送邮件。
我的 nginx.conf 看起来像这样
server {
listen 80;
listen 443;
listen 587;
server_name 172.17.110.205;
client_max_body_size 0M;
access_log /home/msrb_db/msrb_db_application/access.log;
error_log /home/msrb_db/msrb_db_application/error.log;
location /static {
root /home/msrb_db/msrb_db_application;
}
location / {
proxy_pass http://172.17.110.205:8080;
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个 gunicorn 服务器作为系统文件,其工作方式如下
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=msrb_db …Run Code Online (Sandbox Code Playgroud) django ×9
python ×4
mod-wsgi ×3
gunicorn ×2
nginx ×2
301-redirect ×1
apache-2.4 ×1
celery ×1
centos7 ×1
email ×1
email-server ×1
linux ×1
redirect ×1
root ×1
security ×1
supervisord ×1
ubuntu ×1
upstart ×1