搭建简单的nginx+uwsgi服务
附录(uwsgi ini文件内容详解)
客户端发送一个http请求,被nginx服务器接收,nginx服务器将请求转发给uwsgi,uwsgi将请求转发给实现uwsgi协议的应用程序,或可以自己处理用户请求信息并反馈结果(本次搭建服务为uwsgi自己处理请求)
环境为CentOS6.8
1、将Python升级到2.7版本,默认该环境中为2.6
从网上下载Python2.7相应的安装包
在本地安装编译配置时所需的一些依赖包
yum groupinstall -y "Development tools"
yum install -y zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel
编译安装Python2.7,本次搭建安装到了/opt/目录下
mkdir /opt/python
./configure --prefix=/opt/python
make &&make install
将系统中原有的Python替换掉,原有Python在/usr/bin下
mv /usr/bin/python /usr/bin/python.old 将原有Python重命名使其失效
rm -f /usr/bin/python-config 删除系统默认的python-config软链接(没有该文件可忽略)
ln -s /opt/python/bin/python /usr/bin/python 给新装的Python创建软连接
ln -s /opt/python/bin/python-config /usr/bin/python-config 给新装的Python创建软连接
此时已完成Python2.7的安装
python --version 查看是否已显示新版本
注:由于原环境中Python2.6被替换,会导致一些依赖于原Python2.6的程序无法使用(如yum),这是可做如下更改
vi /usr/bin/yum 修改第一行内容
#!/usr/bin/python -------> #!/usr/bin/python2.6
2、安装setuptools
可从网上下载setuptools源码包,解压该包并进入
python setup.py build
python setup.py install
这时已经安装setuptools到/opt/python/bin下,该目录下出现easy_install
3、通过easy_install安装pip
需要通过pip来安装一些Python环境下的软件
/opt/python/bin/easy_install pip
4、通过pip来安装virtualenv和uwsgi
virtualenv可以提供多个虚拟的不同的Python环境,可以通过切换不同的虚拟环境来使用不同版本或不同搭配的Python环境
pip install virtualenv
安装uwsgi
pip install uwsgi
安装的virtualenv和uwsgi也同样在/opt/python/bin下
5、通过virtualenv创建一个虚拟Python环境,在此环境下搭建本次项目
创建新的虚拟环境,放在/opt/uwsgi下,命名为env
mkdir /opt/uwsgi
cd /opt/uwsgi
virtualenv env 该命令可在本目录下创建名为env的新虚拟Python环境,可加--no-site-packages参数来创建空白的全新
环境,本次直接执行该命令会将本地的Python环境拷贝一份到创建的env环境中
这时可以进入/opt/uwsgi/env下,可以看到新生成了一些文件
6、进入env虚拟环境,并创建测试页
进入env虚拟环境
source /opt/uwsgi/env/bin/activate 这时会看到命令行最头部出现(env),表明已进入env环境
可以一个存放项目文件的目录,本次为存放测试文件的目录projects
mkdir /opt/uwsgi/projects
cd /opt/uwsgi/projects
在该目录下创建一个测试脚本test.py
vi test.py 内容如下:(一定要注意格式不能变,否则不能用)
def application(env, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return 'hello world'
测试uwsgi可用性
/opt/uwsgi/env/bin/uwsgi --http :9090 --wsgi-file test.py 开放一个9090端口来测试uwsgi,可以用同网段的
浏览器测试,如无法访问可关闭防火墙,浏览器应显示hello world
7、编写.ini来启动uwsgi
.ini文件相当于uwsgi的配置文件,启动uwsgi时可以指定该文件来指定uwsgi的运行状态
本次在/opt/uwsgi/file_ini下创建test.ini,来作为uwsgi的测试配置文件
mkdir /opt/uwsgi/file_ini
vi test.ini 内容如下:
[uwsgi]
socket = 127.0.0.1:5000 #socket是与nginx相关联时设置的参数,若要直接处理浏览器请求则改成http
processes = 4
threads = 2
master = true
chdir = /opt/uwsgi/projects/
wsgi-file = test.py
8、测试通过test.ini来启动uwsgi
uwsgi --ini test.ini (-d ./uwsgi.log --pidfile=uwsgi.pid) 该命令为打开5000端口来监测
http请求,并通过制定.ini文件来启动uwsgi,注意--ini后跟.ini文件的路径,括号内的参数为生成log日志文件
和存放pid号的文件,以方便杀死该进程,若不加括号内的参数则执行命令后会占用命令行窗口来运行uwsgi
9、安装并配置nginx来作为前端进程来监测客户请求并将请求转发给uwsgi
在/opt/下创建nginx目录来安装nginx
安装完成后进入/opt/nginx/conf,修改nginx.conf文件,该文件为启动nginx时的的配置文件
vi nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
server {
listen 80;
server_name localhost;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:5000;
}
}
}
改配置文件中写明监测http的80端口,并将请求转发给本地的5000端口,而5000端口即为本地uwsgi监测的端口
这时只要用浏览器测试访问本机的80端口即可得到hello world
附录:
uwsgi ini文件内容详解(部分参数)
[uwsgi]
uid = nginx #使用nginx用户和组
gid = nginx
chdir = /webser/www/demosite #指定项目目录,在配置多站点时,不要启用
module = demosite.wsgi #加载demosite/wsgi.py这个模块,在配置多站点时,不要启用
master = true #启动主进程。
processes = 2 #启动2个工作进程
listen = 120 #设置socket的监听队列大小(默认:100)
socket = /test/myapp.sock #指定socket文件,也可以指定为127.0.0.1:9000,这样就会监听到网络套接字
pidfile = /var/run/uwsgi.pid #指定pid文件
vacuum = true #当服务器退出的时候自动删除unix socket文件和pid文件。
enable-threads = true #允许用内嵌的语言启动线程。这将允许你在app程序中产生一个子线程
buffer-size = 32768 #设置用于uwsgi包解析的内部缓存区大小为64k。默认是4k。
reload-mercy = 8 #设置在平滑的重启(直到接收到的请求处理完才重启)一个工作子进程中,等待这个工作结束的最长秒数。这个配置会使在平滑地重启工作子进程中,如果工作进程结束时间超过了8秒就会被强行结束(忽略之前已经接收到的请求而直接结束)
max-requests = 5000 #为每个工作进程设置请求数的上限。当一个工作进程处理的请求数达到这个值,那么该工作进程就会被回收重用(重启)。你可以使用这个选项来默默地对抗内存泄漏
limit-as = 256 #通过使用POSIX/UNIX的setrlimit()函数来限制每个uWSGI进程的虚拟内存使用数。这个配置会限制uWSGI的进程占用虚拟内存不超过256M。如果虚拟内存已经达到256M,并继续申请虚拟内存则会使程序报内存错误,本次的http请求将返回500错误。
harakiri = 60 #一个请求花费的时间超过了这个harakiri超时时间,那么这个请求都会被丢弃,并且当前处理这个请求的工作进程会被回收再利用(即重启)
daemonize = /var/log/myapp_uwsgi.log # 使进程在后台运行,并将日志打到指定的日志文件或者udp服务器