我试图找到一些关于在linode上设置多个django站点的正确方法的信息(Ubuntu 12.04.3 LTS(GNU/Linux 3.9.3-x86_64-linode33 x86_64)
这就是我现在拥有的:
网络服务器:nginx
每个站点都包含在.virtualenv中
在每个.virtualenv中使用pip安装Django和其他软件包
使用RabbitMQ进行安装sudo apt-get rabbitmq,并为每个站点创建一个新用户和vhost.
每个站点都使用supervisor脚本启动:
[group:<SITENAME>]
programs=<SITENAME>-gunicorn, <SITENAME>-celeryd, <SITENAME>-celerycam
[program:<SITENAME>-gunicorn]
directory = /home/<USER>/.virtualenvs/<SITENAME>/<PROJECT>/
command=/home/<USER>/.virtualenvs/<SITENAME>/bin/gunicorn <PROJECT>.wsgi:application -c /home/<USER>/.virtualenvs/<SITENAME>/<PROJECT>/server_conf/<SITENAME>-gunicorn.py
user=<USER>
autostart = true
autorestart = true
stderr_events_enabled = true
redirect_stderr = true
logfile_maxbytes=5MB
[program:<SITENAME>-celeryd]
directory=/home/<USER>/.virtualenvs/<SITENAME>/<PROJECT>/
command=/home/<USER>/.virtualenvs/<SITENAME>/bin/python /home/<USER>/.virtualenvs/<SITENAME>/<PROJECT>/manage.py celery worker -E -n <SITENAME> --broker=amqp://<SITENAME>:<SITENAME>@localhost:5672//<SITENAME> --loglevel=ERROR
environment=HOME='/home/<USER>/.virtualenvs/<SITENAME>/<PROJECT>/',DJANGO_SETTINGS_MODULE='<PROJECT>.settings.staging'
user=<USER>
autostart=true
autorestart=true
startsecs=10
stopwaitsecs = 600
[program:<SITENAME>-celerycam]
directory=/home/<USER>/.virtualenvs/<SITENAME>/<PROJECT>/
command=/home/<USER>/.virtualenvs/<SITENAME>/bin/python /home/<USER>/.virtualenvs/<SITENAME>/<PROJECT>/manage.py celerycam
environment=HOME='/home/<USER>/.virtualenvs/<SITENAME>/<PROJECT>/',DJANGO_SETTINGS_MODULE='<PROJECT>.settings.staging'
user=<USER>
autostart=true
autorestart=true
startsecs=10
Run Code Online (Sandbox Code Playgroud)
问题1:这是正确的方法吗?或者这是一个更好的方法吗?
问题2:我曾尝试安装芹菜花,但这对多个网站有何影响?我是否需要为每个.virtualenv安装一个花包,或者我可以为每个站点使用一个安装吗?如何设置nginx以在我的服务器上显示花页?
目前我有3个linode服务器:
1:缓存服务器(Ubuntu,清漆)
2:App服务器(Ubuntu,nginx,rabbitmq-server,python,php5-fpm,memcached)
3:数据库服务器(Ubuntu,postgresql + pg_bouncer)
在我的app-server上,我有多个站点(topdomains).每个站点都在使用virtualenvwrapper创建的虚拟环境中.有些网站很大,流量很大,有些网站很小,流量很小.
一个典型的网站包括蟒蛇(django),芹菜(殴打,花)和gunicorn.
我现在的开发模式现在正在app-server上的临时环境中工作,并将更改提交给git.然后将环境更改为生产环境并执行a git pull,./manage.py migrate并重新启动流程sudo supervisorctl restart sitename:,但这需要时间!必须有一个更简单的方法!
因此,似乎docker可以帮助简化一切,但我无法决定如何管理每个站点内的所有站点和容器的最佳方法.
我查看了http://panamax.io和https://github.com/progrium/dokku,但不确定其中一个是否符合我的需求.
理想情况下,我会在本地计算机上运行每个站点的开发版本(模拟缓存服务器,app-server和db-server),在那里进行代码更改并测试它们.当我看到更改工作时,我会执行一个命令,它将执行所有繁重的工作并将更改发送到linode服务器(我认为主要是app-server),执行所有迁移并在服务器上重新启动项目.
任何人都可以指出我正确的方向如何实现这一目标?
我用docker run启动了一个docker容器,如下所示:
docker run \
-d \
--name plex \
--restart unless-stopped \
--network=host \
-e TZ="<timezone>" \
-e PLEX_CLAIM="<claimToken>" \
-v <path/to/plex/database>:/config \
-v <path/to/transcode/temp>:/transcode \
-v <path/to/media>:/data \
plexinc/pms-docker
Run Code Online (Sandbox Code Playgroud)
链接到GitHub.com/plexinc/pms-docker
docker容器正在运行,因为我能够访问端口和服务,但我似乎无法在运行时列出容器sudo docker ps -a或sudo docker ps -aq或sudo docker ps --filter "name=plex"
我试着运行pstree,得到了这个输出:
systemd???accounts-daemon???2*[{accounts-daemon}]
??agetty
??atd
??containerd???14*[{containerd}]
??cron
??dbus-daemon
??dockerd???docker-containe???docker-containe???s6-svscan???s6-supervise
? ? ? ? ??s6-supervise???python???{python}
? ? ? ??9*[{docker-containe}]
? ? ??17*[{docker-containe}]
? ??docker-proxy???6*[{docker-proxy}]
? ??21*[{dockerd}]
??dockerd???containerd???containerd-shim???s6-svscan???s6-supervise
? ? ? ? ??s6-supervise???sh???Plex …Run Code Online (Sandbox Code Playgroud) 我试着编写一个查询来从列表中过滤/排除某些对象,但是我收到了一个错误.
我的模特:
class Benefit(TimeStampedModel):
DEAL = 'D'
NODEAL = 'N'
TYPE_CHOICES = (
(NODEAL, 'Does not need any signed deal'),
(DEAL, 'Needs a signed deal'),
)
name = models.CharField(max_length=200)
benefit_type = models.CharField(max_length=1, choices=TYPE_CHOICES, default=DEAL)
class Profile(models.Model):
user = models.OneToOneField(User)
benefits = models.ManyToManyField(Benefit, verbose_name="Used benefits", blank=True, null=True, related_name="used_benefit")
Run Code Online (Sandbox Code Playgroud)
我的看法:
class ProfilePage(TemplateView):
template_name = "profile/frontpage.html"
def get_context_data(self, **kwargs):
context = super(ProfileFrontpage, self).get_context_data(**kwargs)
context['unused_benefits'] = Benefit.objects.filter(used_benefit__isnull=True).exclude(benefit_type=='N')
context['nodeal_benefits'] = Benefit.objects.filter(benefit_type=='N')
return context
Run Code Online (Sandbox Code Playgroud)
但它没有用.我收到此错误:global name 'benefit_type' is not defined
我不确定为什么会收到这个错误?我不认为我需要制作模型字段的变量?
我有一个简单的形式有些麻烦.如果字段为空,我似乎无法阻止表单提交.有没有一种简单的方法来检查字段是否为空,然后阻止表单提交?
这是我的html表单:
<form method="post" name="simpleForm" id="simpleForm" action="handler.php">
<fieldset>
<legend>Info</legend>
<p><label for="name">Name</label><br>
<input id="name" name="name" class="text" /></p>
<p><label for="email">Email</label><br>
<input id="email" name="email" class="text" /></p>
<legend>Questions</legend>
<p><label for="qs_1">Question 1</label><br>
<input id="qs_1" name="qs_1" class="text" /></p>
<p><label for="qs_2">Question 2</label><br>
<input id="qs_2" name="qs_2" class="text" /></p>
<p><label for="qs_3">Question 3</label><br>
<input id="qs_3" name="qs_3" class="text" /></p>
</fieldset>
<p><input type="submit" name="submit" value="Send" id="sub_btn" /></p>
</form>
Run Code Online (Sandbox Code Playgroud)
这是我的javascript:
$("form#simpleForm").submit(function() {
var name = $('#name').attr('value');
var email = $('#email').attr('value');
var qs_1 = $('#qs_1').attr('value');
var qs_2 = $('#qs_2').attr('value');
var qs_3 = $('#qs_3').attr('value');
$.ajax({ …Run Code Online (Sandbox Code Playgroud) 这是我的gonicorn.conf,但我似乎无法正确使用命令.当我在命令行中键入它时,Im尝试的命令正在工作,但不是作为Supervisor命令.
[program:gunicorn]
directory = /home/USER/.virtualenvs/SITE/myApp/
command=/home/USER/.virtualenvs/SITE/bin/python /home/USER/.virtualenvs/SITE/myApp/manage.py run_gunicorn myApp.wsgi:application -c /home/USER/.virtualenvs/SITE/myApp/gunicorn.conf.py
user = USER
autostart = true
autorestart = true
redirect_stderr = true
stdout_logfile = /home/USER/logs/gunicorn.log
stderr_logfile = /home/USER/logs/gunicorn_err.log
Run Code Online (Sandbox Code Playgroud)
gunicorn的正确命令是什么?
这是我尝试启动gunicorn时得到的错误:
/home/USERNAME/.virtualenvs/SITE/local/lib/python2.7/site-packages/sorl/thumbnail/helpers.py:5: DeprecationWarning: django.utils.simplejson is deprecated; use json instead.
from django.utils import simplejson
2013-02-25 13:46:55 [3975] [INFO] Starting gunicorn 0.17.2
2013-02-25 13:46:55 [3975] [INFO] Listening at: http://127.0.0.1:8000 (3975)
2013-02-25 13:46:55 [3975] [INFO] Using worker: sync
2013-02-25 13:46:55 [3988] [INFO] Booting worker with pid: 3988
2013-02-25 13:46:55 [3988] [ERROR] Exception in …Run Code Online (Sandbox Code Playgroud) 我有这个字符串:tag:domain.com,2012-10-12:feed/channel/id/335
我试图将此字符串中的最后一位数字转换为变量.此字符串中的日期也是动态的,但我不需要在变量中.
这是我的代码:
$string = "tag:domain.com,2012-10-12:feed/channel/id/335";
preg_match(?'/tag\:domain\.com,|\d+|-|\d+|-|\d+|\:feed\/channel\/id\/|\d+/', $string, $matches);
$last_digits = ???
Run Code Online (Sandbox Code Playgroud)
也许有一种更简单的方法可以做到这一点?
我试图让NewRelic python代理与我的设置与主管和gunicorn一起工作,但无法让它工作.
以下是我当前的主管设置:
[program:gunicorn]
directory = /home/<USER>/.virtualenvs/<DOMAIN>/myproject/
command=/home/<USER>/.virtualenvs/<DOMAIN>/bin/gunicorn my_project.wsgi:application
Run Code Online (Sandbox Code Playgroud)
我试着这样做:
[program:gunicorn]
directory = /home/<USER>/.virtualenvs/<DOMAIN>/myproject/
#Working command
#command=/home/<USER>/.virtualenvs/<DOMAIN>/bin/gunicorn myproject.wsgi:application
command=/home/<USER>/.virtualenvs/<DOMAIN>/bin/newrelic-admin run-program /home/<USER>/.virtualenvs/<DOMAIN>/bin/gunicorn myproject.wsgi:application
environment=NEW_RELIC_CONFIG_FILE=/home/<USER>/.virtualenvs/<DOMAIN>/myproject/newrelic.ini
user = <USER>
autostart = true
autorestart = true
stderr_events_enabled = true
redirect_stderr = true
stdout_logfile = /home/<USER>/logs/gunicorn.log
stderr_logfile = /home/<USER>/logs/gunicorn_err.log
Run Code Online (Sandbox Code Playgroud)
但后来我收到这个错误:
Traceback (most recent call last):
File "/home/user/.virtualenvs/domain.com/lib/python2.7/site.py", line 688, in <module>
main()
File "/home/user/.virtualenvs/domain.com/lib/python2.7/site.py", line 679, in main
execsitecustomize()
File "/home/user/.virtualenvs/domain.com/lib/python2.7/site.py", line 547, in execsitecustomize
import sitecustomize
File "/home/user/.virtualenvs/domain.com/local/lib/python2.7/site-packages/newrelic-1.10.2.38-py2.7-linux-x86_64.egg/newrelic/bootstrap/sitecustomize.py", line 74, in <module>
newrelic.agent.initialize(config_file, environment) …Run Code Online (Sandbox Code Playgroud) 我有一个从 rss 文件导入数据的脚本,我想在插入之前清空我的表,所以我的数据库中没有任何旧条目,但我无法获得正确的语法,因为没有删除任何内容。
这是我正在尝试的:
try {
$db->beginTransaction();
$stmt = $db->prepare("DELETE FROM $table");
$stmt = $db->prepare("INSERT INTO $table(id,name) VALUES(:id,:name)ON DUPLICATE KEY UPDATE name=:name");
$stmt->execute(array(':id' => $id, ':name' => $name));
$db->commit();
} catch(PDOException $ex) {
//Something went wrong rollback!
$db->rollBack();
echo $ex->getMessage();
}
Run Code Online (Sandbox Code Playgroud)
我尝试过使用 Truncate,但认为我需要删除,因为 truncate 不会清空/删除任何内容:
try {
$db->beginTransaction();
$stmt = $db->prepare("TRUNCATE TABLE $table");
$stmt = $db->prepare("INSERT INTO $table(id,name) VALUES(:id,:name)ON DUPLICATE KEY UPDATE name=:name");
$stmt->execute(array(':id' => $id, ':name' => $name));
$db->commit();
} catch(PDOException $ex) {
//Something went wrong rollback!
$db->rollBack(); …Run Code Online (Sandbox Code Playgroud) 我试图让 pgbouncer 在我的独立 postgresql 服务器上工作,但是当我尝试使用 pgbouncer 端口连接到数据库时,出现超时错误。
PostgreSQL: 9.1.8
pgBouncer:1.4.2
操作系统:Ubuntu 12.04.2 LTS (GNU/Linux 3.8.4-x86_64-linode31 x86_64)
这是我的 conf 文件:
[databases]
postgres = host=127.0.0.1 port=5432 dbname=postgres
mydb = host=127.0.0.1 port=5432 dbname=mydb
[pgbouncer]
logfile = /home/username/pg_log/pgbouncer.log
pidfile = /tmp/pgbouncer.pid
listen_addr = xxx.xxx.xxx.xxx
listen_port = 6432
unix_socket_dir = /var/run/postgresql
auth_type = md5
auth_file = /etc/pgbouncer/userlist.txt
admin_users = postgres
stats_users = stats, root
user = postgres
pool_mode = session
server_reset_query = DISCARD ALL
max_client_conn = 1000
default_pool_size = 20
log_connections = 1
log_disconnections = …Run Code Online (Sandbox Code Playgroud) 我有一个只显示价格的html表单,但不向服务器提交任何内容.这现在工作正常.
如何仅从url变量添加运行此表单的功能,因此如果您使用url变量来到此页面,则不必单击"提交"按钮?
这样的事情:www.my-domain.com/formurl/?smoker=yes&amount=500000&age=20应该在页面加载完成后显示价格,并根据url变量更改表单值.
这是我的HTML:
<form class="form-horizontal">
<label class="control-label" for="smoker">Do you smoke?</label>
<select id="smoker" name="smoker"><option value="No">No</option><option value="Yes">Yes</option></select>
<label class="control-label" for="amount">Amount</label>
<select id="amount" name="amount"><option value="500000">500 000</option><option value="1000000">1 000 000</option><option value="1500000">1 500 000</option><option value="2000000">2 000 000</option></select>
<label class="control-label" for="age">Age</label>
<input id="age" name="age" type="text" />
<button class="btn" id="calc" type="submit">Show price</button>
</form>
<div class="alert alert-info hide" id="price-result"></div>
Run Code Online (Sandbox Code Playgroud)
$(document).ready(function () {
//JSON object
var obj = {"data":
[
{"age": "18","500000": "645","1000000": "1018","1500000": "1391","2000000": "1764","smoker": "No"},
{"age": "19","500000": "645","1000000": "1018","1500000": "1391","2000000": "1764","smoker": "No"},
{"age": "20","500000": "645","1000000": "1018","1500000": …Run Code Online (Sandbox Code Playgroud) 我有一个 IntegerField,我希望输入只接受 11 位数字/数字的值。
我试图在该领域制作一个正则表达式验证器,但我的问题是当我尝试使用该领域制作模型表单时。如果值为 10 位或更少,我只会收到验证错误,但如果我尝试使用 12 位及以上的值,则不会收到任何验证错误。
这是我的模型字段:
number = models.IntegerField(max_length=11, validators=[RegexValidator(r'\d{11,11}','Number must be 11 digits','Invalid number')])
Run Code Online (Sandbox Code Playgroud)
如果值超过 11 位,我该如何做到这一点,以便我收到验证错误?
我创建了一个配置文件模型来扩展默认的django用户(使用django 1.6)但是我无法正确保存配置文件模型.
这是我的模型:
from django.contrib.auth.models import User
class Profile(models.Model):
user = models.OneToOneField(User)
mobilephone = models.CharField(max_length=20, blank=True)
Run Code Online (Sandbox Code Playgroud)
这是我的celery-task,用于从wdsl文件更新personrecords:
@task()
def update_local(user_id):
url = 'http://webservice.domain.com/webservice/Person.cfc?wsdl'
try:
#Make SUDS.Client from WSDL url
client = Client(url)
except socket.error, exc:
raise update_local.retry(exc=exc)
except BadStatusLine, exc:
raise update_local.retry(exc=exc)
#Make dict with parameters for WSDL query
d = dict(CustomerId='xxx', Password='xxx', PersonId=user_id)
try:
#Get result from WSDL query
result = client.service.GetPerson(**d)
except (socket.error, WebFault), exc:
raise update_local.retry(exc=exc)
except BadStatusLine, exc:
raise update_local.retry(exc=exc)
#Soup the result
soup = BeautifulSoup(result) …Run Code Online (Sandbox Code Playgroud)