Linxu + uWSGI + Nginx部署Django

服务器参数

服务器:阿里云 ECS (未作任何配置)
Linux版本:CentOS 7.6 64位

温馨提示:如果服务器重装系统或格式化磁盘,将会导致处浏览器外,本地不可远程登录和上传公钥文件。请看-> 解决方案



一、配置Linux

1.1、用户组管理

  • 创建用户在
groupadd admin

1.2、用户管理

  • 创建用户, 并添加到创建的admin用户组中
useradd langkye -g admin
  • 设置[修改]密码
passwd langkye
  • 修改用户权限(新建用户的权限较低)
sudo vim /etc/sudoers

进入sudoers中,在 root ALL=(ALL) ALL下面添加:

langkye ALL=(ALL) ALL
  • 删除用户
userdel -rf langkye

-rf表示删除用户名和用户关联的邮箱等文件,否则若新建相同的用户将会提示用户已存在

1.3、远程登录

  • 禁止root远程登录
sudo vim /etc/ssh/sshd_config

#PermitRootLogin yes修改为PermitRootLogin no

  • 重启sshd服务
sudo systemctl restart sshd.service

成功之后,只能用其它用户远程登录服务器。而不能用root用户进行远程登录。

1.4、免密(证书)登录远程服务器

1.4.1、在[本地]创建.ssh隐藏目录,用于保存本地生成的公钥和私钥(一般建在用户目录下)

  • 命令行创建(Mac或安装了Git-bash的Windows)
mkdir ~/.ssh

说明~表示用户主目录,即Windows的c:/Users/自己的用户名; Mac, /home/当前登录的用户名

  • 图形界面创建(略)

1.4.2、创建密钥对

cd ~/.ssh
ssh-keygen -t rsa -C AliCloud -f AliCloud

说明:-t, 选中加密方式;-C, 描述;-f, 生成的密钥对文件名
输入命令后一路回车...
成功后,在.ssh目录下会出现[AliCloud] 和 [AliCloud.pub]两个文件。其中,AliCloud.pub为公钥;AliCloud为私钥。

1.4.3、将公钥上传到服务器
利用ssh提供的远程拷贝命令[scp]来上传公钥文件。

cd ~/.ssh
scp AliCloud.pub langkye@服务器公网IP:.

1.4.4、在服务器中配置

cd ~
mkdir ~/.ssh
touch authorized_keys
cat AliCloud.pub >> ~/.ssh/authorized_keys
  • 修改.ssh和authorized_keys的权限为当前登录用户所有
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

1.5、在本地配置登录

cd ~/.ssh
vim config

添加:

Host langkye # 本地登录的名字,可随意
    HostName 服务器A公网IP
    Port 22 # SSH端口
    User 用户名
    IdentityFile ~/.ssh/AliyunCS # 密钥路径

Host Tencent
    HostName 服务器B公网IP
    Port 22
    User langkye
    IdentityFile ~/.ssh/TencentCS

1.6、免密登录

ssh langkye

1.7、配置防火墙

1.7.1 更新yum

sudo yum -y update

1.7.2 配置yum自动更新

  • 安装插件
sudo yum install -y cronie yum-cron
  • 修改配置文件
sudo vim /etc/yum/yum-cron.conf

更改:

# 启用自动更新 
# apply_updates = no
apply_updates = yes
  • 启动服务
sudo systemctl start crond
sudo systemctl start yum-cron

1.7.3 安装防火墙

sudo yum install -y firewalld

1.7.4 启动防火墙

sudo systemctl start firewalld.service
  • 查看防火墙状态
sudo firewall-cmd --list-all

1.8、修改ssh端口

1.8.1 修改ssh服务配置文件

sudo vim /etc/ssh/ssd_config

修改Port 22

1.8.2 将防火墙中关于ssh的配置拷贝到防护墙工作路径中

sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/

修改<port protocol="tcp" port="22" />:

<port protocol="tcp" port="必须与上一步修改的端口一致" />

1.8.3 在服务器控制台中开放相应的端口(略)

1.8.4 通过控制台远程登录服务器重启ssh服务和防火墙

sudo systemctl restart sshd.service
sudo systemctl restart firewalld.service

1.8.5 修改本地ssh的端口

vim ~/.ssh/config
  • 将Port端口设置一致即可


二、安装并配置数据库

以mariadb为例,它与MySQL几乎相同

2.1、安装数据库

  • 安装mariadb数据库和mariadb数据库服务
sudo yum -y install mariadb mariadb-server
  • 启动数据库
sudo systemctl start mariadb
  • 设置开机自启
sudo systemctl enable mariadb.service
  • 设置root密码
mysql_secure_installation

步骤:跳过第一次的输入密码,设置密码、确认密码,一路回车...

2.2、创建项目的数据库。如:

create database mysite


三、配置Python3

3.0、安装python所需依赖

  • Centos
sudo yum -y install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel splite-devel zlib-devel libffi-devel MySQL-python mysql-deve

3.1、准备python3安装包(--version 3.7.3)

  • 创建用于保存python3安装包的文件夹, 并将python3下载到改文件夹内
mkdir ~/py3
cd ~/py3
wget https://www.python.org/ftp/python/3.8.2/Python-3.8.2.tgz

3.2、解压 Python-3.7.tgz

tar -zxvf Python-3.7.tgz

3.3、安装python3

3.3.1 指定python的安装路径

  • 创建安装文件夹
sudo mkdir /usr/local/python3
  • 利用Python-3.7.3文件夹的configure文件来指定安装的目录
