debian从0部署django服务全过程记录

一、安装系统

因为之前常用的CentOs已经停止维护了,所以将服务器上的系统更换成了debian和ubuntu;下面就新系统上面服务的部署从0到完成做一个完整的记录,供诸君参考

  1. debian系统自备,debian属于开源发行版
  2. debian默认的包管理工具apt、apt-get、apt-cache
  3. 本文中debian选用11.3 64位版本;默认已安装python3.9
  4. 升级系统包管理工具
1. apt update -y
2. apt upgrade -y
安装防火墙管理工具(启动之后一直要记得手动打开 ssh连接的22端口)

UFW是一个Arch Linux、Debian和Ubuntu中管理防火墙规则的前端,可大大简化防火墙配置过程;简单易操作

  1. 进行安装
apt install ufw -y
  1. ufw安装之后默认不启动,可以查看状态
ufw status
  1. ufw相关命令速查
# 启动、禁用:
ufw enable
ufw disable

# 列出当前ufw规则
ufw status verbose

# 添加规则:允许入站(allow);默认情况都是拒绝,如果要允许某个端口开放,必须设置
ufw allow ssh       # 添加22端口
ufw allow http      # 添加80端口
ufw allow https     # 添加443端口
ufw allow 2333/tcp  # 添加2333端口,仅TCP协议
ufw allow 6666/udp  # 添加6666端口,仅UDP协议
ufw allow 8888:9999 # 添加8888-9999之间的端口

# 添加规则:拒绝入站(deny)
ufw deny ssh
ufw deny http

# 删除规则
### 语法:ufw delete [规则] <端口>
ufw delete allow 443

# 如果规则很多,可以利用numbered参数查看当前规则和对应序号,然后用ufw delete <序号> 删除
ufw status numbered
ufw delete 4

# 查看ufw可配置的应用名
ufw app list
# 然后可以通过应用名来配置对应应用默认的端口
ufw allow <app name>

# 查看ufw用户手册
man ufw

二、安装并部署nginx

安装nginx依赖
apt install curl gnupg2 ca-certificates lsb-release
安装nginx

nginx是默认在apt仓库中有的,通过install命令可以直接进行安装

apt install nginx -y

安装成功后,系统会默认把nginx启动

管理nginx
  1. 查看nginx状态
systemctl status nginx

会看到nginx已经启动
2. 启动、关闭、重启nginx 命令

# 启动
systemctl start nginx
# 停止
systemctl stop nginx
# 重启
systemctl restart nginx
  1. 也可以使用nginx的命令
# 测试nginx的配置文件是否正确且有效
nginx -t

# 查看nginx 版本
nginx -v

# 停止、退出、重开、重载配置
nginx -s stop
nginx -s quit
nginx -s reopen
nginx -s reload

# 查看版本号和配置项
nginx -V

# 设置前缀路径
nginx -p [path]

# 设置配置文件
nginx -c filename
  1. 设置开机启动
systemctl enable nginx
  1. 开启nginx的默认端口80
ufw allow 80

# 或者查询nginx的对应服务名称
ufw app list
ufw allow 'Nginx HTTP'
ufw allow 'Nginx HTTPS'
ufw allow 'Nginx FULL'
  1. 登录阿里云开启安全组验证
    在控制台>云服务ECS实例>安全组>配置规则。开放80端口;
    如果是设置的其他端口,就开放对应端口,不过建议用默认
  2. 打开公网ip网址验证nginx服务正常
http://172.101.110.120

三、安装并部署redis

安装redis
apt install redis-server
查看redis 服务的状态
systemctl status redis.service
注意!此时不要打开redis安全组和防火墙,因为暴露在公网中非常容易被攻击,然后作为肉机,其他相连服务器都会受到影响;在修改配置文件,并且将所有账户设置密码和权限之后,再打开安全组和防火墙
修改配置文件
vi /etc/redis/redis.conf

# 查找到port,bing并修改
# vim编辑器查找方法(先输入':',输入'/',再输入查看字符,比如'port';查找上一个键入N,查找下一个键入n)
port 6379
bind 0.0.0.0 ::1. # 暴露在公网当中,如果为了安全,建议设置为本机

# 修改最大分配内存
maxmemory 256mb
maxmemory-policy allkeys-lru

# 添加ACL验证(这是redis6之后新增的功能,能精确而安全的控制权限;当然redis也是向后兼容的,用原来的requirepass完全可以,不过建议ACL);同时这里也一定要给默认用户default设置密码,否则不安全
user default on +@all ~* >testpassword
user selfdefine on +@all ~* >selfpassword
# 语法
user <username> <off/on> +@command ~<key>:* ><password>
# 上面的授权即是 default用户拥有所有command的所有key的读写权限,密码为testpassword

