Ubuntu+pyenv+Django+Nginx+Uwsgi的项目部署历程

整理三天的爬坑过程,进进出出的,太难了!!

- - -Ubuntu+pyenv+Django+Nginx+Uwsgi的项目部署历程

数据打工者工作之余用Django写了个简单网站(主要是跟着教程写的),废话不多说直接开始吧,社会小透明介绍个啥!把自己实践过的整理出来,也防止以后还有类似问题一头雾水,有错的地方请大佬指导!

1,不介绍环境都是耍流氓!

感谢搜索引擎,感谢CSDN各位大佬!以下是我的环境

  • 操作系统:阿里云Ubuntu16.0.4
  • python环境:Python3.6.5
  • Django版本:2.0.2
  • mysql:5.7.28-0ubuntu0.16.04.2 (Ubuntu)
  • 虚拟环境:用的pyenv
  • uwsgi:2.0.18
  • nginx:nginx/1.10.3 (Ubuntu)

2、具体过程

  • 首先将阿里云ubuntu镜像配置好,本地采用远程链接工具链接好root用户。

  • 安装mysql,具体看这里

1.更新系统
apt-get update  【注意:要在root用户下】
2、安装mysql-server
apt-get install mysql-server
apt-get install mysql-client
apt-get install libmysqlclient-dev
3、使用如下命令查询是否安装成功:
sudo netstat -tap | grep mysql
重启mysql
/etc/init.d/mysql restart
登陆:
mysql -uroot -proot
  • 配置远程访问数据库内容看这里
1,命令行登录 mysql,输入用户名,密码
mysql -u root -p

2,切换到 mysql库
use mysql;

3,查看用户表,可以看到当前host是localhost,只允许本地访问
mysql> select host,user from user;
+-----------+------------------+
| host      | user             |
+-----------+------------------+
| localhost | root             |
+-----------+------------------+
1 rows in set (0.00 sec)

4,更新user用户表
mysql> update user set `host` = '%'  where `user` = 'root'  LIMIT 1;

5.分配所有访问权限,如果已分配过,该步骤可跳过
mysql> 
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root密码' WITH GRANT OPTION;

# 我用这个 
GRANT ALL PRIVILEGES ON *.* TO 'tom'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
可以直接创建一个user = 'tom'并且host=’%‘的用户,我也不知道为啥,反正很神奇。

6.强制刷新权限
mysql> flush privileges;

7.再次查看用户表,root用户的host变成%,即允许所有的ip远程访问,如果需要指定具体的ip,就写上具体的ip即可
mysql> select host,user from user;
+-----------+------------------+
| Host      | User             |
+-----------+------------------+
| %         | root             |
+-----------+------------------+
1 rows in set (0.00 sec)


#修改MySQL配置文件
1.使用命令netstat -an|grep 3306 查看端口监听状态,绑定了127.0.0.1,
只允许本地访问,需要修改配置文件。

我当前的版本是这样进的 vim /etc/mysql/mysql.conf.d/mysqld.cnf

2.修改mysqld.cnf,注释掉bind-address 127.0.0.1属性---改成#bind-address 127.0.0.1

3.重启mysql服务service mysql restart,再次使用命令netstat -an|grep 3306查看端口监听状态

后面就是修改云服务器安全组规则,不同云服务器不同入口,具体看相关云服务器文档或者搜索引擎看大佬。
  • 添加用户: useradd -s -m /bin/bash tom (名字您随意) --具体参数含义戳这里
  • 设置用户密码 :passwd tom
  • 配置tom用户sudo权限 vim /etc/sudoers vim操作看这里
    找到’root ALL=(ALL:ALL) ALL‘,在下面新加一行tom ALL=(ALL:ALL) ALL
  • 不建议在root下操作太多东西 su tom 到刚刚新建的用户下
  • 安装pyenv和python ,以下记录是防止文章失踪,整体我都是参考这里
1,安装curl,git
sudo apt-get install curl git-core

2,安装pyenv
curl -L https://raw.github.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash
这个命令会把pyenv安装到当前用户的~/.pyenv目录下.(本文中为/home/tom/.pyenv)

