CentOS7 Django 项目部署(nginx + uwcgi)

前期准备

  1. 安装nginx
  2. 安装python
  3. git(可以不用)

一、安装virtualenv

建议大家都使用virtualenv,方便不同项目不同的包版本不同导致冲突。不了解的同学可以先去了解下

pip3 install virtualenv

添加到环境变量并建立软链接

ln -s /usr/local/python3/bin/virtualenv /usr/bin/virtualenv

二、项目代码部署到服务器

进入到服务器项目部署目录

cd /www/deploy/

git 拉取代码

# 这是我的项目 你的要换成你的
git clone git@gitee.com:kingofzihua/django.git django/master
# ps: 项目代码的路径为 /www/deploy/django/master 个人习惯,你可以用你自己喜欢的方式

项目目录结构分析

每个项目的目录结构可能不一样,我的项目是自定义的,我在这里稍微说下,不然可能会犯晕

cd  /www/deploy/django/master # 进入项目根路径
tree -L 2 # tree命令找不到的话 就 yum install tree -y 安装下 -L 参数是显示几级目录
.
├── app #项目的目录
│   ├── comm
│   ├── index # index 模块
│   ├── __init__.py
├── bootstrap # 这个就是 django创建的那个很重要的目录
│   ├── __init__.py
│   ├── settings.py # 设置文件
│   ├── urls.py # url文件
│   └── wsgi.py #wsgi文件
├── config # 配置文件
│   ├── mysql.conf.example #mysql的配置文件 我是用 文件包含的方式,并没有在 settings中配置
│   └── uwsgi.xml.example #wsgi的配置文件 内容在下面
├── data # 导出的模块数据存放的目录 `python manage.py dumpdata`
│   └── models.json
├── manage.py
├── requirements.txt # 项目依赖
├── static # 静态文件存放路径
│   ├── js
│   ├── css
├── storage # 一些其他资源文件存放目录
│   └── logs # 日志目录
├── templates # 模版文件
│   ├── inclusion_tag
│   ├── index

三、创建并启动虚拟环境

创建指定版本的虚拟环境

cd  /www/deploy/django/master # 进入项目根路径
virtualenv --python=/usr/bin/python3 venv

启动虚拟环境

cd  /www/deploy/django/master # 进入项目根路径
source venv/bin/activate # 
# 这个时候你的命令行应该是这个样子的
# (venv) [root@localhost master]        # 前面多了一个 (venv)

四、部署项目

安装项目依赖

pip install -r requirements.txt

安装uwcgi

pip install uwcgi

修改数据库配置文件并进行数据填充

修改数据库配置文件:

根据你的配置文件 修改成正确的就行

数据填充:

python manage.py migrate

修改项目文件

bootstrap/settings.py:

DEBUG = False # 关闭DEBUG模式

ALLOWED_HOSTS = ['*'] # 表示此Django站点可以投放的主机/域名的字符串列表

创建uwcgi的配置文件

创建文件/www/deploy/django/master/config/uwsgi.xml写入一下内容:

<uwsgi>
    <socket>127.0.0.1:8080</socket> <!-- 内部端口,自定义 -->
    <chdir>/www/deploy/django/master/</chdir> <!-- 项目路径 -->
    <module>bootstrap.wsgi</module>  <!-- bootstrap为wsgi.py所在目录名-->
    <processes>4</processes> <!-- 进程数 -->
    <daemonize>storage/logs/uwsgi.log</daemonize> <!-- 日志文件 -->
</uwsgi>

创建nginx的配置文件

创建文件/etc/nginx/conf.d/django.conf 并写入一下内容:

server {
    listen       80;
    server_name  blog.kingofzihua.top; # 你的域名 或者ip

    charset utf-8;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        include uwsgi_params; # 引入uwsgi模块的文件
        uwsgi_pass 127.0.0.1:8080; # 端口要和uwsgi里配置的一样
        uwsgi_param UWSGI_SCRIPT bootstrap.wsgi; # wsgi.py所在的目录名+.wsgi 注意看我的目录结构
        uwsgi_param UWSGI_CHDIR /www/deploy/django/master; # #项目路径
    }

    location /static/ {
        alias /www/deploy/django/master/static; # 静态资源访问路径
    }
}

查看配置文件是否正确:

nginx -tc /etc/nginx/nginx.conf

检查如果输出下面这样就说明配置文件没有语法错误

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

启动 uwcgi并重启 nginx

cd /www/deploy/django/master
uwsgi -x config.uwcgi.xml # 启动uwcgi
nginx -s reload # 重启nginx 使得 配置文件生效

访问你的域名

浏览器打开你的域名查看项目部署情况

几个关键的文件配置

django database

bootstrap/settings.py

# Database
# https://docs.djangoproject.com/en/2.1/ref/settings/#databases
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'OPTIONS': {
            'read_default_file': os.path.join(BASE_DIR, 'config/mysql.conf'),
            # 设定sql_mode
            # https://docs.djangoproject.com/en/2.1/ref/databases/#mysql-sql-mode
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"
        },
    }
}

config/mysql.conf

[client]
host = 127.0.0.1
port = 3306
database = payment_platform
user = root
password = root
default-character-set = utf8mb4

uwcgi 配置

config/uwsgi.xml