# 修改完之后
esc
# 键入':wq'保存退出
重新启动redis服务
systemctl restart redis.service
验证redis登录
# 启动redis客户端,会进入到redis命令执行,键入ACL list 提示无授权,即代表成功
redis-cli

# 指定用户登录
redis-cli --user selfdefine

# 指定用户和密码
redis-cli --user selfdefine -a <password>

# 请求用户交互输入密码,并不展示;此时会忽略-a参数
redis-cli --user selfdefine --askpass
打开防火墙,允许外界访问6379
ufw allow redis
ufw status verbose
开启安全组

登录阿里云,在安全组添加入站规则,开放redis 6379端口

四、安装并部署mysql

mysql的安装包默认是不在apt包服务器上的,所以要手动添加
apt update && apt install wget -y
# (下载之前先切到自定义的目录)可以查询官方说明,选用执行时的最新版本
wget https://repo.mysql.com/mysql-apt-config_0.8.22-1_all.deb
# 安装配置
dpkg -i mysql-apt-config_0.8.22-1_all.deb

执行上述命令之后,会弹框提示确认配置,回车确定
然后选择安装的mysql版本,选择第一个进入再选择第一个

安装mysql-server
apt update -y
apt install mysql-server

安装过程中会让输入root用户的密码,和选择权限插件,建议选择第一个

查看mysql安装信息
apt policy mysql-server
查看mysql服务状态,安装之后默认是启动的
systemctl status mysql

mysql默认启动的端口是3306,当然处于安全考虑,也可以改掉,在mysql的配置文件中/etc/mysql/mysql.conf

管理mysql
# 命令行登录,回车键入设置的密码
mysql -u root -p

# 查看版本信息
select version();

# 展示全部数据库
show databases;

# 添加数据库
create database test_db;

# 移除数据库
drop database test_db;

# 进入数据库
use test_db;

# 展示全部的表
show tables;

### 添加用户并授权(!!! 重点内容)
# mysql 8之后,操作流程为先添加用户设置密码,再进行数据库的授权,跟8之前的流程(添加用户设置密码和授权可以放在同一条命令中)不一样,要特别注意,如果用的旧的命令,会提示syntax error
create user 'test_user'@'localhost' identified by 'password';
# 如果要将用户暴露给所有的外界ip
create user 'test_user'@'%' identified by 'password';
# 授权 test_db库的所有表给来源ip为%的test_user
grant all privileges on test_db.* to 'test_user'@'%';
# 刷新权限
flush privileges;

# 退出mysql
quit/exit
开启防火墙
ufw app list
ufw allow mysql
ufw status verbose

注意!mysql的默认用户root,默认是授权给localhost的也就是只能本地访问,所以即便开启了防火墙和安全组,远程连接,通过navicat也会报错,不允许访问
解决方案:

  1. 更改root用户的访问ip(不建议)
  2. 添加一个用户,专门用来远程登录(相对安全,推荐)
配置安全组

登录阿里云,配置安全组入站规则,开放3306端口

五、安装git

比较简单,apt直接安装即可

apt install git
生成ssh密钥
ssh-keygen -t rsa -C "[email protected]"

一路回车即可,生成的公钥和私钥在目录/root/.ssh/id_rsa下,将公钥配置到仓库平台(github、gitlab、gitee等),便可以进行代码克隆、拉取、推送

六、拉取代码,部署应用

拉取代码
git clone <git repo url>
安装应用的依赖
cd <yourapp path>
pip install -r requirement.txt

如果过程中有报错,先在requirement文件中注释掉,最后单独安装,解决问题

七、应用配置和启动

安装gunicorn
pip install gunicorn
配置gunicorn

在应用根目录下,添加gconfig.py文件,编辑gconfig.py
添加下列内容

# 打猴子补丁
from gevent import monkey
monkey.patch_all()

import multiprocessing

debug=True         # 设置当前运行模式
loglevel='debug'    # 设置日志级别
bind='127.0.0.1:8080' # 绑定ip和端口,启动服务后可以通过该ip和端口进行访问,也可以通过ng代理转发
pidfile='log/gunicorn.pid'  # pid文件存储路径,log目录在项目根目录下,其实是同gconfig文件同级目录
logfile='log/debug.log'     # 日志文件路径
errorlog='log/gunicorn.log'  # 错误日志文件路径
workers=multiprocessing.cpu_count() * 2 + 1  # 工作进程的数量
worker_class='gevent'  # 进程的工作方式,值:sync\eventlet\gevent\tornado\gthread;缺省为sync
worker_connections=1000  # 客户端最大同时连接数,只适用于eventlet、gevent方式
daemon=True   # 设置守护进程,是否后台运行
proc_name='night'  # 启动之后,进程显示的名字
backlog=1024. # 服务器在pending状态下的最大连接数,client处于waiting的最大数目,建议区间64-2048

