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 -al
或ll
命令来查看修改所有者前后的差异。
- 将项目所有者改为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