Nginx+uwsgi+python2.7 on centos6 centos7
环境 os 64位的CentOS 7 6.8 py2.7
gunicorn 以后建议用上这个
安装基础开发包
Centos 下安装步骤如下:
yum groupinstall "Development tools" yum install python-devel zlib-devel bzip2-devel pcre-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel # yum install zlib-devel zlib-devel gcc bzip2-devel pcre-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel openssl
升级python 2.7
1.update python2.7 #wget http://mirrors.sohu.com/python/2.7.6/Python-2.7.6.tar.xz wget http://mirrors.sohu.com/python/2.7.8/Python-2.7.8.tar.xz tar xvf Python-2.7.8.tar.xz && cd Python-2.7.8 ./configure --prefix=/usr/local/python27 make -j4 && make install /usr/local/python27/bin/python2.7 2. mv /usr/bin/python /usr/bin/python2.6bak ln -s /usr/local/python27/bin/python2.7 /usr/bin/python #这个是对全局有效果的 3.解决系统python软链接指向python2.7版本后,yum不能正常工作 方法: vi /usr/bin/yum 将文本编辑显示的第一行 #!/usr/bin/python修改为#!/usr/bin/python2.6,保存修改即可 python -V https://wiki.linuxchina.net/index.php?title=How_to_install_python2.7_on_centos6.x 另外还需要安装 python 工具需要的额外软件包 SSL, bz2, zlib yum install -y zlib-devel bzip2-devel openssl-devel xz-libs wget
update pip and setuptools
修改pip源 mkdir ~/.pip/ vim ~/.pip/pip.conf [global] index-url = http://mirrors.aliyun.com/pypi/simple/ [install] trusted-host=mirrors.aliyun.com pip 安装方法1 ##这个要先有py2.7 然后就成功 我用了这个 这个会自动安装setuptools等等 wget https://bootstrap.pypa.io/get-pip.py python get-pip.py pip 安装方法2 yum -y install epel-release sudo yum -y install python-pip sudo yum clean all find / -name "pip*" /usr/local/python27/bin/pip ln -s /usr/local/python27/bin/pip /usr/bin/pip 如果有老的pip 就先 bak一下 ,然后 和 #这个不用了 上面已安装了 20170926 #git clone https://github.com/pypa/setuptools.git #cd setuptools/ && python setup.py install #cd setuptools/command && python setup.py install #wget https://pypi.python.org/packages/11/b6/abcb525026a4be042b486df43905d6893fb04f05aac21c32c638e939e447/pip-9.0.1.tar.gz #tar xvf pip-9.0.1.tar.gz && cd pip-9.0.1/ #sudo python setup.py install #MySQL-python #wget -c https://pypi.python.org/packages/a5/e9/51b544da85a36a68debe7a7091f068d802fc515a3a202652828c73453cad/MySQL-python-1.2.5.zip#md5=654f75b302db6ed8dc5a898c625e030c wget -c 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 && python setup.py install #安装PCRE 如果没有安装的话 下载并解压 ,当然 我是自己打了包 yum的 wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.37.tar.gz tar zxvf pcre-8.37.tar.gz 编译安装 cd pcre-8.37 && ./configure make && make install #安装完成后可以查看版本号pcre-config --version
安装Nginx
自己的yum 或者源码 (一定要不能有 --without-http_uwsgi_module)
安装 uwsgi
介绍
uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。
要注意 WSGI / uwsgi / uWSGI 这三个概念的区分。
WSGI看过前面小节的同学很清楚了,是一种通信协议。
uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信。
而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。
uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。
安装uWSGI
pip install uwsgi
ln -s /usr/bin/uwsgi /usr/sbin/uwsgi
# /usr/local/python27/bin/uwsgi 要自己加path 这个安装后 发现不了呀 应该是加path就行了
echo 'export PATH=/usr/local/python27/bin/:$PATH' >>/etc/profile && source /etc/profile
uwsgi --plugin python --http-socket :8001 --wsgi-file test.py
#yum install uwsgi #版本为 2.0.14-11.el6 epel
#不是 yum 而是pip 的 这个应该不用吧
#yum install uwsgi-plugin-python
uwsgi:https://pypi.python.org/pypi/uWSGI
uwsgi 参数详解:http://uwsgi-docs.readthedocs.org/en/latest/Options.html
uwsgi --version # 查看 uwsgi 版本
测试 uwsgi 是否正常:
新建 test.py 文件,内容如下:
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return "Hello World"
然后在终端运行:
uwsgi --http :8001 --wsgi-file test.py
安装Django
# 希望以后上 1.11 因为 支持到2020 pip install Django==1.11
# yum install MySQL-python -y #在前面用了 pip 安装了
这里右下角可以查看详细的 lts小版本号
https://www.djangoproject.com/download/
pip install Django==1.8.18
#或者下载源码安装
wget --no-check-certificate -c https://www.djangoproject.com/m/releases/1.8/Django-1.8.18.tar.gz
tar xvf Django-1.8.18.tar.gz && cd Django-1.8.18 && python setup.py install
Installing django-admin.py script to /usr/local/python27/bin
测试 django 是否正常,运行:
python -c "import django; print(django.get_version())"
django-admin.py startproject dj
cd dj
python2.7 manage.py runserver 0.0.0.0:8002
在浏览器内输入:http://127.0.0.1:8002,检查django是否运行正常。
直接配置为mysql
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
'NAME': 'django', # Or path to database file if using sqlite3.
'USER': 'root',
'PASSWORD': '',
'HOST': 'localhost', # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
'PORT': '3306', # Set to empty string for default.
}
}
配置uwsgi nginx
ln -s /usr/local/python27/bin/uwsgi /usr/sbin/uwsgi
#vim /data/apps/nginx/conf/hosts/dj.conf
cat > /data/apps/nginx/conf/hosts/dj.conf << EOF
# Django project
server {
listen 80;
server_name dj.com;
charset utf-8;
access_log /data/logs/nginx/dj.access.log;
#allow 113.108.232.32/28;
#deny all;
# 日志文件统一记录在uwsgi日志文件 /data/logs/uwsgi/django.gop.yy.com.access.log
# index Index.php index.php index.htm index.html;
# 图片不能用nginx缓存,不然会显示不出静态图片、css、js这些
location ~ ^(.*)\/\.svn\/ {
deny all;
}
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:9005;
uwsgi_param UWSGI_CHDIR /data/www/dj/; #django的代码放的路径
uwsgi_param UWSGI_SCRIPT uwsgi; #django的代码的resource_wsgi.py文件
}
}
EOF
#vim /data/www/dj/uwsgi.py
cat > /data/www/dj/uwsgi.py << EOF
#!/usr/bin/python
# -*- coding: utf8 -*-
# Author:
#
# Date : 2017/02/21
# 说明:resource资源管理系统在生成环境的启动配置文件,使用nginx + uwsgi 进行访问 resource资源管理系统
import os
import django
os.environ['DJANGO_SETTINGS_MODULE'] = 'dj.settings'
import django.core.handlers.wsgi
if django.VERSION < 1.7:
from django.core.handlers.wsgi import WSGIHandler
application = WSGIHandler()
else:
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
EOF
##这个配置文件 其实应该可以 试一下放到 /etc/uwsgi/ 但是502
#vim /data/www/dj/uwsgi.xml
cat > /data/www/dj/uwsgi.xml << EOF
<uwsgi>
<socket>127.0.0.1:9005</socket>
<listen>200</listen>
<master>true</master>
<pidfile>/data/logs/uwsgi/uwsgi.pid</pidfile>
<processes>8</processes>
<module>dj.wsgi</module>
<profiler>true</profiler>
<memory-report>true</memory-report>
<enable-threads>true</enable-threads>
<logdate>True</logdate>
<limit-as>6048</limit-as>
<daemonize>/data/logs/uwsgi/uwsgi.access.log</daemonize>
</uwsgi>
EOF
#说明
limit-as 32 将进程的总内存量控制在32M
#下面这个写法后来也是不行的呀
<!-- <module>dj.resource_uwsgi:application</module> -->
<module>dj.uwsgi:application</module>
#还不太明白 为什么 很多时候写成个是 Internal Server Error --- no python application found, check your startup logs for errors ---
<module>dj.uwsgi</module>
# 参考 yum 的启动脚本 然后 改为uwsgi 用户 启动会比较 安全
mkdir -p /data/logs/uwsgi ; chown -R uwsgi:uwsgi /data/logs/uwsgi
#vim /etc/sysctl.conf
cat > /etc/sysctl.conf <<EOF
net.core.somaxconn = 2048
EOF
sysctl -p
#vi /etc/init.d/uwsgi
cat > /etc/init.d/uwsgi << EOF
#!/bin/sh
##yum 安装的启动脚本
# uwsgi - this script starts and stops the uwsgi emperor
#
# chkconfig: - 85 15
# description: Fast, self-healing, application container server
# processname: uwsgi
# config: /etc/uwsgi.ini
# config: /etc/uwsgi.d
# Source function library.
. /etc/rc.d/init.d/functions
PATH=/sbin:/bin:/usr/sbin:/usr/bin
PROG=/usr/sbin/uwsgi
OWNER=uwsgi
NAME=uwsgi
DESC="Fast, self-healing, application container server"
DAEMON_OPTS="--xml /data/www/dj/uwsgi.xml --daemonize/data/logs/uwsgi/uwsgi.access.log --plugin python"
[ -f /etc/sysconfig/uwsgi ] && . /etc/sysconfig/uwsgi
lockfile=/var/lock/subsys/uwsgi
start () {
echo -n "Starting $NAME $DESC: "
daemon $PROG $DAEMON_OPTS
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop () {
echo -n "Stopping $NAME $DESC: "
# uWSGI docs say INT is a gentler way to stop
killproc $PROG -INT
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
reload () {
echo "Reloading $NAME"
#evan
#*****************************
cat > /etc/init.d/uwsgi << EOF
#!/bin/bash
# chkconfig: 2345 55 25 pip 的用这个启动脚本先
# 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
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/python27/bin/
NAME=uwsgi
#NAME=resource_uwsgi
DAEMON=/usr/sbin/uwsgi
#CONFIGFILE=/etc/uwsgi/$NAME.xml
CONFIGFILE=/data/www/dj/$NAME.xml
PIDFILE=/data/logs/uwsgi/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
set -e
[ -x "$DAEMON" ] || exit 0
do_start() {
[ -f "$PIDFILE" ] && echo -en "uwsgi already running!! \n" && exit 0
$DAEMON $CONFIGFILE && echo -en "uwsgi running is ok!! \n"
}
do_stop() {
$DAEMON --stop $PIDFILE || echo -en "uwsgi not running!! \n"
rm -f $PIDFILE
echo "Stop $NAME is ok!!"
}
do_reload() {
[ ! -f "$PIDFILE" ] && echo -en "uwsgi not running!! \n" && exit 0
$DAEMON --reload $PIDFILE || echo -en "uwsgi can't reload!! \n"
}
do_status() {
ps aux|grep -v grep |grep $DAEMON || echo -en "uwagi not running!!"
}
case "$1" in
status)
do_status
;;
start)
do_start
;;
stop)
do_stop
;;
reload|graceful)
do_reload
;;
restart)
do_stop
sleep 2
do_start
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|reload}" >&2
exit 3
;;
esac
exit 0
EOF
mkdir -p /data/logs/uwsgi
知识拓展
uwsgi参数说明 [uwsgi] uid = nginx #使用nginx用户和组 gid = nginx chdir = /usr/local/myapp #指定项目目录 module = myapp.wsgi #加载myapp/wsgi.py这个模块 master = true #启动主进程。 processes = 2 #启动2个工作进程 listen = 120 #设置socket的监听队列大小(默认:100) socket = /test/myapp.sock#指定socket文件 socket = 127.0.0.1:8080 pidfile = /var/run/uwsgi.pid #指定pid文件 vacuum = true #当服务器退出的时候自动删除unixsocket文件和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服务器 [root@rpmbuild demosite]# cat /etc/uwsgi9090.ini [uwsgi] socket = 127.0.0.1:9090 master = true //主进程 vhost = true //多站模式 no-site = true //多站模式时不设置入口模块和文件 workers = 2 //子进程数 reload-mercy = 10 vacuum = true //退出、重启时清理文件 max-requests = 1000 limit-as = 512 buffer-size = 30000 pidfile = /var/run/uwsgi9090.pid daemonize = /data/logs/uwsgi9090.log 安装Python包管理 #这个我没用呢 easy_install 包 https://pypi.python.org/pypi/distribute 安装步骤: cd ~ wget https://pypi.python.org/packages/source/d/distribute/distribute-0.6.49.tar.gz tar xf distribute-0.6.49.tar.gz cd distribute-0.6.49 python2.7 setup.py install easy_install --version wget -c https://pypi.python.org/packages/11/b6/abcb525026a4be042b486df43905d6893fb04f05aac21c32c638e939e447/pip-9.0.1.tar.gz#md5=35f01da33009719497f01a4ba69d63c9 Pip安装和使用 https://wiki.linuxchina.net/index.php?title=Pip%E5%AE%89%E8%A3%85%E5%92%8C%E4%BD%BF%E7%94%A8 rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm yum install -y python-pip 为uwsgi配置多个站点 为了让多个站点共享一个uwsgi服务,必须把uwsgi运行成虚拟站点:去掉“-w myapp”加上”–vhost”: uwsgi -s :9090 -M -p 4 -t 30 --limit-as 128 -R 10000 -d uwsgi.log --vhost 然后必须配置virtualenv,virtualenv是Python的一个很有用的虚拟环境工具,这样安装: apt-get install Python-setuptools easy_install virtualenv 然后设置一个/多个app基准环境: 快速部署Python应用:Nginx+uWSGI配置详解 http://developer.51cto.com/art/201010/229615_all.htm
django安全
常见故障
*问题1
[20/Apr/2017 03:27:30] "GET / HTTP/1.1" 500 59
Traceback (most recent call last):
File "/usr/local/python27/lib/python2.7/wsgiref/handlers.py", line 85, in run
self.result = application(self.environ, self.start_response)
File "/usr/local/python27/lib/python2.7/site-packages/Django-1.8.18-py2.7.egg/django/contrib/staticfiles/handlers.py", line 63, in __call__
return self.application(environ, start_response)
http://192.168.1.240:8002/
A server error occurred. Please contact the administrator.
DisallowedHost: Invalid HTTP_HOST header: '192.168.2.228:8002'. You may need to add u'192.168.2.228' to ALLOWED_HOSTS.
[20/Apr/2017 04:32:02] "GET /favicon.ico HTTP/1.1" 500 59
添加 u'192.168.2.228' 到 ALLOWED_HOSTS = [u'192.168.1.240']
然后就好了 所以出错 还是要看log 和相关输出 去goolge 不一定能找到原因 ,要靠自己哦
*问题 2
Mon Apr 24 13:47:42 2017 - --- no python application found, check your startup logs for errors ---
{address space usage: 185823232 bytes/177MB} {rss usage: 5353472 bytes/5MB} [pid: 21738|app: -1|req: -1/2] 119.130.229.219 () {46 vars in 724 bytes} [Mon Apr 24 13:47:42 2017] GET /favicon.ico => generated 21 bytes in 0 msecs (HTTP/1.1 500) 2 headers in 83 bytes (0 switches on core 0)
vim uwsgi.xml
<module>dj.uwsgi</module> 改为
<module>dj.wsgi</module>
20171009 一开始忘记了 yum python-devel
参考
How to use Django with uWSG 这个是官方教程记得看一下
Nginx+uwsgi+python2.6 on centos6
http://blog.liuts.com/post/216/
Nginx + uWsgi + web.py 搭建LNMP(python)服务器
How To Serve Django Applications with uWSGI and Nginx on CentOS 7
https://www.digitalocean.com/community/tutorials/how-to-serve-django-applications-with-uwsgi-and-nginx-on-centos-7
http://blog.csdn.net/huanbia/article/details/54630180
How to use Django with uWSGI https://docs.djangoproject.com/en/1.11/howto/deployment/wsgi/uwsgi/
五步教你实现使用Nginx+uWSGI+Django方法部署Django程序(上) http://www.python88.com/topic/101/
Python/WSGI 应用快速入门 http://uwsgi-docs-cn.readthedocs.io/zh_CN/latest/WSGIquickstart.html
https://uwsgi-docs.readthedocs.io/en/latest/WSGIquickstart.html
uWSGI http://docs.jinkan.org/docs/flask/deploying/uwsgi.html
FastCGI http://docs.jinkan.org/docs/flask/deploying/fastcgi.html
欢迎使用 Flask http://docs.jinkan.org/docs/flask/index.html
nginx uwsgi wsgi django 这些东西究竟是什么关系 http://blog.csdn.net/u014761344/article/details/40146597
uWSGI 服务器的 uwsgi 协议究竟用在何处 https://www.zhihu.com/question/46945479
你应该使用 Nginx + UWSGI、
http://www.admin10000.com/document/2348.html
http://www.ziqiangxuetang.com/django/django-tutorial.html
How To Serve Django Applications with uWSGI and Nginx on Ubuntu 16.04 https://www.digitalocean.com/community/tutorials/how-to-serve-django-applications-with-uwsgi-and-nginx-on-ubuntu-16-04
http://chenx1242.blog.51cto.com/10430133/1904804 参考资料:http://xiaorui.cc/2017/02/16/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3uwsgi%E5%92%8Cgunicorn%E7%BD%91%E7%BB%9C%E6%A8%A1%E5%9E%8B%E4%B8%8A/
http://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html
Centos升级Python 2.7.12并安装最新pip https://blog.fazero.me/2016/10/13/centos-update-python/
Python/WSGI 应用快速入门 http://uwsgi-docs-cn.readthedocs.io/zh_CN/latest/WSGIquickstart.html
0. 记录Uwsgi与Django成功勾搭的始末 http://chenx1242.blog.51cto.com/10430133/1906056
基于nginx和uWSGI在Ubuntu上部署Django http://www.jianshu.com/p/e6ff4a28ab5a#
nginx + uwsgi + Django 应用部署 http://tchuairen.blog.51cto.com/3848118/1831281
nignx部署django http://www.cnblogs.com/forilen/p/4242052.html
CentOS+nginx+uwsgi+Python 多站点环境搭建 http://www.cnblogs.com/xiongpq/p/3381069.html
CentOS 7中极速搭建django+nginx+uwsgi
CentOS 7基于nginx,uwsgi,django搭建web服务器
Gunicorn+Nginx部署
nginx + gunicorn + django的简单部署