鱼C论坛

 找回密码
 立即注册
查看: 12257|回复: 15

[技术交流] Django、Python3、Nginx、uWSGI环境部署教程,没有更简单的了!!!!

[复制链接]
发表于 2017-6-4 09:42:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 李金龙 于 2017-7-13 09:06 编辑

一把辛酸泪洒在了屏幕上,从开始部署,到部署成功差不多用了三天,其中发现各种bug,各种大毛病,小毛病,中毛病。。神经病都经历了不少,所以我把我这几天的内容全部整理下来给到你,希望你可以节省下这个时间。

部署环境要求

1、Ubutun 16_04_02 64位
2、Python2、7 和Python3.5(系统自带了)
3、Mysql = 5.7.18
4、Django==1.10.6
5、PyMySQL==0.7.11
6、uWSGI==2.0.15
为了降低出现bug的机会,请尽量使用的一样的环境

部署环境流程

更新内容(20170603,5:40):
在跑完下面的整个流程后发现有个问题,在测试uWSGI的时候,显示无法查找没有site模块(事实上也没有这个模块),后来估计判断是这样的,虚拟环境中用的是python3,而系统中默认的是python2.7,所以当同时使用uWSGI的时候,两个版本出现抵触了,就先这么理解吧,解决方案很简单。
将默认的python移除,使用python3
  1. update-alternatives --remove python /usr/bin/python2
  2. update-alternatives --install /usr/bin/python python /usr/bin/python3
复制代码

安装pip3替换默认的pip
  1. apt-get install python3-pip
  2. ln -s /usr/bin/pip3 /usr/bin/pip
复制代码
如果出现错误,请使用which pip3查找其位置,然后替换

1、环境安装
至于如何选择系统这个部分,没有什么可以聊的,在IDC那边选择系统安装即可。
为了系统的内容为最新状态,建议升级,执行以下命名行。
  1. sudo apt-get update
  2. sudo apt-get upgrade
复制代码

执行过程中需要输入Y进行安装确认
为了防止root对环境的破坏,这里选择创建一个超级用户
  1. useradd -m -s /bin/bash lee #创建用户lee
  2. usermod -a -G sudo lee #用户lee加入超级权限组
  3. passwd lee #为新用户输入密码
  4. su - lee #切换为用户为lee
  5. 如需切换至root
  6. su或su -
复制代码
在下面的安装中如果您用的是新建的用户,则需要使用sudo + 命令,而如果是root则可以直接使用命令。注:在后面的测试中发现lee的权限还是用起来不爽,如果你现在只是在测试,还是root走起。


2、安装Nginx
  1. apt install  nginx
复制代码

如果不行,尝试下面的命令
  1. sudo apt install nginx
复制代码

安装完成后,可使用IP去访问是否正常显示,如不能试着使用下面的命令,查看系统是否未启动,看报错内容,然后去百度搜索。
  1. /etc/init.d/nginx start (restart / stop)
  2. # 分别为nginx启动、重启和停止
复制代码

3、安装Mysql
这个内容基本上没有什么要说,与环境本身影响也不大,所以放到另外的一篇内容中来说。且django本身已经默认带了Sqlite数据库,如无必要可以直接使用其数据库。
如需安装MySql,https://www.lijinlong.cc/fuwuqi/hjpz/1956.html

4、安装Virtualenv
在安装Virtualenv前要先安装下pip,有的视频教程里面没有这一步不知道是不是是系统自动带了。
  1. sudo apt-get install python-pip
复制代码
在上面的内容开始的时候已经安装了pip3这里可以省略(20170701更新)


更新pip为最新版
  1. sudo pip install --upgrade pip
复制代码
安装virtualenv
  1. pip install virtualenv
复制代码

使用python3指定虚拟目录
如果您有数据盘,那么建议您创建到数据盘中(linux数据盘重新挂载教程),本次教程使用的目录为/var/www/ 目录下
  1. cd  /var/www/  #进入到 /var/www/ 中
复制代码
  1. virtualenv -p /usr/bin/python3.5  lee   #指定python3创建虚拟目录lee
复制代码


如果python位置不同可以使用,下面的命令,查找python的位置
  1. which python
  2. which python3
复制代码
which命令,也适用于其他的内容的搜索,更多内容请自行了解

上传本地的程序包
如果您是在服务器上面重新搭建django,可自行创建相关内容。
在上传项目前,您需要做一件事,就是将本地的环境需求导出到一个文件中。
  1. pip freeze  #查看项目的配置环境
  2. pip freeze > requirements.txt  #将项目的配置环境导出至requirements.txt中
复制代码
然后通过ftp或git或其他方式上传相关文件至服务器中。

配置程序需求环境
使用命令进入虚拟目录,然后安装项目配置环境。
  1. cd  /var/www/lee  #lee为python3创建虚拟目录
  2. source  bin/activate #激活虚拟目录
  3. pip install -r requirements.txt  # 安装原项目的环境配置
