1 安装django:(/user/bin目录下,pip)
直接进入root用户(~),pip install django(指定版本:django==XXX)
(非虚拟环境安装,没有在virtualenv,默认安装在公共的python解释器下)
Successfully installed asgiref-3.3.4 django-3.2.4 sqlparse-0.4.1 typing-extensions-3.10.0.0
2 安装virtualenv
(虚拟环境安装)
在开发过程中有时需要python2.7,有时需要python3.5,且需要很多相同但是不同版本依赖包,可以使用虚拟环境virtualenv进行管理
pip install virtualenv
Successfully installed appdirs-1.4.4 distlib-0.3.2 filelock-3.0.12 importlib-metadata-4.5.0 importlib-resources-5.1.4 virtualenv-20.4.7 zipp-3.4.1
2.1 直接使用virtualenv
在root用户下输入:virtualenv --no-site-packages venv,会报错virtualenv: error: unrecognized arguments: --no-site-packages,因为默认安装的高版本virtualenv默认–no-site-packages了
参数–no-site-packages作用:已经安装到系统Python环境中的所有第三方包都不会复制过来,是干净的python环境
输入:virtualenv my_django
输出如下:
creator CPython3Posix(dest=/root/my_django, clear=False, no_vcs_ignore=False, global=False)
seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/root/.local/share/virtualenv)
added seed packages: pip== 21.1.2, setuptools== 57.0.0, wheel==0.36.2
activators BashActivator,CShellActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator
然后查看:ls -l
drwxr-xr-x 5 root root 4096 Jun 16 15:43 my_django
source my_django/bin/activate,可以看到目录前缀加上了(my_django),也就是我们平时新建1个python项目时,自动新建的venv虚拟环境
然后就像平时在pycharm上的terminal终端安装三方库一样了
pip install django(此时安装django就是在当前这个虚拟环境中安装了)
退出当前的venv环境,使用deactivate命令
此时就回到了正常的环境,现在pip或python均是在系统Python环境下执行
还是在(my_django)环境下:
执行:find -name django
输出:
./my_django/lib/python3.6/site-packages/django
./my_django/lib/python3.6/site-packages/django/forms/templates/django
./my_django/lib/python3.6/site-packages/django/forms/jinja2/django
如果进入根目录(/),执行:find -name django
./root/my_django/lib/python3.6/site-packages/django
./root/my_django/lib/python3.6/site-packages/django/forms/templates/django
./root/my_django/lib/python3.6/site-packages/django/forms/jinja2/django
./usr/share/doc/python3-jinja2/examples/rwbench/django
./usr/local/lib/python3.6/site-packages/django
./usr/local/lib/python3.6/site-packages/django/forms/templates/django
./usr/local/lib/python3.6/site-packages/django/forms/jinja2/django
可见,我们在非虚拟环境下安装django,会放在/usr/local/lib/python3.6/site-packages/中,而root用户在虚拟环境下安装的django,就在/root/my_django/lib/python3.6/site-packages/中
小结:virtualenv是如何创建“独立”的Python运行环境的呢?原理很简单,就是把系统Python复制一份到virtualenv的环境,用命令source venv/bin/activate进入一个virtualenv环境时,virtualenv会修改相关环境变量,让命令python和pip均指向当前的virtualenv环境。
3 安装mysql
3.1 首先检查有没有安装mysql(-i 不区分大小写):
没有安装(注意:查看阿里云服务器linux版本:lsb_release -a)
在https://dev.mysql.com/downloads/repo/yum/,下载mysql
将下载的mysql安装包rz上传到阿里云:
rpm是由红帽公司开发的软件包管理方式,使用rpm我们可以方便的进行软件的安装、查询、卸载、升级等工作。
常用命令:
-ivh:安装显示安装进度–install–verbose–hash
-Uvh:升级软件包–Update;
-qpl:列出RPM软件包内的文件信息[Query Package list];
-qpi:列出RPM软件包的描述信息[Query Package install package(s)];
-qf:查找指定文件属于哪个RPM软件包[Query File];
-Va:校验所有的RPM软件包,查找丢失的文件[View Lost];
-e:删除包
rpm -q samba //查询程序是否安装
rpm -ivh /media/cdrom/RedHat/RPMS/samba-3.0.10-1.4E.i386.rpm //按路径安装并显示进度
rpm -ivh --relocate /=/opt/gaim gaim-1.3.0-1.fc4.i386.rpm //指定安装目录
rpm -ivh --test gaim-1.3.0-1.fc4.i386.rpm //用来检查依赖关系;并不是真正的安装;
rpm -Uvh --oldpackage gaim-1.3.0-1.fc4.i386.rpm //新版本降级为旧版本
rpm -qa | grep httpd #[搜索指定rpm包是否安装]–all搜索httpd
rpm -ql httpd #[搜索rpm包]–list所有文件安装目录
rpm -qpi Linux-1.4-6.i368.rpm #[查看rpm包]–query–package–install package信息
rpm -qpf Linux-1.4-6.i368.rpm #[查看rpm包]–file
rpm -qpR file.rpm #[查看包]依赖关系
rpm2cpio file.rpm |cpio -div #[抽出文件]
rpm -ivh file.rpm #[安装新的rpm]–install–verbose–hash
rpm -ivh
rpm -Uvh file.rpm #[升级一个rpm]–upgrade
rpm -e file.rpm #[删除一个rpm包]–erase
将mysql装在my_mysql下,可以把mysql的rpm包放在my_mysql中,再安装:
先mv剪切到my_mysql中:
安装完,查看mysql:
然后安装mysql服务端:
启动mysql:
查看mysql的运行情况:
Mysql8.0默认安装之后root是有密码的。
修改mysql临时密码:
为了加强安全性,MySQL8.0为root用户随机生成了一个密码,在error log中,关于error log的位置,如果安装的是RPM包,则默认是/var/log/mysqld.log。
只有启动过一次mysql才可以查看临时密码
grep ‘temporary password’ /var/log/mysqld.log(如果之前安装过MySQL则这里可能会有多个密码,用最后一个,注意这个密码输入时是可以粘贴的)。
使用该密码登录并修改密码:
复制粘贴密码后,直接enter即可:
在修改密码前,是不能执行sql操作的,需要先更改密码:(密码要足够复杂,否则会提示:ERROR 1819 (HY000): Your password does not satisfy the current policy requirements,密码设置可以含有大小写字母数字@~_!等等)
这是mysql的密码策略,修改密码后,可如下查看密码策略:
设置密码的验证强度等级,设置 validate_password_policy 的全局参数为 LOW 即可,
输入设值语句 “ set global validate_password_policy=LOW; ” 进行设值,
(可以看到,原本的策略是medium)
当前密码长度为 8 ,不介意的话就不用修改了,按照通用的来讲,设置为 6 位的密码,设置 validate_password_length 的全局参数为 6 即可,
输入设值语句 “ set global validate_password_length=6; ” 进行设值
可如下设置,即可设置简单的密码:
mysql> set global validate_password.policy=0;
mysql> set global validate_password.length=1;
mysql 密码策略相关参数:
1)、validate_password_length 固定密码的总长度;
2)、validate_password_dictionary_file 指定密码验证的文件路径;
3)、validate_password_mixed_case_count 整个密码中至少要包含大/小写字母的总个数;
4)、validate_password_number_count 整个密码中至少要包含阿拉伯数字的个数;
5)、validate_password_policy 指定密码的强度验证等级,默认为 MEDIUM;
关于 validate_password_policy 的取值:
0/LOW:只验证长度;
1/MEDIUM:验证长度、数字、大小写、特殊字符;
2/STRONG:验证长度、数字、大小写、特殊字符、字典文件;
6)、validate_password_special_char_count 整个密码中至少要包含特殊字符的个数;
远程连接:
需要阿里云安全组开放3306端口
navicat配置好连接发现:
grant all privileges on . to ‘root’@’%’ with grant option;
连接navicat出现错误:
plugin非mysql_native_password 则需要修改密码
但是尝试修改了密码(和以前一样),还是报错:1251
尝试修改用户认证规则(密码还是一样):
刷新权限:
重新连接,成功:
另外:sql查看mysql端口号
在navicat上连接阿里云数据库,新建数据库便于django连接:
修改本地的django项目的settings.py
把公网ip和域名地址都放入allowed_hosts
name是数据库名,host是阿里云服务器的公网ip
然后本地执行:
再执行:
执行前注意:各个django的app下的迁移文件需要删除,否则不会成功:(因为本地执行后,会生成migrations迁移文件,有了就不会执行迁移)
把以上文件删除,重新执行makemigrations
可以看到成功了,然后才执行migrate(执行完migrate才会在数据库中生成table)
然后f5刷新查看阿里云数据库:
将本地的django项目打包上传:
rz上传django项目压缩包,解压缩:
在执行前,先在阿里云上安全组配置8000端口:
找到实例也可以配置安全组:
8000端口成功添加,但是执行以下命令启动时,报错:
因为打包的django项目没有python解释器,默认执行的公共的python解释器(在/user/local/lib下,而公共环境的python解释器下缺少这些库),需要在当前项目下创建虚拟环境,在虚拟环境中执行该命令,使用虚拟环境下的python三方库(source bin/activate)
注意:安装完virtualenv,然后source bin/activate,pip install django,此时安装的django就在当前的虚拟环境下(就不再是公共的python环境了,可以随意安装该项目需要的三方库),然后执行django-admin startproject 项目名,路径就是上面的autoTest项目,和virtualenv的bin、lib目录同级
执行启动django项目命令前安装三方库环境:
安装前可以更新pip,在xx_djo下:/root/xx_django/autotest_dja/xx_djo/bin/python -m pip install --upgrade pip
还需要安装uWSGI:
uwsgi官方文档:
https://uwsgi-docs-zh.readthedocs.io/zh_CN/latest/WSGIquickstart.html#django
Python uWSGI 安装配置
如何部署简单的 WSGI 应用和常见的 Web 框架。
先安装uWSGI:
Nginx:静态处理自己处理,Nginx将非静态请求通过uwsgi转发给Django,由Django处理
对于uwsgi_params 文件,一般 yum 安装默认就有该文件了,直接配置 nginx.conf 即可 没有的话添加 uwsgi_params 保存下面的配置代码
可见uwsgi_params是直接存在的
阿里云服务器上有uwsgi_params文件,修改nginx.conf,在http下增加server:
比如:listen:8099,是前端请求的端口号(注意必须在阿里云安全组添加端口号8099才可以,如果安全组是添加8000,相应的listen需要修改为8000)
在 Django 项目根目录(manage.py 同级目录)新建文件 uwsgi.ini (也支持 xml 文件格式)
在pycharm中新建uwsgi.ini
uwsgi_pass 公网ip:8066需要和socket端口保持一致(uwsgi.ini)
配置项中以"#"开头的都是被注释的项目;
其他参数:
chdir 是你的项目根目录
module 是你的入口wsgi模块
socket 是通信IP和端口设置;
master=True 表示以主进程模式运行;
deamonize 是日志文件,会自动创建;
disable-logging = true 表示只记录错误信息,否则日志可能很快爆满
然后rz将该uwsgi.ini上传到manage.py所在的目录
回到上一目录,执行:source bin/activate(bin目录所在的路径)
要么执行:uwsgi uwsgi.ini
要么执行:uwsgi --ini uwsgi.ini(在uwsgi.ini目录下执行)
然后cd进入(也就是manage.py和uwsgi.ini的目录):
执行:
解决这个报错:
pip uninstall uwsgi
yum install -y pcre pcre-devel pcre-static
pip install uwsgi -I --no-cache-dir
重新执行,确实消失了,但是错误还有:
出现这个问题的原因是在uwsgi.ini中,应该使用内网ip,nginx配置中需要和该socket相同,所以nginx也要改为内网ip:
同样需要修改并保存nginx配置文件(uwsgi_pass:公网ip换成本机ip)
(注意:要让nginx的listen的端口号和uwsgi的端口号不一样,比如这里,listen改为8000后,我的uwsgi_pass就修改为127.0.0.1:8066,同样需要修改uwsgi.ini,端口不能冲突)
nginx -s reload
重新启动uwsgi,如果出现same address错误,直接杀死:
fuser -k 8066/tcp(uwsgi监听的端口)
pkill nginx,然后执行nginx命令,查看进程(查看nginx配置的几个端口号是否在监听中):
ps -ef|grep nginx
修改uwsgi的端口号是8066后(必须和nginx的listen端口不同),启动uwsgi,调用接口:
以上的页面,是djangorestframework的测试页面,因为没有配置静态文件,所以样式等文件全部报错404,要去掉可以在settings.py中添加以下配置:
这里我们直接源代码修改后打包上传
如果希望unrar上传代码后,覆盖解压:o+ 覆盖已存在文件
o- 不覆盖已存在文件(o+前面要加上-,表示参数,否则前面的x认为这是个0+.rar包)
unrar x -o+ autoTest.rar /root/xx_django/autotest_dja/xx_djo
然后重新执行:fuser -k 8066/tcp
然后执行uwsgi.ini(manage.py同级目录下):uwsgi uwsgi.ini(注意,这种方式运行uwsgi,一旦关闭xshell,uwsgi就会关闭,要在后台运行,需要加上-d,守护线程,就不会出现只在终端运行,关闭就请求接口失效的情况了)
修改配置如下:
但是这种情况会导致请求djangorestframework接口还是出现测试页面,最终修改参数如下:
再次执行:uwsgi -d --ini uwsgi.ini
然后关闭xshell,访问django接口就不会出现问题了,成功
postman:
注意
如果杀死uwsgi进程,访问会出现502
此时请求接口:
其它
添加并发和监控
默认情况下,uWSGI 启动一个单一的进程和一个单一的线程。
你可以用 --processes 选项添加更多的进程,或者使用 --threads 选项添加更多的线程 ,也可以两者同时使用。
uwsgi --http :9090 --wsgi-file foobar.py --master --processes 4 --threads 2
以上命令将会生成 4 个进程, 每个进程有 2 个线程。
如果你要执行监控任务,可以使用 stats 子系统,监控的数据格式是 JSON:
uwsgi --http :9090 --wsgi-file foobar.py --master --processes 4 --threads 2 --stats 127.0.0.1:9191
我们可以安装 uwsgitop(类似 Linux top 命令) 来查看监控数据:
pip install uwsgitop
结合 Web 服务器使用
我们可以将 uWSGI 和 Nginx Web 服务器结合使用,实现更高的并发性能。(如果只是uWSGI,比如本机搭建的测试django,自带的就是uWSGI,这时候它是服务器;如果是在服务器上搭建uWSGI+nginx,此时的uWSGI就是中间件,服务器是nginx)
一个常用的nginx配置如下:
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:3031;
}
以上代码表示使用 nginx 接收的 Web 请求传递给端口为 3031 的 uWSGI 服务来处理。
现在,我们可以生成 uWSGI 来本地使用 uwsgi 协议:
uwsgi --socket 127.0.0.1:3031 --wsgi-file foobar.py --master --processes 4 --threads 2 --stats 127.0.0.1:9191
如果你的 Web 服务器使用 HTTP,那么你必须告诉 uWSGI 本地使用 http 协议 (这与会自己生成一个代理的–http不同):
uwsgi --http-socket 127.0.0.1:3031 --wsgi-file foobar.py --master --processes 4 --threads 2 --stats 127.0.0.1:9191
部署 Django
Django 是最常使用的 Python web 框架,假设 Django 项目位于 /home/foobar/myproject:
uwsgi --socket 127.0.0.1:3031 --chdir /home/foobar/myproject/ --wsgi-file myproject/wsgi.py --master --processes 4 --threads 2 --stats 127.0.0.1:9191
–chdir 用于指定项目路径。
我们可以把以上的命令弄成一个 yourfile.ini 配置文件:
[uwsgi]
socket = 127.0.0.1:3031
chdir = /home/foobar/myproject/
wsgi-file = myproject/wsgi.py
processes = 4
threads = 2
stats = 127.0.0.1:9191
接下来你只需要执行以下命令即可:
uwsgi yourfile.ini