使用阿里云服务器,操作系统为:Ubuntu 20.04 64位
配置mysql
更新系统
sudo apt-get update
sudo apt-get upgrade
安装mysql
apt-get install mysql-server (这一步在安装的过程中会弹出类似对话框一样的界面,可以在界面上直接设置对root用户的密码)
apt-get install mysql-client
apt-get install libmysqlclient-dev
python安装
1、下载安装包
wget https://www.python.org/ftp/python/3.7.1/Python-3.7.1.tgz
2、解压安装包
tar -zxvf Python-3.7.1.tgz
3、切换到解压后的目录下
cd Python-3.7.1
4、./configure
./configure
# 或者
./configure --prefix=/usr/local/python3.7.1
5、编译make(没有安装make的安装一下)
make
6、测试make test
make test
7、安装sudo make install
sudo make install
8、若步骤5执行./configure --prefix=/usr/local/python3.7.1,则需要添加环境变量。步骤5是./configure的跳过此步骤
PATH=$PATH:$HOME/bin:/usr/local/python3.7.1/bin
查看环境变量
echo $PATH
更新python默认指向为python3.7
1、查看python命令指向
ls -l /usr/bin | grep python
ps:更新这部分还是直接参考原链接好了
学习链接: https://blog.csdn.net/u014775723/article/details/85213793
创建Python虚拟环境
1、安装virtualenv
pip install virtualenv
2、创建虚拟环境djangoenv
virtualenv --no-site-packages djangoenv
virtualenv就可以创建一个独立的python运行环境,参数 --no-site-packages让已经安装到系统python环境中的所有第三方包都不会复制过来,这样就得到了一个不带任何第三方包的pyhton运行环境。
3、启动虚拟环境
django的bin文件下:source activate
4、退出环境
deactivate
5、删除环境
revirtuallenv djangoenv
代码部署
1、安装
sudo apt-get install git
- 客户端发来 http 请求,Nginx 作为直接对外的服务器接口,对 http 请求进行分析
- 如果是静态资源请求,则由Nginx自己处理(效率极高)
- 如果是动态资源请求,则把它转发给 Gunicorn
- Gunicorn 对请求进行预处理后,转发给 Django,最终完成资源的返回
2、更改django的settings.py配置
DEBUG = False
ALLOWED_HOSTS = ['*']
STATIC_ROOT = os.path.join(BASE_DIR, 'collected_static')
3、,给项目代码创建目录并进入此目录
mkdir -p /var/web
cd var/web
4、本地项目获取运行环境并push到GitHub上
pip freeze > requirements.txt
5、从GitHub拉取项目
git clone 项目地址
6、激活虚拟环境
7、进入拉取的项目中
cd MyBlog
8、安装库、收集静态资源、数据迁移
pip3 install -r requirements.txt
python3 manage.py collectstatic
python3 manage.py migrate
Nginx
1、安装
sudo apt-get install nginx
2、测试
sudo service nginx start
复制公网IP到浏览器,看到欢迎页面则安装成功
3、重新写 Nginx 的配置文件
cd /etc/nginx/sites-available
sudo vi dusaiphoto.com
进入 /etc/nginx/sites-available 目录,这里是定义 Nginx 可用配置的地方。输入指令 sudo vi dusaiphoto.com 创建配置文件并打开 vi 编辑器。
在 dusaiphoto.com 文件中写入:
server {
charset utf-8;
listen 80;
server_name 118.31.35.48; # 改成你的 IP
location /static {
alias /var/web/MyBlog/collected_static;
}
location /media {
alias /var/web/MyBlog/media;
}
location / {
proxy_set_header Host $host;
proxy_pass http://unix:/tmp/118.31.35.48.socket; # 改成你的 IP
}
}
此配置会监听 80 端口(通常 http 请求的端口),监听的 IP 地址写你自己的服务器公网 IP。
配置中有3个规则:
- 如果请求 static 路径则由 Nginx 转发到目录中寻找静态资源
- 如果请求 media 路径则由 Nginx 转发到目录中寻找媒体资源
- 其他请求则交给 Django 处理
4、把这个配置文件链接到在用配置上去
sudo ln -s /etc/nginx/sites-available/dusaiphoto.com /etc/nginx/sites-enabled
如果无论怎么配置都只能看到 Nginx 欢迎页面,有可能是 sites-enabled 目录中的 default 文件覆盖了你写的配置。将 default 文件删掉就可以正常代理自己的配置文件了。
Gunicorn及测试
先回到项目所在的目录,并且进入虚拟环境,然后输入:
pip3 install gunicorn
sudo service nginx reload
gunicorn --bind unix:/tmp/118.31.35.48.socket MyBlog.wsgi:application
这里的三个步骤分别是:
- 安装 Gunicorn
- 重启 Nginx 服务
- 启动 Gunicorn
到了这步就可以看到运行的web项目了!!!
进程托管
这里我使用的是supervisor
1、安装
pip install supervisor
2、生成配置文件
echo_supervisord_conf > /etc/supervisord.conf
mkdir /etc/supervisor.d
编辑/etc/supervisord.conf文件,将文件最后两行取消注释
[include]
files = supervisor.d/*.ini
(这里我直接添加了,我最后两行不是这个路径,看清楚了!!!因为没看清楚导致一个小问题后面浪费很多时间)
3、编写应用进程的配置/etc/supervisor.d/MyBlog.ini
[program:MyBlog]
command=/path/to/my/venv/bin/gunicorn --bind unix:/tmp/118.31.35.48.socket MyBlog.wsgi:application ; 启动进程的命令
;process_name=%(program_name)s ; process_name expr (default %(program_name)s)
;numprocs=1 ; number of processes copies to start (def 1)
directory=/path/to/my_blog ; 运行命令时先切换到此目录下
;umask=022 ; umask for process (default None)
;priority=999 ; the relative start priority (default 999)
;autostart=true ; start at supervisord start (default: true)
;startsecs=1 ; # of secs prog must stay up to be running (def. 1)
;startretries=3 ; max # of serial start failures when starting (default 3)
;autorestart=unexpected ; when to restart if exited after running (def: unexpected)
;exitcodes=0,2 ; 'expected' exit codes used with autorestart (default 0,2)
;stopsignal=QUIT ; signal used to kill process (default TERM)
;stopwaitsecs=10 ; max num secs to wait b4 SIGKILL (default 10)
;stopasgroup=false ; send stop signal to the UNIX process group (default false)
;killasgroup=false ; SIGKILL the UNIX process group (def false)
;user=myuser ; 启动进程的用户,推荐不要用root用户,否则注释此行
redirect_stderr=true ; 重定向错误到输出 (默认false)
stdout_logfile=/a/path ; 标准输出的日志地址,会将所有print到终端的输出输出到指定的文件中
;stdout_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB)
;stdout_logfile_backups=10 ; # of stdout logfile backups (0 means none, default 10)
;stdout_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0)
;stdout_events_enabled=false ; emit events on stdout writes (default false)
;stderr_logfile=/a/path ; stderr log path, NONE for none; default AUTO
;stderr_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB)
;stderr_logfile_backups=10 ; # of stderr logfile backups (0 means none, default 10)
;stderr_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0)
;stderr_events_enabled=false ; emit events on stderr writes (default false)
;environment=A="1",B="2" ; process environment additions (def no adds)
;serverurl=AUTO ; override serverurl computation (childutils)
可能是由于我网站还未完善,所以标准输出的日志地址我注释掉了,不注释掉无法托管(supervisord启动项目的时候报错),具体原因我还没有找出来
4、启动supervisord:
supervisord -c /etc/supervisord.conf
5、进程的查看、终止与启动
supervisorctl status # 查看进程状态
supervisorctl stop my_blog # 终止my_blog进程
supervisorctl start my_blog # 启动my_blog进程
supervisorctl restart my_blog # 重新启动my_blog进程
完成了进程托管!!!
目前有一个问题还未解决,就是media资源文件无法被识别到,导致网站上应用到的静态图片都没有办法获取到资源,目前这个问题还未解决!!!
学习链接: https://frostming.com/2020/05-24/process-management/ https://www.dusaiphoto.com/article/71/
|