Centos7+nginx+uwsgi来部署我的Django项目

前不久写了个小的博客项目,想着将它部署到服务器上去,因为是第一次部署项目,有很多的东西都不这么懂,走了很多的弯路,现在部署成功了,怕以后忘记了就记录下笔记

首先我的项目结构如下:

Centos7+nginx+uwsgi来部署我的Django项目_第1张图片

关于服务器的远程连接,我用的服务器是阿里云的轻量应用服务器,连接数据库的软件通过WinSCP来连接我的服务器

这里我将我的服务器重置为CentOS 7.3 ,系统重置后原来的密钥还存在,但是不能通过验证,重新再获取密钥然后通过puttygen.exe软件来转为 .ppk 私钥文件。这部分操作参考:远程连接到Linux操作系统实例,

WinSCP连接成功后

Centos7+nginx+uwsgi来部署我的Django项目_第2张图片

通过ctrl+p来打开putty,前提得安装了putty,在putty中进行命令安装。

需要安装的东西:python3.6.7, MySQL8.0,nginx,uwsgi,django2.1

1,安装nginx,安装epel-release源进行安装

yum install epel-release
yum update
yum install nginx

防火墙执行相关的应用操作:

systemctl start nginx #启动
systemctl stop nginx #停止
systemctl restart nginx #重启
systemctl status nginx #查看运行状态
systemctl enable nginx #开机启动

防火墙的设置

如果出现启动后无法通过IP访问,需要进一步设置防火墙:

firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload

nginx的启动和关闭

pkill -f nginx  #关闭
nginx    #启动

绿色状态就是启动成功

Centos7+nginx+uwsgi来部署我的Django项目_第3张图片

总之,在浏览器输入你的服务器公网IP能出现下面页面应该就是成功的

Centos7+nginx+uwsgi来部署我的Django项目_第4张图片


2,MySQL8.0的安装和数据传输。

不同CentOS的系统安装的MySQL包是不同的,我的Centos系统是7.3版本的,所以安装的版本是el7

EL6 is the download for Red Hat 6.x, CentOS 6.x, and CloudLinux 6.x. 
EL7 is the download for Red Hat 7.x, CentOS 7.x, and CloudLinux 7.x.

下载

从MySQL Yum 仓库:http://dev.mysql.com/downloads/repo/yum/下载合适自己电脑版本的rpm包。

1、yum仓库下载MySQL:sudo yum localinstall https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm

2、yum安装MySQL:sudo yum install mysql-community-server

3、启动MySQL服务:sudo service mysqld start

4、检查MySQL服务状态:sudo service mysqld status

5、查看初始密码(如无内容直接跳过):sudo grep 'temporary password' /var/log/mysqld.log
    

6. 更改密码:
建议直接 vim /etc/my.cnf ,在配置文件中添加 skip-grant-tables(跳过密码验证,需要重启mysql服务),然后再 mysql -u root -p 登录
 use mysql; 
    ---> update user set authentication_string='' where user='root';(将root密码置空)
    --->删除my.cnf中的skip-grant-tables --->service mysqld restart(重启MySQL服务)--->登录MySQL
    --->mysql> ALTER user 'root'@'localhost' IDENTIFIED BY 'Root123!';(密码太简单不会通过)

 修改配置文件:

vim /etc/my.cnf 

[mysqld]
# 添加编码配置
character_set_server=utf8
init_connect='SET NAMES utf8'
# 设置外部IP可以访问
bind-address = 0.0.0.0

关于MySQL8.0版本的远程访问权限设置:

以前可以直接使用:GRANT ALL ON *.* TO 'root'@'%';授权root用户的所有权限并设置远程访问,但是新版本MySQL将创建用户和赋值权限的方式分开了,所以执行: GRANT ALL ON *.* TO 'root'@'%'; 会提示:ERROR 1410 (42000): You are not allowed to create a user with GRANT

解决方法:

1,为MySQL创建用户:rong, 密码为:
CREATE USER rong IDENTIFIED BY 'Root123!';

2,给用户授权
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='rong';

