记一次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

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前做反向代理。

image.png

我们在本地开发的时候没有安装过以上服务器,但是也可以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

你可能感兴趣的:(记一次django+uwsgi aliyun环境搭建)