复制代码
注:以下内容未申明退出虚拟目录,均在虚拟目录中运行。如遇到权限不够,请在命令前加上sudo

项目更新
1、文件更新
在项目blogproject下的文件夹blogproject下的setting.py文件中设置
  1. DEBUG = False  #关闭调试,默认是开启状态
  2. ALLOWED_HOSTS = ['域名']  #如无域名,可绑定IP地址,如果均为修改服务启动后,将会报错。
  3. LANGUAGE_CODE = 'zh-Hans' #英文语言修改为中文
  4. TIME_ZONE = 'Asia/Shanghai #国际时区设置为上海时区
复制代码

在setting文件下面增加下面的内容,可能有部分内容文件中是有的。
  1. STATIC_ROOT = os.path.join(BASE_DIR, 'static')
  2. STATIC_URL = '/static/'
  3. STATICFILES_FINDERS = (
  4.   'django.contrib.staticfiles.finders.FileSystemFinder',
  5.   'django.contrib.staticfiles.finders.AppDirectoriesFinder',)
复制代码

2、数据库更新
  1. python manage.py makemigrations  #  让 Django 知道我们在我们的模型有一些变更
  2. python manage.py migrate  #  创建表结构
复制代码

如果您的数据不那么重要,可以删除/blogproject/blog/migrations/ 下的类似00.. 的记录文件.
这里默认使用的是Sqlite,如需变更,请点击:https://www.lijinlong.cc/django/djxs/1939.html
使用以下命令查看网站
  1. python manage.py runserver 0.0.0.0:8000
复制代码
可通过IP:8000访问网站,如需退出,control + c 退出运行环境

3、静态文件统一至static目录
  1. python manage.py collectstatic
复制代码
将静态文件放置到固定的目录,是为了实现动静分离,让服务器发挥更多的性能。

uWSGI配置
  1. sudo pip install uwsgi
复制代码
测试uWSGI环境是否生效,因为80端口已经被nginx占用,所以只能使用8000端口,当然如果您对端口熟悉也可以用其他的端口。
  1. uwsgi --http :8000 --module  blogproject.wsgi
复制代码
如出现下面的内容,则运行成功
  1. spawned uWSGI worker 1 (and the only) (pid: 18417, cores: 1)
复制代码

如需退出,control + c 退出测试环境
注:虚拟环境到此结束,请使用deactivate 退出虚拟环境。

5、配置文件

Nginx配置文件
nginx默认的配置文件为,/etc/nginx/sites-enabled/default,只需要编辑器文件内容为,可使用
  1. vi /etc/nginx/sites-enabled/default
复制代码
  1. upstream django{
  2.         server 127.0.0.1:8001; #叫啥忘记了,与uWSGI产生联系
  3. }
  4. server {
  5.     listen 80;
  6.     server_name demo.lijinlong.cc;  #  绑定的域名
  7.     charset utf-8;
  8.     client_max_body_size 10M; #上传最大限制10M
  9.     location /static/ {
  10.         root /var/www/lee/blogproject;  # 静态文件的地址
  11.         }
  12.     location / {
  13.         include         /var/www/lee/uwsgi_params;   # uwsgi_params别紧张,这个文件不需要编辑
  14.         uwsgi_pass      django;
  15.         }
  16.     }
复制代码

uWSGI配置
在虚拟机上安装了uWSGI,在环境外依然需要安装uWSGI,通过上面的经验在这里安装一个文件也变得很简单。
  1. sudo pip install uwsgi
复制代码

以下内容ini格式的内容,保存后命名为 blogproject.ini
  1. [uwsgi]
  2. chdir = /var/www/lee/blogproject/ #模块位置
  3. module = blogproject.wsgi  #模块名称
  4. home = /var/www/lee/  #项目位置
  5. master = true
  6. processes = 5
  7. socket = :8001   #与楼上的那个内容挂钩,还有其他写法,没深入研究
  8. chmod-socket = 666
  9. vacuum = true
复制代码
uwsgi_params文件的内容,请注意它没有任何后缀,保存后名称定义为:uwsgi_params
  1. uawsgi_param  QUERY_STRING       $query_string;
  2. uwsgi_param  REQUEST_METHOD     $request_method;
  3. uwsgi_param  CONTENT_TYPE       $content_type;
  4. uwsgi_param  CONTENT_LENGTH     $content_length;
  5. uwsgi_param  REQUEST_URI        $request_uri;
  6. uwsgi_param  PATH_INFO          $document_uri;
  7. uwsgi_param  DOCUMENT_ROOT      $document_root;
  8. uwsgi_param  SERVER_PROTOCOL    $server_protocol;
  9. uwsgi_param  REQUEST_SCHEME     $scheme;
  10. uwsgi_param  HTTPS              $https if_not_empty;
  11. uwsgi_param  REMOTE_ADDR        $remote_addr;
  12. uwsgi_param  REMOTE_PORT        $remote_port;
  13. uwsgi_param  SERVER_PORT        $server_port;
  14. uwsgi_param  SERVER_NAME        $server_name;
