记一次django+uwsgi aliyun环境搭建
主要的安装流程参考原文地址:https://blog.csdn.net/xing851483876/article/details/84306953
使用XShell工具 上传和下载文件 安装
yum -y install lrzsz
或者
apt install lrzsz
如果rz上传失败请尝试
$ rz -are --o-sync
1、虚拟环境(virtualenv)的安装
1、安装virtualenv
sudo pip install virtualenv
sudo pip install virtualenvwrapper #安装虚拟环境管理工具
2、在home下创建虚拟环境安装目录
mkdir .virtualenvs
3、为virtualenv配置环境变量,打开.bashrc文件
sudo vim ~/.bashrc
在末尾添加两行代码
export WORKON_HOME=$HOME/.virtualenvs # 所有虚拟环境存储的目录
source /usr/local/bin/virtualenvwrapper.sh
使配置生效
source ~/.bashrc
如果有Python2 Python3两个环境请加入环境变量
if [ -f /usr/local/bin/virtualenvwrapper.sh ]; then
export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
source /usr/local/bin/virtualenvwrapper.sh
fi
如果遇到" command not found: shopt "的 "~/.bashrc" 配置问题 说明使用的是zsh shell
将所需配置修改写入~/.zshrc
执行 source ~/.zshrc
或者zsh切换bash
chsh -s /bin/bash
bash切换zsh
chsh -s /bin/zsh
4、创建虚拟环境,默认命令创建的是python2的虚拟环境,指定创建python3.6的虚拟环境可以使用以下命令
mkvirtualenv -p /usr/bin/python3.6 XX #XX是虚拟环境的名字,创建python3.5的虚拟环境
其他命令:
workon xx #进入虚拟环境XX
deactivate #退出虚拟环境
2、在虚拟环境中安装相应的工具包
我们在本地写django项目肯定是安装了一堆相应的包,需要把他们移植到阿里云上。首先在本地ubuntu进入虚拟环境,在项目根目录下,执行以下命令收集安装的包,就是生成一个包的清单文件plist.txt。
pip freeze > requirment.txt
然后用xftp把这个requirment.txt文件上传到阿里云项目的根目录,然后进入虚拟环境test(test是我新建的虚拟环境的名字)
workon test #进入虚拟环境test
cd到plist.txt所在目录
pip install -r requirment.txt #安装txt文件上的包
3、Mysql数据库的安装和数据的迁移
安装Mysql:输入以下命令,安装过程会设置密码,设置成和原来本地一样的,就不用在setting中修改了。
sudo apt-get update
sudo apt-get install mysql-server
sudo apt-get install mysql-client
创建数据库:先登录数据库, 然后创建数据库v1,数据库名字也创建成和原来本地一样的,我的叫v1。
create database v1;
数据的迁移:把本地数据库中的数据复制到阿里云上的数据库中。先在本地生成备份文件,v1是要备份的数据库,v1.sql是生成的备份文件。然后用Xftp把v1.sql文件上传到阿里云。
mysqldump -u root -p v1 >v1.sql
数据还原:阿里云终端 cd到v1.sql所在目录,输入以下命令
mysql -u root -p v1<v1.sql
mysql配置:找到mysqld.cnf文件注释掉bind-address这一行
/etc/mysql/mysql.conf.d/mysqld.cnf #配置文件路径
#bind-address = 127.0.0.1 #注释掉这一行
4、修改django的setting文件:
DEBUG = False
ALLOW_HOSTS=['XXXXXX'] #改成阿里云的公网IP
USWGI配置
三、nginx、uWSGI的安装
在安装前先了解下这几个是什么东西:WSGI、uWSGI、nginx。
WSGI:PythonWeb服务器网关接口(Python Web Server Gateway Interface),这是一种协议规范,用于规范web server(比如uWSGI)和web application(Flask、Django等)之间的通信方式。这种协议其实是将我们和更加底层的HTTP、TCP等协议分隔开来,使我们在开发的时候可以不用自己去实现这些协议的处理,只关注于更高层次的逻辑处理,实现面向对象的编程。
uWSGI:uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。它本身可以作为一个服务器单独使用,但是也可以和nginx组合使用。一般Django部署都是用的nginx+uWSGI,可以理解为这种组合性能更优。
nginx:这是一个高性能的web服务器/反向代理,类似Apache。什么叫反向代理,客户端通过一个代理去访问服务器,这样的代理叫正向代理;同样的服务器前加一个代理和客户端通信,这样的代理叫反向代理。nginx就是用来放在uWSGI前做反向代理。
我们在本地开发的时候没有安装过以上服务器,但是也可以python manage.py runserver运行项目,那是因为Django等框架自带了WSGI服务器,性能不强,可以用于调试。
转自:https://blog.csdn.net/xing851483876/article/details/84306953
nginx安装:
sudo apt-get update
sudo apt-get install nginx
安装成功后,用浏览器访问你的阿里云IP地址,可以看到以下提示 :
nginx常用命令:
service nginx start #启动
service nginx stop #停止
service nginx reload #重启
nginx配置:打开配置文件default,路径/etc/nginx/sites-available/default,设置以下内容。一个是server_name后面换成你的阿里云公网IP,有的文章说不换也行。关键是下面2个location,第一个location是设置的和uWSGI的关联。第二个location /static是设置的静态文件的路径。如果你的项目还有media文件夹,那还要加一个location /media,把路径设置上。注意:location 和alias后面有空格。
server_name 47.106.84.245;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
# try_files $uri $uri/ =404;
include uwsgi_params;
uwsgi_pass 127.0.0.1:8000;
}
location /static {
alias /home/myweb/static;
}
上面nginx配置静态文件有一个问题,就是上面的目录/root/xxx/xxx/static只是我们自己的静态文件的目录,你登录admin后发现admin页面的样式都丢失了。因为django自带的admin的静态文件路径没有导入。所以就需要新建一个文件夹,我的是/root/xxx/xxx/nginx/static,然后执行命令把整个项目的所有静态文件都收集到这个目录下,再修改下上面的配置。
第一步:新建文件夹 /root/xxx/xxx/nginx/static
第二步:修改setting.py文件,增加STATIC_ROOT
STATIC_ROOT='/home/myweb/nginx/static/' #添加收集静态文件的目录
STATIC_URL = '/static/'
STATICFILES_DIRS=(
os.path.join(BASE_DIR,'static'),
第三步:执行以下代码收集静态文件
python manage.py collectstatic
第四步:修改nginx的配置
location /static {
alias /root/xxx/xxx/nginx/static;
}
uWSGI安装:
这个是安装在虚拟环境中,先workon test进入虚拟环境,安装uWSGI前需要先安装依赖,输入以下命令完成安装
apt-get install build-essential python
apt-get install python-dev
pip install uwsgi
这里遇到问题uwsgi安装失败 异常栈信息忘了复制了 主要原因是python3还是pip3软连接出错
我是写在python3重新安装才发现的应该安装没问题可以直接设置软连接
Python3.6安装
安装python3.6可能使用的依赖
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
下载python3.6编译安装
# wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz
# tar -xzvf Python-3.6.5.tgz -C /tmp
# cd /tmp/Python-3.6.5/
把Python3.6安装到 /usr/local 目录
# ./configure --prefix=/usr/local
# make
# make install
python3.6程序的执行文件:/usr/local/bin/python3.6
python3.6应用程序目录:/usr/local/lib/python3.6
pip3的执行文件:/usr/local/bin/pip3.6
更改/usr/bin/python链接
# ln -s /usr/local/bin/python3.6 /usr/bin/python 此步骤忽略
# ln -s /usr/local/bin/python3.6 /usr/bin/python3
# ln -s /usr/local/bin/pip3.6 /usr/bin/pip3
配置uWSGI:在django项目的根目录下,新建两个文件,uwsgi.ini和run.log 。第一个是uWSGI的配置文件,第二个是日志记录文件。设置uwsgi.ini文件如下:
[uwsgi]
#使用nginx连接时使用,Django程序所在服务器地址
socket=127.0.0.1:9002
#项目目录
chdir=/root/xxx/xxx/xxx/xxx
#项目中wsgi.py文件的目录,相对于项目目录
wsgi-file=wsgi.py
# 进程数
processes=4
# 线程数
threads=2
# uwsgi服务器的角色
master=True
# 存放进程编号的文件
pidfile=uwsgi.pid
# 日志文件,因为uwsgi可以脱离终端在后台运行,日志看不见。我们以前的runserver是依赖终端的
daemonize=run.log
chdir是django项目所在目录,socket后面的地址是和上面nginx配置文件中的地址uwsgi_pass 127.0.0.1:8000对应的,规定nginx和uWSGI之间的通信端口。daemonize就是日志文件的路径。disable-logging = true 表示不记录正常信息,只记录错误信息。wsgi-file是你django项目根目录下项目同名目录中有一个wsgi.py文件的路径。pidfile是uwsgi.pid文件的路径,这个文件是uWSGI运行后自动生成的,里面记录了uWSGI的进程号,可以用来重启uWSGI。但是我的uwsgi.pid文件记录的进程号老是不对,用不了。
————————————————
版权声明:本文为CSDN博主「Mars_DD」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xing851483876/article/details/84306953
uWSGI基本命令:
启动:uwsgi --ini uwsgi.ini
停止:uwsgi --stop uwsgi.pid
重启:uwsgi --reload uwsgi.pid
注:uwsgi启动命令在自己构建的虚拟环境中启动
然后再外部重启uwsgi服务 这样我们就可以看到启动的进程了
root 8754 0.0 1.8 131516 37820 ? S Sep22 0:03 /root/.virtualenvs/xx/bin/uwsgi --iniuwsgi.ini
root 8956 0.0 2.4 224040 49292 ? Sl Sep22 0:01 /root/.virtualenvs/xx/bin/uwsgi --iniuwsgi.ini
root 8957 0.0 2.2 221896 46744 ? Sl Sep22 0:00 /root/.virtualenvs/xx/bin/uwsgi --iniuwsgi.ini
root 8958 0.0 2.3 222400 47404 ? Sl Sep22 0:00 /root/.virtualenvs/xx/bin/uwsgi --iniuwsgi.ini
root 8959 0.0 1.5 205248 31108 ? Sl Sep22 0:00 /root/.virtualenvs/xx/bin/uwsgi --iniuwsgi.ini
通过外网访问阿里云地址就可以看到nginx代理成功
如果遇到mysql ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
参考https://blog.csdn.net/lmss82/article/details/4414178
1.#ps -A|grep mysql
显示类似:
1829 ? 00:00:00 mysqld_safe
1876 ? 00:00:31 mysqld
2.#kill -9 1829
3.#kill -9 1876
4.#/etc/init.d/mysql restart
5.#mysql -u root -p
uwsgi是运行的virtualenvs 虚拟环境中的程序如果启动在系统中如/user/local/bin是访问不到服务的所以要kill 掉错误的uwsgi进程重新启动虚拟环境中的uwsgi
image.png