3,环境变量配置
编辑文件 .bashrc ,将下面的代码添加至文件内容末尾
(本文中bashrc文件路径在/home/tom下,vim ~/.bashrc 可以编辑可自行对应到自己的路径)

export PYENV_ROOT="${HOME}/.pyenv"
if [ -d "${PYENV_ROOT}" ]; then
  export PATH="${PYENV_ROOT}/bin:${PATH}"
  eval "$(pyenv init -)"
fi
或者
export PATH="/home/tom/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

修改后保存~
这段代码的作用主要是指明pyenv的位置,
以便以后可以直接在命令行里面运行pyenv命令。 保存在~/.bashrc 文件中是为了每次用户登陆后自动生效。
然后刷新环境变量
source ~/.bashrc

4,开始安装python
4.1 先安装依赖
sudo apt-get install make build-essential libssl-dev zlib1g-dev
sudo apt-get install libbz2-dev libreadline-dev libsqlite3-dev wget
sudo apt-get install llvm libncurses5-dev libncursesw5-dev

4.2 安装python
pyenv install 3.6.6 -v 
(注:这里install的时候最好加一个 -v,否则安装过程信息是不会打印在控制台的,
看上去就好像安装进度卡住了一样,首次安装可能会引起疑惑)

5,pyenv基本操作
查看有哪些版本
pyenv versions 

切换系统默认python环境
pyenv global 3.6.6

卸载某个python版本
pyenv uninstall x.x.x

另外pyenv还有各种其他命令行操作,可自行搜索了解~
重新打开远程SSH窗口可能会遇到pyenv command not found问题,重新source一下.bashrc文件
或者查看解决方案:戳这里

  • 配置虚拟环境
创建一个虚拟环境
pyenv virtualenv 3.6.5 myweb
其中3.6.5是需要指定的python版本, myweb是虚拟环境的名称(随便起的~)

此时,虚拟环境已经创建完成并自动激活,最前面括号的内容是当前的虚拟环境
(myweb) tom@iZuf6ed1y......:~$
  • 检查django是否正常运行

 - 1,上传项目

在原来的django环境中 输入命令pip freeze > required.txt 会在当前目录生成本项目安装的所有依赖,

并写入到required.txt中,然后将需要部署的django代码上传服务器,上传方式我用的ftp。

描述一下我的办法,先用7-zip压缩整个项目目录为tar格式,然后再将压缩好的tar压缩成gzip格式,

用XSHELL或SecureCRT采用crtl+alt+F 可以打开ftp窗口,到自己/home/用户名 目录下拖进去就好了,
其他方法例如SCP貌似不需要打包,方法蛮多的自行选择。

 - 2,项目文件和依赖安装

我的压缩包为django.tart.gz,接下来tar -zxvf django.tar.gz 会解压文件并在当前目录下生成文件夹django

进入虚拟环境 pyenv activate myweb (这个是虚拟环境名字,之前如果没退出的话应该还在),

输入cd /home/tom/django,如果已经在用户目录下就直接cd django。

然后输入pip install -r required.txt ,这样他会一行一行的进行依赖的安装。等待其安装完成。

测试django是否可以正常运行,进入manage.py 目录,

输入 python manage.py runserver 0.0.0.0:8000。

本地浏览器输入{阿里云公网IP}:8000  /(设置了url就写)

这个命令首先需要保证8000端口不被占用,如果占用那就换一个,也可以把8000端口占用的都kill掉,
不过这么粗暴我就不建议了,毕竟自己不懂,杀出问题就不好了,还有就是1024以下端口好像需要root用户才可以,
再有就是这个需要保证阿里云安全组8000端口开放。还有一个就是django下的settings.py中改一下
DEBUG = False   # 关闭调试模式。
ALLOWED_HOSTS = ['*']    # 允许所有主机访问。
可能还有遗漏的以后继续补充。。

数据库新建一个原来项目同名的数据库,如原来数据库用的tom现在也在服务器上新建一个tom的数据库,
可以用可视化,可以用命令行,大佬随意。
然后进入项目目录
python manage.py migrate
ORM映射到数据库完事
  • 安装uwsgi