sudo ~/py3/Python-3.7.3/configure --prefix=/usr/local/python3/
  • 编译
cd ~/py3/Python-3.7.3/
make
  • 安装
cd ~py3/Python-3.7.3/
sudo make install

3.4、创建软连接(快捷命令)

3.4.1 创建python3软连接

cd ~py3/Python-3.7.3/
sudo ln -s /usr/local/python3/bin/python3 /usr/bin/python3
  • 查看快捷方式是否创建成功
python3 --version

输出对应的Python版本,则表示成功。如:

Python 3.7.3

3.4.2 创建pip3软连接

sudo ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
  • 查看版本
pip3 --version

3.5、安装mysqlclient

sudo pip3 install mysqlclient


四、Django的安装与配置

4.1、安装Django

sudo pip3 install django==2.2

4.2、创建dango-admin软连接

sudo ln -s /usr/local/python3/bin/django-admin /usr/bin

4.3、创建Django项目

  • 创建项目文件夹
mkdir ~/../www
  • 创建项目
cd ~/../www/
sudo django-admin startproject mysite
  • 添加views.py
sudo vim ~/../www/mysite/mysite/views.py

添加:

from django.http import HttpResponse

def index(request):
    return HttpResponse("Hello Word~")
  • 编辑urls.py
sudo vim ~/../www/mysite/mysite/urls.py

修改:

from django.contrib import admin
from django.urls import path
from . import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.index),
    path('index', views.index),
]
  • 修改settings.py
sudo vim ~/../www/mysite/mysite/settings.py
ALLOWED_HOSTS = ['localhost','服务器公网IP']

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mysite',
        'USER': 'root',
        'PASSWORD': '你的数据库密码',
        'HOST': 'localhost',
        'PORT': '3306',
    }
}
  • 数据库迁移
sudo python3 manage.py migrate
  • 安装tree
sudo yum install -y tree

4.4、测试

  • 启动Django
sudo python3 manage.py runserver 0.0.0.0:80

正常则可以同IP访问~

五、本地同步代码到服务器(VsCode)

5.1、配置Vscode

5.1.1 常规操纵

  • 在本地创建用于保存代码的文件夹
mkdir ~/mysite
  • 用VSCode打开创建的mysite文件夹

  • 安装sftp

5.1.2 配置sftp
注意:Json不支持注释。

  • Ctrl + Shit + P,输入并选择sftp:Config。做如下配置:
{
  "name": "mysite",
  "host": "公网IP",
  "protocol": "sftp",
  "port": 默认22,如果之前改过ssh端口,则应一致,
  "username": "服务器登录用户",
  "remotePath": "/home/www/mysite",
  "uploadOnSave": true,
  "ignore": [
    ".vscode",
    ".git",
    ".DS_Store",
    "__pycache__",
    ".idea"
  ],
  "syncOption": {
    "delete": true
  },
  "watcher": {
    "files": "**/*",
    "autoUpload": true,
    "autoDelete": true
  }
}

然后就能看到服务器创建的项目目录结构文件...

5.2、将服务器项目下载到本地

5.3、修改服务器项目的所有者

由于远程服务器创建的项目的所有者时langkye用户,本地以langkye用户连接的,没有权限修改文件
ls -alll命令来查看修改所有者前后的差异。

  • 将项目所有者改为langkye
sudo chown -R langkye mysite


六、安装uWSGI

6.1、安装

sudo pip3 install uwsgi

6.2、创建uwsgi软连接

sudo ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi3

七、安装Nginx

6.1、安装

sudo yum -y install nginx

八、配置uwsgi和Nginx

8.1、创建文件夹

  • 项目外:collected_statci
  • 项目根目录:templates、static、uwsgi

8.2、修改settings.py

  • 修改内容如下:
DEBUG = False

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.paty.join(BASE_DIR, 'templates'), # 修改这里
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

STATIC_ROOT = os.path.join(BASE_DIR, '../collected_statci')
STATICFILES_DIR = (
    os.path.join(BASE_DIR, 'static'),
)

8.3、收集打包静态文件

cd /home/www/mysite
sudo python3 manage.py collectstatic

8.4、uwsgi配置

  • 在项目根目录创建 uwsgi.ini
    内容如下:
[uwsgi]
socket = 127.0.0.1:8000
chdir = /home/www/mysite
module = mysite.wsgi
master = true
processes = 1
threads = 2
max-requests = 2000
chmod-socket = 664
vacuum = true

stats = %(chdir)/uwsgi/uwsgi.status
pidfile = %(chdir)/uwsgi/uwsgi.pid
daemonize = %(chdir)/uwsgi/uwsgi.log

8.5、配置Nginx

sudo vim /etc/nginx/nginx.conf

将以下部分内容:

    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

修改为:

    # for more information.

    server {
        listen 80;
        server_name  localhost;
        charset utf-8;

        location / {
            uwsgi_pass 127.0.0.1:8000;
            include /etc/nginx/uwsgi_params;
        }
        location /static {
            alias /home/www/collected_static/;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

8.6、启动uwsgi

sudo uwsgi3 --ini uwsgi.ini

8.7、启动nginx

sudo systemctl start nginx

8.9、测试

两个服务都启动成功,则可以在浏览器通过IP来访问了~

十、其它

、本地修改内容和,重启uwsgi

cd /home/www/mysite/uwsgi/
sudo uwsgi3 --reload uwsgi.pid
原文地址:https://www.cnblogs.com/langkye/p/12630123.html