Python运行环境安装配置

安装uWsgi

uWsgi安装

uWsig的官方目录在http://projects.unbit.it/downloads/,在目录里可以看到现在最新版本是2.0.13,那就安装最新版本

1
2
3
4
5
wget http://projects.unbit.it/downloads/uwsgi-2.0.13.1.tar.gz
tar -zxvf uwsgi-2.0.13.1.tar.gz
cd uwsgi-2.0.13.1
make
cp uwsgi /usr/bin

检查uWsgi安装情况

1
2
[root@/root/apps/uwsgi-2.0.13.1]whereis uwsgi
uwsgi: /usr/bin/uwsgi

推荐使用安装方式,上面的方式安装,经过测试用ini文件无法启动

1
pip install uwsgi

配置uWsig

uwsgi支持ini、xml等多种配置方式,但个人感觉ini更方便;在/ect/目录下新建uwsgi9090.ini,添加如下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[uwsgi]
socket = 127.0.0.1:9090
//主进程
master = true
//多站模式
vhost = true
//多站模式时不设置入口模块和文件
no-stie = true
//子进程数
workers = 2
reload-mercy = 10
//退出、重启时清理文件
vacuum = true
max-requests = 1000
limit-as = 512
buffer-sizi = 30000
//pid文件,用于下面的脚本启动、停止该进程
pidfile = /var/run/uwsgi9090.pid
daemonize = /home/wwwlogs/uwsgi9090.log

上面的配置文件中也可以指定python的运行环境:

1
virtualenv = /home/www/wwwenv

当然也可放在nginx中,每个应用单独执行,更灵活。

启动uWsgi

设置uwsgi开机启动,在/ect/init.d/目录下新建uwsgi9090文件,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#! /bin/sh
# chkconfig: 2345 55 25
# Description: Startup script for uwsgi webserver on Debian. Place in /etc/init.d and
# run 'update-rc.d -f uwsgi defaults', or use the appropriate command on your
# distro. For CentOS/Redhat run: 'chkconfig --add uwsgi'

### BEGIN INIT INFO
# Provides: uwsgi
# Required-Start: $all
# Required-Stop: $all
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts the uwsgi web server
# Description: starts uwsgi using start-stop-daemon
### END INIT INFO

# Author: licess
# website: http://lnmp.org

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DESC="uwsgi daemon"
NAME=uwsgi9090
DAEMON=/usr/local/bin/uwsgi
CONFIGFILE=/etc/$NAME.ini
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

set -e
[ -x "$DAEMON" ] || exit 0

do_start() {
$DAEMON $CONFIGFILE || echo -n "uwsgi already running"
}

do_stop() {
$DAEMON --stop $PIDFILE || echo -n "uwsgi not running"
rm -f $PIDFILE
echo "$DAEMON STOPED."
}

do_reload() {
$DAEMON --reload $PIDFILE || echo -n "uwsgi can't reload"
}

do_status() {
ps aux|grep $DAEMON
}

case "$1" in
status)
echo -en "Status $NAME: \n"
do_status
;;
start)
echo -en "Starting $NAME: \n"
do_start
;;
stop)
echo -en "Stopping $NAME: \n"
do_stop
;;
reload|graceful)
echo -en "Reloading $NAME: \n"
do_reload
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|reload}" >&2
exit 3
;;
esac

exit 0

然后在终端执行:

1
2
3
4
5
chmod 755 uwsgi9090 
-- 添加服务
chkconfig --add uwsgi9090
-- 设置开机启动
chkconfig uwsgi9090 on

在nginx中配置uWsgi

在nginx的config中指定使用uwsgi服务,配置重点如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server {
listen 80;
server_name localhost;

location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:9090; //必须和uwsgi中的设置一致
uwsgi_param UWSGI_PYHOME /home/www/wwwenv; //uwsgi的python与运行环境
uwsgi_param UWSGI_SCRIPT default.wsgi; //入口文件,即wsgi.py相对于项目根目录的位置,“.”相当于一层目录
uwsgi_param UWSGI_CHDIR /mysite; //项目根目录
index index.html index.htm;
client_max_body_size 35m;
}
}

重要参考文章:
http://www.cnblogs.com/xiongpq/p/3381069.html
http://heipark.iteye.com/blog/1847421

安装MySQL-python

1
2
3
4
###pip install MySQL-python  ##这种安装方式无法修改配置文件
wget https://pypi.python.org/packages/a5/e9/51b544da85a36a68debe7a7091f068d802fc515a3a202652828c73453cad/MySQL-python-1.2.5.zip
unzip MySQL-python-1.2.5.zip
cd MySQL-python-1.2.5