关于使用Navicat等可视化工具连接MySQL时会提示2059错误,这是因为 MySql8.0版本和旧版本的加密规则不一样,刚刚测试发现没有改加密规则Navicat好像也能直接连接阿里云的MySQL,可能是后面最新版本的Navicat可能升级了加密规则,可以直接连接MySQL8.0版本

使用Navicat等可视化工具连接时输入用户,密码,会提示2059错误,这是因为 MySql8.0版本和旧版本的加密规则不一样,
而现在的可视化工具只支持旧的加密方式,所以需要更改MySQL8.0用户登录的加密规则:mysql_native_password
ALTER USER 'root'@'%' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER; 修改加密规则
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'password'; 更新root用户密码

开启防火墙的端口设置

CentOS7的默认防火墙为firewall,默认是不打开的。

systemctl start firewalld    #启动friewall
systemctl status firewalld 查看firewall启动情况
firewall-cmd --zone=public --add-port=3306/tcp --permanent 开启3306端口
firewall-cmd --reload  #重启防火墙
firewall-cmd --list-ports   #检查打开的端口

对了,如果用的阿里云服务器还需要到控制台开启对应的端口(3306),不然还是连接不上MySQL


安装python3.6

Centos7默认安装的是python2.7.5,我们可以通过 python -V来查看pyhton版本,然后使用命令 which python 查看一下Python可执行文件的位置。

安装相关包,增加编译功能,防止安装python出现各种异常

1.安装相关包:
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make
    2.编译安装python3:
        wget https://www.python.org/ftp/python/3.6.7/Python-3.6.7.tar.xz
    3.解压:tar -xvJf  Python-3.6.7.tar.xz
    进入到解压后的目录: cd Python-3.6.7
    4.编译安装:
        ./configure prefix=/usr/local/python3  
        make && make install
    添加软连接:
        ln -s /usr/local/python3/bin/python3 /usr/bin/python3

    安装pip3
        将之前安装的python3中的pip3添加上软连接就可以:ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3

通过 wget https://www.python.org/ftp/python/3.6.7/Python-3.6.7.tar.xz 来下载安装包,中间最好不要有断网的,不然后面进行编译安装可能会出现问题

更新pip:

pip install --upgrade pip(默认更新python2的pip)
pip3 install --upgrade pip 更新python3的pip

创建虚拟环境

1,安装安装virtualenv
    pip install virtualenv   #安装到python2中
    pip3 install virtualenv  #安装到python3中
2,安装virtualenvwrapper
    pip install virtualenvwrapper   #安装到python2中
    pip3 install virtualenvwrapper   #安装到python3中
    需要注意的是这两个都得装,如果只装python3的话,workon命令是用不了的。
3,查找位置:
    find / -name virtualenvwrapper.sh
4,编辑配置文件
    cd~  -->  vim ~/.bashrc
    添加下面两个命令到最后,用来指定虚拟环境的位置。
        export WORKON_HOME=~/.virtualenvs
        source /usr/local/python3/bin/virtualenvwrapper.sh
    执行.bashrc使文件生效: source ~/.bashrc
5,创建虚拟环境
    mkvirtualenv -p /usr/bin/python3 env_name  (最后的env_name为虚拟环境的名称)

创建完虚拟环境后通过下面命令导出我们的项目依赖的包(在pycharm中执行),然后在安装

pip freeze > requirements.txt # 导出项目依赖的包名到文件中
在虚拟环境中安装requirements.txt文件中所有的包(requirements.txt文件通过WinSCP软件上传到CentOS上去)
通过workon命令就可以查看所有虚拟环境的目录,workon env_name 进入该虚拟环境, deactivate退出虚拟环境,(删除虚拟环境:rmvirtualenv 虚拟环境名)
在CentOS的python虚拟环境中下载这些依赖包:pip install -r requirements.txt

可能会出现的错误

错误一:
出现Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build*解决办法
    解决:easy_install -U setuptools

错误二:
    安装mysqlclient时可能会出错,显示OSError: mysql_config not found,mysql_config 找不到,
    所以导致mysqlclient安装不上,centos需要再安装下面这些依赖就可以有mysql_config了.
    解决:yum install mysql-devel gcc gcc-devel python-devel

安装uwsgi

pip install uwsgi

创建配置文件