# thread=4 工作进程中线程的数量,只适用于gthread方式,gevent使用协程的工作方式
# max_request
# max_request_jitter
# timeout
# graceful_timeout
# keepalive

#####security#####
# limit_request_line
# limit_request_field
# limit_request_field_size


#######debugger#########
# reload
# reload_extra_files
# spew
# check_config

#########server########
# sendfile
# chdir
# daemon
# raw_env
# worker_tmp_dir
user='yourserverusername' # 指定worker进程的运行用户名
# group
# umask
# pythonpath

######log########
# accesslog
# access_log_format  # 日志格式 %(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"
# 参数含义如下
h    remote address
l    '-'
u   currently '-',may be user name in future releases
t   date of the request
r   status line (e.g GET / HTTP/1.1)
s   status
b   response length or '-'
f   referer
a   user agent
T   request time in seconds
D   request time in microseconds
L   request time in decimal seconds
p   process ID

# capture_output # 重定向stdout/stderr到error log file
# logger_class  # 日志实现类,缺省gunicorn.glogging.Logger
# logconfig. # 日志配置文件,同python标准日志模块logging的配置


#######server_hook######
# on_starting
# on_reload
# when_ready
# pre_fork
# post_fork
# post_worker_init
# worker_init
# worker_abort
# pre_exec
# pre_request
# post_request
# child_exit
# worker-exit
# nworkers_changed
# on_exit

gunicorn参数详解

见上一步,看大家的需要,后面可以专门出一篇分享,gunicorn的用法

使用gunicorn启动django
gunicorn -c gconfig.py app.wsgi:application

注意!配置文件中的daemon需要设置为True,这样上面这个命令执行之后,django服务会在后台运行,同时app需要换成教你自己的django服务的名字,就是根目录的目录名

在启动之前,可以先启动django的测试服务器,验证一下,django的服务是否正常

python3 manage.py runserver 0.0.0.0:8088

如果测试服务器启动正常,但是用gunicorn启动之后,访问不了,可以看一下gunicorn日志,如果每隔30s会自动重启一下,就说明gunicorn的启动有问题,需要检查具体错误出现在哪里

配置nginx代理和静态文件

配置代理将外部请求转发到django应用

cd /etc/nginx/sites-enabled
vi default
# location / {} 里面内容修改一下
# location 后的路径代表要转发的外部请求路径
location / {
    
    
    proxy_pass http://127.0.0.1:8080;
    proxy_pass_header Authorization;
    proxy_pass_header WWW-Authenticate;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

# 重载一下nginx配置
nginx -s reload

检查防火墙和安全组是否打开,打开之后,在浏览器输入服务器的http://your_server_ip,查看是否可以访问

配置ng静态代理
cd /etc/nginx/sites-enabled/
vi default

# 在server中添加
# 两种方式,alias是别名,root是请求的根目录
location /static/ {
    
    
    alias /usr/local/static/;
} # 比如请求路径/123/static/logo.png;响应路径/usr/local/static/logo.png;
location /static/js/ {
    
    
    root /usr/local/static/;
} # 比如请求路径/123/static/js/index.js,响应路径 /usr/local/static/123/static/js/index.js;
配置ssl证书

阿里云上申请免费ssl证书,下载下来,上传到服务器的指定目录
申请下来的证书有两个文件,一个后缀为pem,一个后缀为key
如果购买域名和服务器的阿里云账户为同一个,可以直接在ssl证书那里选择配置到实例,方便很多
证书申请成功之后还需要设置域名解析记录,证书项那里会有提示步骤,按照操作即可
如果是两个账户或者是其他云厂商的机器,那么就下载下来手动上传
上传好之后配置一下ng,假设证书路径/home/user/xxxx.cert.pem,/home/user/xxxx.cert.key

# 首先修改监听端口
listen 443 default_server ssl;
listen [::]:443 default_server ssl;
server_name your_server_name;
# 配置证书
ssl_certificate /home/user/xxxx.cert.pem;
ssl_certificate_key /home/user/xxxx.cert.key;
# 配置ssl超时
ssl_session_timeout 5m;
# 配置请求的编码
charset utf-8;
如果有上传下载的需求,需要配置一下body size
cd /etc/nginx/sites-enabled
vi default
# server {}里面添加
sendfile on;
client_max_body_size 100M;
client_body_buffer_size 100M;

附上完整的nginx配置

nginx.conf

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
	worker_connections 768;
	# multi_accept on;
}