报错:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@/root]pip install MySQL-python
Collecting MySQL-python
Downloading MySQL-python-1.2.5.zip (108kB)
100% |################################| 112kB 213kB/s
Complete output from command python setup.py egg_info:
sh: mysql_config: command not found
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/tmp/pip-build-d869_H/MySQL-python/setup.py", line 17, in <module>
metadata, options = get_config()
File "/tmp/pip-build-d869_H/MySQL-python/setup_posix.py", line 43, in get_config
libs = mysql_config("libs_r")
File "/tmp/pip-build-d869_H/MySQL-python/setup_posix.py", line 25, in mysql_config
raise EnvironmentError("%s not found" % (mysql_config.path,))
EnvironmentError: mysql_config not found
----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-d869_H/MySQL-python/

此时执行 find / -name mysql_config 在/usr/bin/下发现了这个文件

1
2
3
[root@/root]find / -name mysql_config 
/root/lnmp1.2-full/src/mysql-5.5.42/scripts/mysql_config
/usr/local/mysql/bin/mysql_config

然后修改MySQL-python-1.2.3目录下的site.cfg文件

去掉mysql_config=XXX这行的注释,并改成mysql_config=/usr/local/mysql/bin/mysql_config(以mysql_config文件所在机器上的目录为准)

执行下面命令,此时可以成功编译安装了:

1
2
3
4
5
6
7
8
9
python setup.py build
python setup.py install
cd ..
[root@/root]python
Python 2.7.9 (default, May 13 2016, 14:51:03)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-16)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import MySQLdb
>>>

#安装Django

1
pip install Django

现在的最新版本是1.9.6,安装日志如下:

1
2
3
4
5
6
7
[root@/root]pip install Django
Collecting Django
Downloading Django-1.9.6-py2.py3-none-any.whl (6.6MB)
100% |################################| 6.6MB 100kB/s
Installing collected packages: Django
Successfully installed Django-1.9.6
[root@/root]

#安装redis服务以及工具

安装redis服务

1
2
3
4
5
6
wget http://download.redis.io/releases/redis-3.2.0.tar.gz
tar xzf redis-3.2.0.tar.gz
cd redis-3.2.0
make
make install
cp redis.conf /etc/

说明
make install命令执行完成后,会在/usr/local/bin目录下生成本个可执行文件,分别是redis-server、redis-cli、redis-benchmark、redis-check-aof 、redis-check-dump,它们的作用如下:
redis-server:Redis服务器的daemon启动程序
redis-cli:Redis命令行操作工具。也可以用telnet根据其纯文本协议来操作
redis-benchmark:Redis性能测试工具,测试Redis在当前系统下的读写性能
redis-check-aof:数据修复
redis-check-dump:检查导出工具

修改系统配置文件,执行命令

echo vm.overcommit_memory=1 >> /etc/sysctl.conf
然后应用生效:
sysctl –p
否则无法启动服务。
使用数字含义:
0,表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1,表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2,表示内核允许分配超过所有物理内存和交换空间总和的内存

修改redis配置文件
1
2
cd /etc
vi redis.conf

修改daemonize yes—目的使进程在后台运行
参数介绍:
daemonize:是否以后台daemon方式运行
pidfile:pid文件位置
port:监听的端口号
timeout:请求超时时间
loglevel:log信息级别
logfile:log文件位置
databases:开启数据库的数量
save * :保存快照的频率,第一个表示多长时间,第三个*表示执行多少次写操作。在一定时间内执行一定数量的写操作时,自动保存快照。可设置多个条件。
rdbcompression:是否使用压缩
dbfilename:数据快照文件名(只是文件名,不包括目录)
dir:数据快照的保存目录(这个是目录)
appendonly:是否开启appendonlylog,开启的话每次写操作会记一条log,这会提高数据抗风险能力,但影响效率。
appendfsync:appendonlylog如何同步到磁盘(三个选项,分别是每次写都强制调用fsync、每秒启用一次fsync、不调用fsync等待系统自己同步)

启动redis
1
2
3
4
5
6
7
8
cd /usr/local/bin
./redis-server /etc/redis.conf
--启动客户端测试
redis-cli
redis> set foo bar
OK
redis> get foo
"bar"
检查是否启动成功
1
ps -ef | grep redis
创建自启动脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#!/bin/sh
#chkconfig: 345 86 14
#description: Startup and shutdown script for Redis

PROGDIR=/usr/local/bin #安装路径
PROGNAME=redis-server
DAEMON=$PROGDIR/$PROGNAME
CONFIG=/etc/redis.conf
PIDFILE=/var/run/redis.pid
DESC="redis daemon"
SCRIPTNAME=/etc/rc.d/init.d/redis

start()
{
if test -x $DAEMON
then
echo -e "Starting $DESC: $PROGNAME"
if $DAEMON $CONFIG
then
echo -e "OK"
else
echo -e "failed"
fi
else
echo -e "Couldn't find Redis Server ($DAEMON)"
fi
}

stop()
{
if test -e $PIDFILE
then
echo -e "Stopping $DESC: $PROGNAME"
if kill `cat $PIDFILE`
then
echo -e "OK"
else
echo -e "failed"
fi
else
echo -e "No Redis Server ($DAEMON) running"
fi
}

