Django - 部署到Linux服务器

首先进行文件的打包:

1
pip freeze > requirements.txt

然后创建服务器, 进行ssh登录。

在服务器操作如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# 进行服务器软件更新
apt update && apt upgrade

# 设置服务器的名称为Django-server
hostnamectl set-hostname django-server

# 查看hostname
hostname

nano /etc/hosts
# 添加
youripaddress django-server

# 添加账户
adduser <username>
adduser <username> sudo

# 然后使用newuser 进行ssh 连接


# 在本地电脑上操作
# 创建一个ssh目录, -p 为允许创建目录和子目录, ~ 表示为主目录下面
mkdir -p ~/.ssh

# 在本地进行生成ssh key
ssh-keygen -b 4096

# 本地的为id_ra 服务器为pub
# 传输pub key 到服务器
scp ~/.ssh/id_rsa.pub username@ip:~/.ssh/authorized_keys

# 然后给.ssh 文件夹写入权限, 给.ssh 文件夹读取权限
sudo chmod 700 ~/.ssh/
sudo chmod 600 ~/.ssh/*

# 然后进行ssh, 不用密码连接
ssh username@ip


# 在服务器上修改sshd_config
# passwordauthorize No
# rootlogin No
nano /etc/ssh/sshd_config

# 重载ssh服务
sudo systemctl restart sshd

# 安装防火墙
sudo apt install ufw

# 更改防火墙
sudo ufw default allow outgoing
sudo ufw default deny incoming
sudo ufw allow ssh
sudo ufw allow 8000 # django
sudo ufw enable
sudo ufw status # ufw status

# 把requirements.txt 复制到工程文件下面, 然后传到服务器根目录下面
scp -r project_name username@ipaddress:~/

# 安装python3-pip
sudo apt install python3-pip

# 安装env
sudo apt install python3-venv

# 创建env
python3 -m venv project_name/venv

# 启动env
cd project_name
source venv/bin/activate

# 安装环境
pip install -r requirements.txt

# 设置Django -- settings -- ALLOWRD_HOSTED = ['ip_address']
# 设置STATIC_ROOT = os.path.join(BASE_DIR, 'static')

# 进行项目集合
python manage.py collectstatic
python manage.py runserver 0.0.0.0:8000

# 安装Apache2
sudo apt install apache2
sudo apt install libapache2-mod-wsgi-py3

# 进入Apache2设置
cd /etc/apache2/sites-available/

# 创建一个Django.conf
sudo cp 000-default.conf django_project.conf

# 编辑django_project.conf
sudo nano django_project.conf

# 在vitrulHost中添加下面代码

Alias /static /home/"<username>"/"<django_project>"/static
<Directory /home/"<usernaem>"/"<django_project>"/static>
Require all granted
</Directory>


Alias /media /home/"<username>"/"<django_project>"/media
<Directory /home/"<usernaem>"/"<django_project>"/media>
Require all granted
</Directory>



<Directory /home/"<usernaem>"/"<django_project>"/"<django_project>">
<Files wsgi.py>
Require all granted
</Files>
</Directory>

WSGIScriptAlias / /home/"<userneme>"/"<django_project>"/"<django_project>"/wsgi.py


WSGIDaemonProcess django_app python-path=/home/"<username>"/"<django_project>"/venv

WSGIProcessGroup django_app


# 启动Django设置
sudo a2ensite django_project

# 关闭000-default.conf
sudo a2dissite 000-default.conf

# 设置Apache2服务器权限
sudo chown :www-data django_project/db.sqlite3
sudo chmod 755 django_project/db.sqlite3
sudo chown :www-data django_project
sudo chown -R :www-data django_project/media
sudo chmod -R 755 django_project/media
sudo chmod 775 django_project/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 设置隐藏服务器密码
sudo touch /etc/config.json

# nano /etc/config.json

# 在django_project -- settings 中
# import json
# with open("etc/config.json") as config_file:
# config = json.load(config_file)
# SECRET_KEY = config['SECRET_KEY']
# DEBUG = Flase

# 删除8000端口
sudo ufw delete allow 8000

# 添加http/tcp
sudo ufw allow http/tcp

# 重启服务器
sudo server apache2 restart
systemctl reload apache2

/etc/config.json文件

1
2
3
4
5
6
{
"SECRET_KEY": "xxx",
"EMAIL_USER": "xxx@163.com",
"EMAIL_PASS": "xxx"

}

然后在django_project -- setings.py中进行如下配置

1
2
3
4
5
6
7
import json

with open('/etc/config.json') as f:
conf = json.load(f)


SECRET_KEY = conf['SECRTY_KEY']

或者在部署的时候进行根目录部署

然后输出日志器。在根目录下面进行创建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<VirtualHost *:80>

ServerAdmin webmaster@localhost
DocumentRoot /var/www/html

ErrorLog /site/logs/error.log
CustomLog /site/access.log combine

alias /static /blog_project/static
<Directory /blog_project/static>
Require all granted
</Directory>

<Directory /blog_project/blog_project>
<Files wsgi.py>
Require all granted
</Files>
</Directory>

WSGIDaemonProcess blog_project python-path=/blog_project python-home=/blog_project/venv
WSGIProcessGroup blog_project
WSGIScriptAlias / /blog_project/blog_project/wsgi.py

</VirtualHost>

解决图片上传有中文问题:

1
/etc/apache2/envvars
1
2
3
4
5
6

export LANG='zh_CN.UTF-8'
export LC_ALL='zh_CN.UTF-8'

export LANG='en_US.UTF-8'
export LC_ALL='en_US.UTF-8'