http {

	##
	# Basic Settings
	##

	sendfile on;
	tcp_nopush on;
	types_hash_max_size 2048;
	# server_tokens off;

	# server_names_hash_bucket_size 64;
	# server_name_in_redirect off;

	include /etc/nginx/mime.types;
	default_type application/octet-stream;

	##
	# SSL Settings
	##

	ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
	ssl_prefer_server_ciphers on;

	##
	# Logging Settings
	##

	access_log /var/log/nginx/access.log;
	error_log /var/log/nginx/error.log;

	##
	# Gzip Settings
	##

	gzip on;

	# gzip_vary on;
	# gzip_proxied any;
	# gzip_comp_level 6;
	# gzip_buffers 16 8k;
	# gzip_http_version 1.1;
	# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

	##
	# Virtual Host Configs
	##

	include /etc/nginx/conf.d/*.conf;
	include /etc/nginx/sites-enabled/*;
}


#mail {
#	# See sample authentication script at:
#	# http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
#	# auth_http localhost/auth.php;
#	# pop3_capabilities "TOP" "USER";
#	# imap_capabilities "IMAP4rev1" "UIDPLUS";
#
#	server {
#		listen     localhost:110;
#		protocol   pop3;
#		proxy      on;
#	}
#
#	server {
#		listen     localhost:143;
#		protocol   imap;
#		proxy      on;
#	}
#}

/sites-enabled/default

##
# You should look at the following URL's in order to grasp a solid understanding
# of Nginx configuration files in order to fully unleash the power of Nginx.
# https://www.nginx.com/resources/wiki/start/
# https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/
# https://wiki.debian.org/Nginx/DirectoryStructure
#
# In most cases, administrators will remove this file from sites-enabled/ and
# leave it as reference inside of sites-available where it will continue to be
# updated by the nginx packaging team.
#
# This file will automatically load configuration files provided by other
# applications, such as Drupal or Wordpress. These applications will be made
# available underneath a path with that package name, such as /drupal8.
#
# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.
##

# Default server configuration
#
server {
	listen 443 default_server ssl;
	listen [::]:443 default_server ssl;
	server_name test_pro.com;

	# SSL configuration
	ssl_certificate /home/civil/cert/test.cert.pem;
	ssl_certificate_key /home/civil/cert/test.cert.key;
	ssl_session_timeout 5m;
	charset utf-8;
	# listen 443 ssl default_server;
	# listen [::]:443 ssl default_server;
	#
	# Note: You should disable gzip for SSL traffic.
	# See: https://bugs.debian.org/773332
	#
	# Read up on ssl_ciphers to ensure a secure configuration.
	# See: https://bugs.debian.org/765782
	#
	sendfile on;
	client_max_body_size 100M;
	client_body_buffer_size 100M;
	# Self signed certs generated by the ssl-cert package
	# Don't use them in a production server!
	#
	# include snippets/snakeoil.conf;

	root /var/www/html;

	# Add index.php to the list if you are using PHP
	index index.html index.htm index.nginx-debian.html;

	#server_name _;

	location / {
		# First attempt to serve request as file, then
		# as directory, then fall back to displaying a 404.
		#try_files $uri $uri/ =404;
		proxy_pass http://127.0.0.1:8080;
		proxy_pass_header Authorization;
		proxy_pass_header WWW-Authenticate;
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	}

	location /static/policy/ {
		alias /home/civil/night/static/policy/;
	}
	location /static/drf-yasg/ {
		root /usr/local/lib/python3.9/dist-packages/drf_yasg/;
	}

	# pass PHP scripts to FastCGI server
	#
	#location ~ \.php$ {
	#	include snippets/fastcgi-php.conf;
	#
	#	# With php-fpm (or other unix sockets):
	#	fastcgi_pass unix:/run/php/php7.4-fpm.sock;
	#	# With php-cgi (or other tcp sockets):
	#	fastcgi_pass 127.0.0.1:9000;
	#}

	# deny access to .htaccess files, if Apache's document root
	# concurs with nginx's one
	#
	#location ~ /\.ht {
	#	deny all;
	#}
}


# Virtual Host configuration for example.com
#
# You can move that to a different file under sites-available/ and symlink that
# to sites-enabled/ to enable it.
#
#server {
#	listen 80;
#	listen [::]:80;
#
#	server_name example.com;
#
#	root /var/www/example.com;
#	index index.html;
#
#	location / {
#		try_files $uri $uri/ =404;
#	}
#}

网址验证

OK!走到这一步,可以在浏览器中键入url验证了(https://your_server_ip)

django部署完成!恭喜!

猜你喜欢

转载自blog.csdn.net/weixin_43500200/article/details/126258132