复制代码
上述的两个配置文件,在保存后需要上传到项目地址中去。

自启动配置
  1. vi /etc/rc.local
复制代码
键盘I,切换至输入模式,在内容的最底部放置下面的命令。
  1. /usr/local/bin/uwsgi --ini /var/www/lee/blogproject.ini
复制代码
输入完成后,按ESC键,输入:wq保存并退出环境
内容截止到了这里,整个项目的部署已经完成。

重启下服务器看看
命令:reboot

辛辛苦苦编辑的内容,如需转载请注明出处:https://www.lijinlong.cc/fuwuqi/hjpz/1962.html



20170701补充内容

在接近一周的时间,部署网站上线,一直出现错误(实际就是一个错误),不停的去看各种资料,各种排除,最后却死在自己写的教程上面的多了一个S

1.jpg


找不到这个配置文件,在Nginx默认配置文件中/etc/nginx/sites-enabled/default 写的是uwsgi_params,而写成了其他的名字。这也是今天才想起来查看系统的日志来查错。

Nginx的错误日志在以下文件中。


  • #cat 的用途是查看
  • cat /var/log/nginx/access.log  #网站日志
  • cat /var/log/nginx/error.log  #系统日志


  • 关于uwsgi

程序在修改一些内容的时候,需要重启uwsgi,比如在settings.py文件中增加域名,则需要重启uwsgi。

关于uwsgi的教程:https://diav79.github.io/python/2016/11/25/restart-uwsgi.html

官方文档:http://uwsgi-docs-zh.readthedocs.io/zh_CN/latest/Management.html


评分

参与人数 6荣誉 +35 鱼币 +32 贡献 +19 收起 理由
zy877054618 + 5 + 2 + 3
Undo + 5 + 5 + 3 热爱鱼C^_^
ooxx7788 + 5 + 5 李总威武
yongxi + 5 + 5 + 3 威武霸气
~风介~ + 10 + 10 + 10 李总威武!
新手·ing + 5 + 5 支持~

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-6-4 09:44:41 | 显示全部楼层
本帖最后由 李金龙 于 2017-6-4 09:46 编辑

上述的内容是一气呵成的,不知道里面是否还存在对未来有影响的东西,如果有麻烦告诉我,并能提供解决方案。感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-4 09:49:21 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-6-4 20:09:38 | 显示全部楼层
真腻害 尽管我完全不懂你这是干啥
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-9 21:35:59 | 显示全部楼层
666
可以写作3个帖子了都,很有帮助。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-11 11:44:09 | 显示全部楼层
李总,不再出个零基础用Django做网页的教程嘛。
教教我们怎么设置url,怎么往网页里面添加文字,图片,表格等等
教教怎么运用html模板快速造网页
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-11 11:48:08 | 显示全部楼层
ooxx7788 发表于 2017-8-11 11:44
李总,不再出个零基础用Django做网页的教程嘛。
教教我们怎么设置url,怎么往网页里面添加文字,图片,表格 ...

咦   这个工作量就大了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-30 10:12:37 | 显示全部楼层
请问一下,你这里的Ubuntu是服务器吧?
请问知道怎么把虚拟机里面的Ubuntu搭建成跟服务器一样么?我虚拟机使用的是virtualbox,Ubuntu是16.04,我已经在虚拟机上面运行了django,跟本机没有什么区别,但是在部署的时候遇到2个问题:1、服务器上面是绑定了域名的,所以nginx的服务是填写的服务器域名,但是虚拟机上面是没有绑定域名的,那虚拟机的nginx服务中server_name 填写什么?2、关键问题,虚拟机的IP需要怎么设置才能让主机能访问?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-30 10:14:33 | 显示全部楼层
我感觉没有nginx+gunicorn简单,我用这2个搭建的,gunicorn用起来比uwsgi简单
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-2 07:15:53 | 显示全部楼层
gopythoner 发表于 2017-9-30 10:14
我感觉没有nginx+gunicorn简单,我用这2个搭建的,gunicorn用起来比uwsgi简单

收到
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-9 23:57:43 | 显示全部楼层
gopythoner 发表于 2017-9-30 10:12
请问一下,你这里的Ubuntu是服务器吧?
请问知道怎么把虚拟机里面的Ubuntu搭建成跟服务器一样么?我虚拟机 ...

填ip
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-9 23:58:35 | 显示全部楼层

我也是用二者搭建完成了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

匿名鱼油  发表于 2017-11-30 21:35:15
我只想知道window版本下怎么装uwsgi,  os.name()在window下没有这个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具

发表于 2018-4-5 12:23:37 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-11-18 18:39:52 | 显示全部楼层
这个8000端口 不是启动django时候占用了? uwsgi应该是8001把?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-25 17:13:00 | 显示全部楼层
感谢分享,学习下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 05:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表