适用于windows下开发后,部署在linux下
环境:
win10 pycharm2017 ubuntu14
部署前了解:
uwsgi专门处理python
tomvat java
nginx 相对 apache 的优点:
- 轻量级,同样起web 服务,比apache 占用更少的内存及资源
- 抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能
- 高度模块化的设计,编写模块相对简单
- 社区活跃,各种高性能模块出品迅速啊
apache 相对nginx 的优点:
- rewrite ,比nginx 的rewrite 强大
- 模块超多,基本想到的都可以找到
- 少bug ,nginx 的bug 相对较多
- 超稳定
- 存在就是理由,一般来说,需要性能的web 服务,用nginx 。如果不需要性能只求稳定,那就apache 吧。后者的各种功能模块实现得比前者,例如ssl 的模块就比前者好,可配置项多。
这里要注意一点,epoll(freebsd 上是 kqueue )网络IO 模型是nginx 处理性能高的根本理由,但并不是所有的情况下都是epoll 大获全胜的,如果本身提供静态服务的就只有寥寥几个文件,apache 的select 模型或许比epoll 更高性能。当然,这只是根据网络IO 模型的原理作的一个假设,真正的应用还是需要实测了再说的。
一般部署方案:
nginx + uwsgi
nginx+gunicorn
个人体验:
gunicorn部署配置相对简单,nginx已经处理好大量静态文件,gunicore只需要处理剩下为数不多的请求,适合轻量级的web应用网站
uwsgi部署配置相对复杂过gunicorn,但是对于依然轻量级的web来说差不多,因为配置的繁琐,决定了它的高可塑性和可选性,性能方面也会更优于gunicorn
uwsgi与gunicorn
本文以阿里云(ubuntu14)+nginx+uwsgi部署为例
流程:服务器(建议云服务器,有公网ip可以外网访问)> 安装mysql-server > 安装nginx > 安装virtuanenv > 安装git > 将django项目clone到Linux上 > 安装uwsgi > 修改各配置 > 完成部署,外网访问
服务器:
购买阿里云服务器(Ubuntu系统或你习惯的可搭建服务器系统)
在阿里云服务器上:云服务器ECS > 添加安全组规则 > 添加http协议的80端口 以便外网访问
切记 请在非root用户下部署,否则很不安全,后期uwsgi也会warning你在root下运行uwsgi
# 在 root 用户下运行这条命令创建一个新用户,yzh 是用户名root@localhost:~# useradd -m -s /bin/bash yzh# 把新创建的用户加入超级权限组root@localhost:~# usermod -a -G sudo yzh# 为新用户设置密码# 注意在输密码的时候不会有字符显示,不要以为键盘坏了,正常输入即可root@localhost:~# passwd 1234# 切换到创建的新用户root@localhost:~# su - yzh# 切换成功,@符号前面已经是新用户名而不是 root 了yzh@localhost:~$
新用户创建并切换成功了。如果是新服务器的话,最好先更新一下系统,避免因为版本太旧而给后面安装软件带来麻烦。运行下面的两条命令:
yzh@localhost:~$ sudo apt-get updateyzh@localhost:~$ sudo apt-get upgrade
接下来就可以安装必要的软件了,这里我们需要用到的软件有mysql-server、 Nginx、Git和 virtualenv
sudo apt-get install mysql-server
sudo apt isntall mysql-client
sudo apt install libmysqlclient-dev
sudo apt-get install nginxsudo pip install virtualenv
sudo apt-get install Git
mysql-server:数据库不多说:
CREATE DATABASE IF NOT EXISTS yourdbname DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
先创建好数据库,建议数据库用户名、密码、数据库名称与开发时一致,可以减少项目中setting.py中的修改
相关教程
https://www.linuxidc.com/Linux/2017-06/144805.htm
Nginx 是用来处理静态文件请求的。比如当我们访问一个博客文章详情页面时,服务器会接收到下面两种请求:
- 显示文章的详情信息,这些信息通常保存在数据库里,因此需要调用数据库获取数据。
- 图片、css、js 等存在服务器某个文件夹下的静态文件。
对于前一种请求,博客文章的数据需要借助 Django 从数据库中获取,Nginx 处理不了,它就会把这个请求转发给 Django,让 Django 去处理。而对于后一种静态文件的请求,只需要去这些静态文件所在的文件夹获取,Nginx 就会代为处理,不再麻烦 Django。
用 Django 去获取静态文件是很耗时的,但 Nginx 可以很高效地处理,这就是我们要使用 Nginx 的原因(当然其功能远不止这些)。
相关教程
https://www.linuxidc.com/Linux/2016-09/134907.htm
virtualenv就不多介绍搭建python虚拟环境便于项目分离开发。
关于虚拟环境的搭建教程:
https://www.cnblogs.com/technologylife/p/6635631.html
Git 一般系统会自带 就如windows上的git一样的功能 在这里用于下载GitHub的项目源码
关于如何将自己的python项目放上github 这里有一篇关于使用pycharm集成的功能将项目放上github 方便上传至服务器端的教程。
https://www.cnblogs.com/Jacck/p/7889326.html
将项目放上源码前先在windows下提取项目的所有python依赖包
,为了方便在服务器上一次性安装,我们将全部依赖写入一个叫 requirements.txt 的文本文件中。激活本地的虚拟环境(如果你使用了虚拟环境的话),并进入项目的根目录,运行
pip freeze > requirements.txt
命令:
即可在项目根目录获取写在
requirements.txt所有依赖包和它对应的版本
推荐目录结构:
/home/yzh/
sites/
域名.com/
env/
django项目名/
接下来就是在虚拟环境目录同级的文件夹下
git clone
https://github.com/xxxx/xxxxx
进入虚拟环境
进入项目根目录包含(
requirements.txt文件):
pip install -r requirements.txt 安装所有依赖
在django的setting文件中的修改:
DEBUG
=
False
ALLOWED_HOSTS
=
[
'127.0.0.1'
,
'localhost '
,
'.域名.com'
]
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
收集静态文件
虚拟环境下继续运行
python manage.py collectstatic
命令收集静态文件到 static 目录下:
生成数据库
python manage.py makemigration
python manage.py migrate
命令创建数据库文件:
创建超级用户
python manage.py createsuperuser
命令创建一个超级用户,方便我们进入 Django 管理后台。这和本地开发时是一样的
配置nginx
新建uc_nginx.conf
# the upstream component nginx needs to connect to
upstream django {
# server unix:///path/to/your/mysite/mysite.sock; # for a file socket
server 127.0.0.1:8000; # for a web port socket (we'll use this first)
}
# configuration of the server
server {
# the port your site will be served on
listen 80;
# the domain name it will serve for
server_name 你的ip地址 和域名; # substitute your machine's IP address or FQDN
charset utf-8;
# max upload size
client_max_body_size 75M; # adjust to taste
# Django media
location /media {
alias 你的目录/media; # 指向django的media目录
}
location /static {
alias 你的目录/static; # 指向django的static目录
}
# Finally, send all non-media requests to the Django server.
location / {
uwsgi_pass django;
include uwsgi_params; # the uwsgi_params file you installed
}
}
将该配置文件加入到nginx的启动配置文件中
sudo ln -s 你的目录/conf/nginx/uc_nginx.conf /etc/nginx/conf.d/
接下来是
uwsgi和gunicorn部署的两个方向,选择其中一种
使用nginx+uwsgi部署
安装uwsgi
pip install uwsgi
测试uwsgi
uwsgi --http :8000 --module MxOnline.wsgi
通过配置文件启动uwsgi
新建uwsgi.ini 配置文件, 内容如下:
# mysite_uwsgi.ini file
[uwsgi]
# Django-related settings
# the base directory (full path)
chdir = 项目目录
# Django's wsgi file
module = 项目.wsgi
# the virtualenv (full path)
# process-related settings
# master
master = true
# maximum number of worker processes
processes = 10
# the socket (use the full path to be safe
socket = 127.0.0.1:8000
# ... with appropriate permissions - may be needed
# chmod-socket = 664
# clear environment on exit
vacuum = true
virtualenv = 虚拟环境路径
logto = /tmp/mylog.log
注:
chdir: 表示需要操作的目录,也就是项目的目录
module: wsgi文件的路径
processes: 进程数
virtualenv:虚拟环境的目录
uwsgi -i uwsgi.ini 启动uwsgi
完成部署
若修改项目代码后需重启uwsgi完成项目更新
pkill -f uwsgi
即等于重启
使用nginx+gunicorn部署
参考文献
https://www.zmrenwu.com/post/20/
pip install gunicorn
用 Gunicorn 启动服务器进程:
(env) yangxg@localhost:~/sites/demo.zmrenwu.com/django-blog-tutorial$ gunicorn --bind unix:/tmp/demo.zmrenwu.com.socket blogproject.wsgi:application
完成部署