pip install uwsgi
等待安装成功,应该基本应该可以安装成功 ,之前我一直出问题的是记得ssl问题 。
后来按照这个步骤来,在安装python的时候安装了足够的依赖应该问题不大。
  • 测试一下uwsgi
    vim uwsgi_test.py
#官网提供的代码
1 def application(env, start_response):
2         start_response('200 OK',[('Content-Type', 'text/html')])
3         #return ['Hello world'] # Python2
4         return [b'Hello world'] # Python3

保存后退出,输入uwsgi --http :8000 --wsgi-file uwsgi_test.py,值得注意的是http 和:8000之间有一个空格
后在本地输入公网IP:8000如果出现Hello world代表没问题。

  • 写一个ini文档方便启动
    在与manage.py同级目录建立一个uwsgi.ini文件输入以下,
[uwsgi]
#如果单独使用uwsgi来部署Django项目时,就用这一行。
#http=0.0.0.0:8000

#如果使用nginx+uwsgi来部署Django项目时,就用这行。
#其中,8001端口用来跟nginx通信。也要在阿里云防火墙中添加8001端口。
# socket=0.0.0.0:8001

#你项目的完整路径。
chdir=/home/tom/django    
#给socket文件赋权限,这里不用管。
# chmod-socket=664
 
#启用主线程。
master=true
processes=4
threads=2

#指定日志文件(会自动创建)。这个很重要,如果uwsgi出现错误,可以通过日志文件来查错。
logto=uwsgi.log
#指定进程号文件(会自动创建)。这个也很重要,如果要重启和关闭uwsgi,则需要这个文件,里面记录了进程号。
pidfile=uwsgi.pid

#指定wsgi文件。在与settings.py同级目录中会有一个wsgi.py文件。
这里和settings.py里面的WSGI_APPLICATION是一样的,就是后面application前面是冒号“:”
--前面mydj是在创建django项目的时候那个startproject后面的名字。
module=mydj.wsgi:application

保存并退出,输入uwsgi --ini uwsgi.ini
可能会有的问题
1, 端口被占用,ps -ef |grep uwsgi 可以查看,然后kill -9 PID杀掉,再重新运行。一般是没有问题的了。。2, 还有可能就是配置文件有些东西没写,注意看错误提示,时刻准备着翻译软件。
一样的 公网IP:8000访问,正常访问就成功啦,现在静态文件还没有加载,后面采用nginx的时候就会有啦。

  • 如果能进行到这一步 基本离成功不远了 哈哈。
  • Nginx来啦
    安装测试一下?
# 简单粗暴
sudo apt-get install nginx
#运行
sudo /etc/init.d/nginx start

如果出现sudo: unable to resolve host问题,参开这里
如果出现端口占用情况,通过修改配置文件换用其他端口(如8000),新环境一般是不会被占用吧 ,我一路丝滑通畅。
如果出现端口没被占用但无法访问,请回到云服务器配置安全组出查看端口策略是否配置完备
打开浏览器访问 xx.xx.xxx.xxx:80,其中xxxx是你的公网IP,80是Nginx默认监听的端口号
出现如下就成功啦
在这里插入图片描述

  • 打包django中的静态文件
    刚开始我一直在想打包啥的好像没啥必要,直接指向就妥了。
    再次部署了一遍 确实不需要打包,直接指向项目内的dist静态文件夹位置就好,不清楚为什么要打包.多学习可能就知道了
#首先在settings.py文件写入打包的目标路径
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
# 保存退出,然后
python manage.py collectstatic 
#会自动将我们项目的中采用static方式加载的静态文件打包到static文件夹中
  • 修改nginx配置
    这里我所搜索到内容就很多了,十分建议学好英语,以后咱们看官方文档吧,我反正被搞死了。
    后面是我目前项目的中的写法 ,犯错误得话请大佬指出,非常感谢!!!

    我这里nginx启动读取配置得是/etc/nginx/nginx.conf,我怕出问题,第一步备份
    进入目录
    cd /etc/nginx/
    备份一个nginx.conf.bak
    sudo mv nginx.conf ./nginx.conf.bak
    然后 新建一个nginx.conf文件
    sudo vim nginx.conf
    键入如下内容
    需要注意的是,是需要用分号;结尾的

