其实不限于centos,个人觉得所有的linux都一样,就好像你喜欢把钱放在左边的口袋,我喜欢把钱放右边的口袋,还有的人喜欢把钱放里面的口袋,无非是配置文件的地方不一样
首先安装nginx,嗯,这个自己装。然后配置好配置文件
配置文件的路径可以用nginx -t来查看:
nginx: the configuration file /alidata/server/nginx/conf/nginx.conf syntax is ok nginx: configuration file /alidata/server/nginx/conf/nginx.conf test is successful
嗯,对,我用的是阿里云的一键部署,这不是重点
最简单的配置文件就是下面这个样子:
user www www; worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; location / { root /alidata/www; index index.html index.htm index.php index.asp; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
这样可以访问就可以直接访问地址了,前提是你的root目录(/alidata/www/)下面有index.*的文件,就是网站首页
然后安装uwsgi,需要先安装python开发环境 python-devel或者python-dev
可以使用源码安装或者pip安装,最简单的就是
easy_install pip && pip install uwsgi
当然,在这之前我们可以测试一下uwsgi是否可以正常工作
如果用源码安装,很有可能是502 Bad或者连接被重置,可以运行,但是连接不上
先kill掉uwsgi,或者不kill 记得换个端口就行了,写一个测试的test.py:
#!/usr/bin/env python def application(env, start_response): start_response('200 OK', [('Content-Type','text/html')]) return "Hello World 8088"然后运行:
uwsgi --http :8088 -w test.py
在网页上输入地址加端口号,如果显示Hello.....就说明uwsgi是装成功了
如果uwsgi显示如下类似的信息,可能是buffer-size不够:
invalid request block size: 28418 (max 4096)...skip再上面的命令后面加上 --buffer-size 32789 试试!
uwsgi的配置文件在/etc/下新建uwsgi-8088.ini :
[uwsgi] socket = 127.0.0.1:8088 master = false vhost = true no-stie = true workers = 2 reload-mercy = 10 vacuum = true max-requests = 10000 limit-as = 512 buffer-size = 30000 pidfile = /var/run/uwsgi8088.pid daemonize = /tmp/uwsgi8088.log解释下为什么这样取名字,这样可以配置成多端口多服务,下面配置启动脚本
在/etc/init.d/下面新建uwsgi-8088(记得给可执行权限chmod +x):
#!/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin DESC="uwsgi daemon" NAME=uwsgi-8088 DAEMON=/usr/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注意上面的uwsgi的路径,你可以用whereis uwsgi 来查看
然后现在可以启动uwsgi-8088了,运行/etc/init.d/uwsgi-8088 start
然后cat /tmp/uwsgi-8088.log看是否运行成功了,或者有什么错误
*** Operational MODE: preforking *** *** no app loaded. going in full dynamic mode *** *** uWSGI is running in multiple interpreter mode *** spawned uWSGI worker 1 (pid: 7385, cores: 1) spawned uWSGI worker 2 (pid: 7394, cores: 1)最后面类似这样就说明运行成功了
最后我们需要配置nginx使它通过uwsgi来处理python的http请求
在nginx.conf里面再加一个server就行了,如下:
server { listen 8000; server_name localhost; location / { include uwsgi_params; uwsgi_pass 127.0.0.1:8088; uwsgi_param UWSGI_CHDIR /alidata/www/Test2/; uwsgi_param UWSGI_SCRIPT test; } }格式就是上面这样,和80的那个server同层就行了
listen的端口是你在网页上访问的端口,比如IP:8000就可以返回test.py的处理
8088的这个端口是nginx和uwsgi交互的端口
UWSGI_CHDIR是项目的根目录最后要带/,UWSGI_SCRIPT是运行的py程序,不带.py
如果完全按照上面的配置,service nginx restart以后,访问IP:8000就可以了
具体可以看我的测试地址:http://101.200.209.126:8000
往往一个服务并不能满足我们的需求,那么我们可以再新建一个/etc/uwsgi-8099.ini
/etc/init.d/uwsgi-8099的脚本然后启动
然后在nginx里面再加一个server就行了,具体仿照上面配置
贴上另一个测试地址:http://101.200.209.126:8001
关于nginx静态文件的加载,假如我的test.py运行需要加载js,jpg的图片怎么办?
这个时候可以配置nginx加载静态文件给py使用,具体在server里面加localtion:
server { listen 8000; server_name localhost; location / { include uwsgi_params; uwsgi_pass 127.0.0.1:8088; uwsgi_param UWSGI_CHDIR /alidata/www/Test/; uwsgi_param UWSGI_SCRIPT test; } location ~* .*\.(ico|gif|bmp|jpg|jpeg|png)$ { root /alidata/www/Test/; expires 4d; } }
测试地址:http://101.200.209.126:8000/images/bg.jpg
是可以访问到这个图片的,说明加载成功。
最后贴一个这篇文章里面简单完整的nginx.conf:
user www www; worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; server { listen 80; server_name localhost; location / { root /alidata/www; index index.html index.htm index.php index.asp; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } location ~ \.php$ { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /alidata/www$fastcgi_script_name; include fastcgi_params; } } server { listen 8000; server_name localhost; location / { include uwsgi_params; uwsgi_pass 127.0.0.1:8088; uwsgi_param UWSGI_CHDIR /alidata/www/Test/; uwsgi_param UWSGI_SCRIPT test; } location ~* .*\.(ico|gif|bmp|jpg|jpeg|png)$ { root /alidata/www/Test/; expires 4d; } } server { listen 8001; server_name localhost; location / { include uwsgi_params; uwsgi_pass 127.0.0.1:8099; uwsgi_param UWSGI_CHDIR /alidata/www/Test2/; uwsgi_param UWSGI_SCRIPT test; } } }
上面有个php的那一块是支持php解析的,基本上就是这样子了