restart()
{
echo -e "Restarting $DESC: $PROGNAME"
stop
start
}

list()
{
ps aux | grep $PROGNAME
}

case $1 in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
list)
list
;;

*)
echo "Usage: $SCRIPTNAME {start|stop|restart|list}" >&2
exit 1
;;
esac
exit 0

在/etc/init.d/中创建redis,然后赋权,添加自启动

1
2
3
4
chmod +x ./redis
chkconfig --add redis
chkconfig --level 345 redis on
chkconfig --list redis

安装django的redis插件“django-redis”

参考地址:https://pypi.python.org/pypi/django-redis

1
pip install django-redis

安装日志如下:

1
2
3
4
5
6
7
8
[root@/root]pip install django-redis
Collecting django-redis
Downloading django-redis-4.4.2.tar.gz (53kB)
100% |################################| 61kB 208kB/s
Requirement already satisfied (use --upgrade to upgrade): redis>=2.10.0 in /usr/local/lib/python2.7/site-packages (from django-redis)
Installing collected packages: django-redis
Running setup.py install for django-redis ... done
Successfully installed django-redis-4.4.2

django的配置方法

1
2
3
4
5
6
7
8
9
10
11
12
13
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}

REDIS_TIMEOUT=7*24*60*60
CUBES_REDIS_TIMEOUT=60*60
NEVER_REDIS_TIMEOUT=365*24*60*60

安装python的redis类库

可以使用“pip install redis”安装python的redis模块。Parser可以控制如何解析redis响应的内容。redis-py包含两个Parser类,PythonParser和HiredisParser。默认,如果已经安装了hiredis模块,redis-py会使用HiredisParser,否则会使用PythonParser。HiredisParser是C编写的,由redis核心团队维护,性能要比PythonParser提高10倍以上,所以推荐使用。通过“pip install hiredis”可以安装HiredisParser模块。

1
2
pip install redis
pip install hiredis

最简单的实例:

1
2
3
4
5
6
In [1]:  import redis
In [2]: r = redis.StrictRedis(host='127.0.0.1', port=6379)
In [3]: r.set('foo', 'bar')
Out[3]: True
In [4]: r.get('foo')
Out[4]: 'bar'

安装PIL

先安装类库

1
yum install libjpeg-devel freetype-devel libpng-devel

再安装PIL

1
pip install PIL --allow-external PIL --allow-unverified PIL

然而报错如下:

1
No matching distribution found for PIL

只好使用老办法:

1
2
wget http://effbot.org/downloads/Imaging-1.1.7.tar.gz
tar -xzvf Imaging-1.1.7.tar.gz

修改setup.py文件

1
2
JPEG_ROOT = libinclude("/usr/local")
FREETYPE_ROOT = '/usr/lib64','/usr/include/freetype2/freetype'

安装

1
2
3
python setup.py build_ext -i
-- FREETYPE2 support available 注意这一项
python setup.py install

安装后提示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
PIL 1.1.7 SETUP SUMMARY
--------------------------------------------------------------------
version 1.1.7
platform linux2 2.7.9 (default, May 13 2016, 14:51:03)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-16)]
--------------------------------------------------------------------
*** TKINTER support not available
--- JPEG support available
--- ZLIB (PNG/ZIP) support available
--- FREETYPE2 support available
*** LITTLECMS support not available
--------------------------------------------------------------------
To add a missing option, make sure you have the required
library, and set the corresponding ROOT variable in the
setup.py script.

重启uwsgi,ok,PIL好了。

安装jinja2

安装方法

1
pip install Jinja2

安装日志

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@/root]pip install Jinja2
Collecting Jinja2
Downloading Jinja2-2.9.6-py2.py3-none-any.whl (340kB)
100% |████████████████████████████████| 348kB 3.3MB/s
Collecting MarkupSafe>=0.23 (from Jinja2)
Downloading MarkupSafe-1.0.tar.gz
Installing collected packages: MarkupSafe, Jinja2
Running setup.py install for MarkupSafe ... done
Successfully installed Jinja2-2.9.6 MarkupSafe-1.0
[root@/root]python
Python 2.7.5 (default, Nov 6 2016, 00:28:07)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from markupsafe import soft_unicode
>>> soft_unicode(42)
u'42'
>>>

从日志可以看出,自动安装了markupsafe了。

加速 MarkupSafe

从 2.5.1 开始, Jinja2 会检查是否安装 MarkupSafe 模块。如果它找到了, 它会用这个模块的 Markup 类来代替自带的。 MarkupSafe 替换 Jinja2 中附带的 老的加速模块,其优势在于更好的安装脚本,自动试图安装 C 的版本并在不可行时 漂亮地退化到纯 Python 实现的版本。

MarkupSafe 的 C 实现要快得多,并推荐用于 Jinja2 自动转义。

坚持原创技术分享,您的支持将鼓励我继续创作!