# myweb_nginx.conf
#下面都是本项目的路径,自己的路径按照样例配置哦


events{
        worker_connections 1024; #这个反正我也不懂,后面在慢慢补充....
}

http{
# configuration of the server
server {
    # the port your site will be served on
    listen      80; # 监听的端口 就是那个浏览器访问xx.xxx.xxx:80 这个80
    # the domain name it will serve for
    server_name 0.0.0.0; # 可以填写你自己的域名
    charset     utf-8;
    
    #后面这两行是配置log文件的输出位置,
    #虽然我配置了,但是我在运行的时候发现在原来的那个默认位置他好像还需要输出?那就很尴尬了。
    access_log  /home/tom/myweb/config/nginx/myweb_nginx_access.log;
    error_log  /home/tom/myweb/config/nginx/myweb_nginx_error.log;
    
    #这下面这个是当时配置好了之后 发现浏览器还是无法读取静态文件 借助搜索引擎才添加上,感谢大佬指导!
    include mime.types;
    default_type application/octet-stream;

    # max upload size
    client_max_body_size 75M;   # adjust to taste

    # Django media  读取你的meida静态文件
    location /media  {
        alias  /home/tom/myweb/meida;; # your Django project's media files - amend as required
    }
	#这个就是之前那个命令收集的static文件位置了
    location /static {
       
        alias /home/tom/myweb/static; # your Django project's static files - amend as required
    }

    # Finally, send all non-media requests to the Django server.
    location / {
       # 这个就是指定uwsgi  将80端口收集到的请求转发给8001端口,欸,刚好uwsgi就在监听这个8001端口
       # 这里的端口号可要和uwsgi中的配置文件的socke对准哦。
       # 打开uwsgi 配置的socket = 0.0.0.0:8001的注释,并注释掉http那行
        uwsgi_pass  0.0.0.0:8001
        include     uwsgi_params; # the uwsgi_params file you installed
        uwsgi_read_timeout 30;
    }
}
}

  • 搞了这么多,试试看行不行?
    我的启动方式可能有点蠢,有什么好办法请指导。nginx常用命令在这里
# 首先 看看之前nginx有没有关干净?先试试
sudo nginx -s stop 

#然后
ps -ef |grep nginx # 如果还有 那就粗暴点kill -9 PID 干掉吧。

#接下来配置文件修改了,那我查看一下对不对?
sudo nginx -t  #这个命令可以检查配置文件是否有问题。

#改都改了那重载一下?现在回来看下才发现这个其实是热重启,这执行了其实后面的启动可以不要执行了
sudo nginx -s reload

#然后指定配置文件位置启动
# sudo nginx -c /usr/nginx/nginx.conf

#然后咱们看看启动起来没有
ps -ef |grep nginx
#如果显示下面这样,那真的就是恭喜了!!!你真的启动成功啦!!!
root     30880     1  0 15:47 ?        00:00:00 nginx: master process nginx -c /etc/nginx/nginx.conf
nobody   30881 30880  0 15:47 ?        00:00:00 nginx: worker process
tom      31922  7458  0 23:17 pts/0    00:00:00 grep --color=auto nginx

以上就是这么几天爬坑进进出出的全过程,总结一下,防止以后再出问题。
参考的网址如下,感谢这些大佬的无私分享!!!!
Ubuntu下的Nginx + Uwsgi + Django项目部署详细流程
nginx+uwsgi部署Django项目到Ubuntu服务器全过程,以及那些坑!!!
Nginx常用命令
阿里云服务器Ubuntu 16.04 3安装mysql
阿里云服务器MYSQL数据库开启远程访问
vim 操作命令大全
web页面 显示 Resource interpreted as Stylesheet but transferred with MIME type text/plain的错误警告

再次感谢大佬,努力学习,努力爬坑。
把自己犯的错记录下来,防止后面出问题没地方找,也希望可以帮到其他人!!

猜你喜欢

转载自blog.csdn.net/Net_div/article/details/103701592
今日推荐