秦悦明的运维笔记

nginx+uwsgi部署django应用

0.安装uwsgi

1
pip install uwsgi

1.配置uwsgi

这里写到ini文件里面去。

1
2
3
4
5
6
7
8
9
[uwsgi]
chdir=/opt/zm_cmdb/zm_cmdb
module=zm_cmdb.wsgi:application
master=True
pidfile=/tmp/project-master.pid
vacuum=True
max-requests=5000
daemonize=/tmp/zm_cmdb.log
socket=/tmp/uwsgi.sock

2.nginx配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server {
listen 80;
server_name localhost;
access_log /var/log/aca/access_log;
access_log /var/log/aca/error_log;
location /static/ {
alias /opt/zm_cmdb/zm_cmdb/static/;
}
location / {
uwsgi_pass unix:/tmp/uwsgi.sock;
include uwsgi_params;
}
}

django static + apache mod_wsgi部署

0.基本配置

/path/to/mysite.com/是项目路径。替换成实际的就好了。

1
2
3
4
5
6
7
8
WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py
WSGIPythonPath /path/to/mysite.com
<Directory /path/to/mysite.com/mysite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>

另外如果你用apache2.2,那么需要改Require语法。

1
2
3
4
<Files wsgi.py>
Allow from all
Order deny,allow
</Files>

1.静态文件

在setting.py文件中定义STATIC_ROOT

1
STATIC_ROOT = "/var/www/example.com/static/"

生成静态文件

1
python manage.py collectstatic

然后用apache的Alias就可以了。

1
2
Alias /media/ /path/to/mysite.com/media/
Alias /static/ /path/to/mysite.com/static/

nginx多重条件判断

nginx配置语法里面的if其实是不支持逻辑与,或操作的。但是可以通过set变量的方式绕过去。实例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if ($http_user_agent ~ "^Mozilla/5.0" ) {
set $test 1;
}
if ($request_uri ~ "sendSMS")
{
set $test "${test}2";
}
if ($request_uri !~ "vcode")
{
set $test "${test}3" ;
}
if ($test = 123)
{
return 403;
}

代码用于屏蔽所有Mozilla的agent发起的sendSMS uri的请求,并且uri中没有包含vcode信息的请求。直接会被返回403。这里要注意的是set操作进行的是不是算数操作,而是字符串拼接。
当然,如果是做合法性校验,应该也要在后端代码里面做。

ldap安装配置

0.安装

1
2
3
4
yum install -y openldap openldap-servers
yum install migrationtools -y
cp /usr/share/openldap-servers/slapd.conf.obsolete /etc/openldap/slapd.conf
rm -rf /etc/openldap/slapd.d

1.修改slap.conf

1
2
3
4
5
suffix ...
rootdn ...
rootpw ...
allow bind_v2
disallow bind_anon 禁止匿名用户登录

2. 使用migrationtools导入基本的资料

修改migrate_common.ph :

1
$DEFAULT_BASE

然后用pl脚本生成ldif ,ldapadd 导入

1
2
./migrate_base.pl > base.ldif
ldapadd -x -D "cn=admin,cd=zhaimi,dc=com" -W -f base.ldif

3. 之后用软件创建用户设置密码就行了,非常方便。

我使用ldapadmin 。一个win下的开源软件,mac下暂时没有找到很好的开源软件。

4. 记录日志

默认openldap把日志发到local4了,需要在rsyslog服务器中配置保存到文件:

1
local4.* -/var/log/ldap/ldap.log

重启rsyslog生效。

5. 后记。

这东西还是挺好用的,用来做统一认证非常爽。企业越早开始用收益越大。

[python]ConfigParser模块

ConfigParser模块

https://docs.python.org/2/library/configparser.html

用法超简单
构造一个ConfigParser对象,然后read就行了,可以读多个文件。然后用一系列方法来取参数,

  • config.get
  • config.getint
  • config.getfloat
  • config.getboolean
1
2
3
4
5
import ConfigParser, os
config = ConfigParser.ConfigParser()
config.readfp(open('defaults.cfg'))
config.read(['site.cfg', os.path.expanduser('~/.myapp.cfg')])

如果要写的话用RawConfigParser,官方网站也有一个很好的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import ConfigParser
config = ConfigParser.RawConfigParser()
# When adding sections or items, add them in the reverse order of
# how you want them to be displayed in the actual file.
# In addition, please note that using RawConfigParser's and the raw
# mode of ConfigParser's respective set functions, you can assign
# non-string values to keys internally, but will receive an error
# when attempting to write to a file or when you get it in non-raw
# mode. SafeConfigParser does not allow such assignments to take place.
config.add_section('Section1')
config.set('Section1', 'an_int', '15')
config.set('Section1', 'a_bool', 'true')
config.set('Section1', 'a_float', '3.1415')
config.set('Section1', 'baz', 'fun')
config.set('Section1', 'bar', 'Python')
config.set('Section1', 'foo', '%(bar)s is %(baz)s!')
# Writing our configuration file to 'example.cfg'
with open('example.cfg', 'wb') as configfile:
config.write(configfile)