<uwsgi>
    <socket>127.0.0.1:8001</socket> <!-- 内部端口,自定义 -->
    <chdir>/you/path/django/</chdir> <!-- 项目路径 -->
    <module>bootstrap.wsgi</module>  <!-- bootstrap为wsgi.py所在目录名-->
    <processes>4</processes> <!-- 进程数 -->
    <daemonize>storage/logs/uwsgi.log</daemonize> <!-- 日志文件储存位置 -->
</uwsgi>

@ django中文网

CentOS7 安装 Python3.7

一、更新系统软件包

yum update -y

二、安装软件管理包和可能使用的依赖

yum -y groupinstall "Development tools"
yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel libffi-devel

三、下载Pyhton3并安装

cd /opt/package/ # 自定义目录,随便放到那里就行,根据个人喜好
wget https://www.python.org/ftp/python/3.7.1/Python-3.7.1.tgz

解压

tar -zxvf Python-3.7.1.tgz
cd Python-3.7.1

对软件进行配置

./configure --prefix=/usr/local/python3

安装python3

make -j  # -j 并行编译 
make install

四、建立软链接 添加变量

ln -s /usr/local/python3/bin/python3 /usr/bin/python3 # python
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3 # pip

五、查看Python3和pip3安装情况

python3 --version
pip -V

@ django中文网

Nginx 配置文件详解

主配置文件

# /etc/nginx/nginx.conf
user  nginx nginx;    #设置nginx用户
worker_processes  2;    #工作进程数 一般是cpu的核数
error_log  logs/error.log;    #错误日志的地址
error_log  logs/error.log  notice;    #错误记录的类型 并指定 对应文件
error_log  logs/error.log  info;    #错误记录的类型
pid        logs/nginx.pid;    #pid 存放目录
events {
    worker_connections  1024;    #每个进程最大允许的连接数
}
http {
    include       mime.types;    #设定mime类型,类型又mime.type文件定义
    default_type  application/octet-stream;    #设置默认类型
    #设置日志格式
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  logs/access.log  main;    #成功日志
    sendfile        on;    #指定nginx是否有调用sendfile函数来输出文件 对于普通应用
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;    #连接超时时间
    #gzip  on;    #是否开启gzip压缩

    include /usr/local/nginx/conf/conf.d/*.conf;    #包含文件
}

子配置文件

# /etc/nginx/conf.d/wordpress.conf
#HTTP server
server {
    listen       80;
    server_name  blog.kingofzihua.top;

    if ($host = blog.kingofzihua.top) {
        return 301 https://$host$request_uri;
    }

    return 404;
}
# HTTPS server
server {
        listen       443;    #监听的端口
        server_name   blog.kingofzihua.top;    #域名 或者是IP
        # 设置SSL证书
        ssl_certificate /etc/letsencrypt/live/blog.kingofzihua.top/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/blog.kingofzihua.top/privkey.pem;
        include /etc/letsencrypt/options-ssl-nginx.conf;
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        #定义项目根路径
        root   /www/wordpress;
        location / {
            index  index.html index.htm;
        }
        #error_page  404              /404.html;
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html; #错误页面
        # 错误页面所在目录
        location = /50x.html {
            root   html;
        }
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        # 解析.php结尾的
        location ~ \.php$ {
            fastcgi_pass   127.0.0.1:9000; #指定解析的端口 可以写 unix:/var/run/php5-fpm.sock;
            fastcgi_index  index.php; # 指定默认访问的PHP文件
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name; #$document_root 就是上面设置的root
            include        fastcgi_params;
        }
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
}

CentOS6 用 Let’s Encrypt 和 certbot 搭建 https

安装

打开certbot 官网,选择服务器软件和系统(我的是 NGINX+ CentOS6)

由于CentOS6没有打包版本的Certbot,因此您应该使用certbot-auto脚本来获取副本:

wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto

certbot-auto是和 certbot一样的; 它是一个包装器,可以安装所有自己的依赖项并自动更新客户端代码。

注意:
certbot-auto将一直试图从其最新版本中获取最新版本的自身。如果您希望将其锁定到特定版本并且未收到自动更新,请使用–no-self-upgrade标志运行它 。另外,如果您对从网络上下载和运行脚本感到紧张,则可以使用一些额外的验证步骤。

开始使用

Certbot有一个Nginx插件,它在许多平台上都受支持,并且安装了证书。

sudo ./path/to/certbot-auto --nginx

运行此命令将为您获得证书,并让Certbot自动编辑您的Nginx配置以便为其提供服务。如果您感觉更保守,并且想手动更改Nginx配置,则可以使用certonly 子命令:

sudo ./path/to/certbot-auto --nginx certonly

自动更新

Certbot可以配置为在证书过期之前自动续订您的证书。自从让我们将证书最后加密90天后,最好利用此功能。您可以通过运行以下命令来测试证书的自动续订:
$ sudo ./path/to/certbot-auto renew –dry-run
如果这似乎工作正常,您可以通过添加运行以下命令的cron作业或systemd计时器来安排自动续订:
./path/to/certbot-auto renew

注意:
如果您正在设置cron或systemd作业,我们建议每天运行两次(在您的证书到期续约或撤消之前,它不会执行任何操作,但定期运行它可以让您的站点保持在线状态案例a让我们加密发起的撤销是由于某种原因发生的)。请在一小时内为您的续订任务选择一个随机分钟。