将Windows中的项目文件通过winscp上传到Linux中,这里将项目文件直接放到root目录下,然后在 /root/Django_blogs/  目录下新建一个文件夹conf, Django_blogs是我的项目文件。

在conf中创建uwsgi的配置文件(uwsgi.ini):

[uwsgi]

chdir           = /root/Django_blogs  # 项目路径

module          = Django_blogs.wsgi

master          = true

processes       = 5

socket          = 127.0.0.1:8000

vacuum          = true

virtualenv = /root/.virtualenvs/blog_py3  #虚拟环境地址

 在conf下新建nginx的配置文件(my_nginx.conf):

upstream django {
# server unix:///path/to/your/mysite/mysite.sock; # for a file socket
server 127.0.0.1:8000; # for a web port socket (we'll use this first)
}
# configuration of the server

server {
    listen      80;
    server_name 47.107.**.222 www.rongdang.top ; # 你的IP地址和备案后的域名
    charset     utf-8;

    client_max_body_size 75M;   # adjust to taste

    location /media  {
        alias /root/Django_blogs/media/;  # 指向django的media目录
    }

    location /static {
        alias /root/Django_blogs/blog/static/; # 指向django的static目录
    }

    # Finally, send all non-media requests to the Django server.
    location / {
        uwsgi_pass  django;
        include     uwsgi_params; # the uwsgi_params file you installed
    }
}

对项目进行更改

settings.py

DEBUG = False

ALLOWED_HOSTS = ['*']

# 静态文件路径
STATIC_URL = '/static/'
STATIC_ROOT = (os.path.join(BASE_DIR, 'blog/static'))

# 媒体文件路径
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

Djnago_blogs/urls.py

from django.views.static import serve
from Djnago_blogs.settings import STATIC_ROOT, MEDIA_ROOT

urlpatterns = [
    # 静态文件和媒体文件访问处理函数,如果不添加,在生产环境下则无法访问静态文件和媒体文件
    re_path(r'^static/(?P.*)/$', serve, {'document_root': STATIC_ROOT}),
    re_path(r'^media/(?P.*)$', serve, {'document_root': MEDIA_ROOT})
]

在url.py文件中一定要添加静态文件和媒体文件访问处理函数,如果不添加的话,运行项目时,即使你的路径是正确的也加载不出对应的静态文件。

将nginx配置文件添加到nginx的启动配置文件中

ln -s /root/Django_blogs/conf/my_nginx.conf /etc/nginx/conf.d/

如果nignx下没有 conf.d 文件夹则添加一个就是了。

cd到项目路径,搜集所有的静态文件到static下,包括admin中的。

python manage.py collectstatic

最后通过Navicat,将Windows数据库中的数据传输到阿里云服务器的数据库中(点击工具-->数据传输)

settings.py中的数据库连接也需要修改,因为密码不一样了。


修改nginx用户为root用户: vim /etc/nginx/nginx.conf 修改第一行用户为root用户,然后 pkill -f nginx 关闭nginx,nginx 启动nginx

最后启动uwsgi就可以通过域名看到我们的网站了。最后加 & 代表后台运行

uwsgi -i /root/Django_blogs/conf/uwsgi.ini &

关于使用uwsgi测试运行

可以使用uwsgi的http协议访问自己django写的网站,例如:
    uwsgi --http :8000 --chdir /root/mysite --home /root/mysite_env --module mysite.wsgi:application

    /root/mysite  --> 指定项目所在路径, /root/mysite_env --> 指定项目的虚拟环境 ,这里mysite为我们的项目名
    注意:如果是在系统环境中运行该代码,系统环境中要有项目所有的python包,这里我是进入虚拟环境中运行。

这样测试运行的话静态文件什么的应该是找不到的,例如我的 1.jpg 图片在 /static/img 下,通过上面一段代码运行则显示出来的图片路径在 /static/css/img/1.jpg  但是不用关心,只要程序能运行就行,然后我们通过 uwsgi -i /root/Django_blogs/conf/uwsgi.ini

运行项目后,那些问题就不会存在了,路径也能访问正确。


参考:https://blog.csdn.net/geerniya/article/list/3, 这位博主的文章给我提供了很大帮助

 

你可能感兴趣的:(Django)