nginx+uwsgi+MySQL 部署 Django http/https应用
服务器:阿里云轻量应用服务器,Ubantu系统。
开启服务器的防火墙
找到服务器点击详情进入。
![](https://img-blog.csdnimg.cn/img_convert/50eb5e95b05f8e52396682b5bed4bc2e.png)
找到安全列表下的防火墙,开启要用到的端口。主要开启80,443,22,3306等端口。80端口用于http服务;443端口用于https服务;22端口用于FileZilla连接,上传本地项目Django代码;3306用于数据库的连接;8000、8080、8005是自己定义的端口,分别用于Django项目测试和uwsgi和nginx通信。
![](https://img-blog.csdnimg.cn/img_convert/0f82a8516bec79af986e7a1a86f821ba.png)
创建个人用户 bby
创建用户,adduser bby,输入密码2次。
赋予sudo权限:sudo vim /etc/sudoers,追加一行bby ALL=NOPASSWD: ALL。按esc,用:wq!来写入保存。
切换用户到bby: su – bby
搭建基础环境(python3、MySQL)
阿里云服务已存在python3环境,因此配置MySQL。
安装mysql,并创建对应数据库
#安装 mysql-server
apt-get install mysql-server
create database 数据库名 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
drop database 数据库名;
修改数据库密码
# 登录数据库,开始没有密码,直接按回车进入mysql
mysql -u root -p
#使用sql命令跳转到mysql表中,并更改密码
use mysql;
update user set password=password("密码")where user="root";
#输入flush privileges指令并退出
flush privileges;
#重启mysql服务器
service mysql restart
此时本地可以使用服务器的公网IP+3306连接mysql
创建虚拟环境
在创建一个Django项目前,先创建一个虚拟环境,把django安装在虚拟环境里。
#安装了virtualenv、virtualenvwrapper,并将配置信息输入到.bashrc文件里。
sudo pip3 install virtualenv virtualenvwrapper
#配置virtualwrapper环境变量
# vim打开./bashrc
sudo vim ~/.bashrc
#shift+g 到达文本最后,加入以下
VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
#指定虚拟环境存放目录
export WORKON_HOME=/home/bby/Env
#virtualenvwrapper.sh所在目录
source /usr/local/bin/virtualenvwrapper.sh
source ~/.bashrc
解决ubantu下pip安装错误
sudo pip3 install virtualenvwrapper 报以下错误
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
sudo pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple pbr
sudo pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple --no-deps stevedore
sudo pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple --no-deps virtualenvwrapper
mkirtualenv 基本命令使用
#创建一个myproject(项目名)的虚拟环境
mkvirtualenv myproject
删除
rmvirtualenv myproject
#退出虚拟环境
deactivate
#通过workon就可以查看又几个虚拟环境,之后就可以通过workon 虚拟环境名 就可以进入
#切换到myproject2的虚拟环境
workon myproject2
在虚拟环境里安装Djangp以及用到的一些python包
#安装django4
#查看本地django版本
import django
django.get_version()
pip3 install django==4.1
pip3 install pymysql
pip3 install pandas
pip3 install ipy
pip3 install python-docx
pip3 install mysqlclient
pip3 install cryptography
pip3 install openpyxl
启动Django项目
使用mkvirtualenv myproject 命令创建 myproject 的虚拟环境,再将Django安装在这个虚拟环境里。
cd进入/home/bby目录,使用sudo mkdir myproject 命令创建一个叫myproject的文件夹(建议与虚拟环境名和本地Django项目名保持一致)。通过FileZilla将本地项目代码上传到/home/bby/myproject。
Django项目目录说明
|myproject
├── app01
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── manage.py
├── media
#进入虚拟环境
workon myproject
# 修改settings.py文件,具体如下。
DEBUG = False (在配置时可以先改为True,等配置完后再改回False)
ALLOWED_HOSTS = ['域名','IP'] 或者 ALLOWED_HOSTS = ['*']
#如果在服务器上的数据库密码和数据库名和本地是一样的话,可以不用设置。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': '数据库名',
'USER':'用户名',
'PASSWORD':'密码',
'HOST':'127.0.0.1',
'PORT':3306,
}
}
在文本最后加上,这一部分主要使用Nginx会使用到,可以先不配置。
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
#启动Django项目
python3 manage.py makemigrations
python3 manage.py migrate
python3 /home/bby/myproject/manage.py runserver 0.0.0.0:8080
本地浏览器上输入公网IP:8080,就能看到你的Django项目上线了。在配置nginx和uwsgi之前一定要先确认,此时你的django项目可以上线了,再进行下一步。
uwsgi和nginx介绍
nginx处理静态内容,然后将动态内容转发给uWSGI服务器处理。nginx和uwsgi之间使用socket通信。
uwsgi和nginx通信方式:1. 通过socket文件通信;2.通过socket端口通信;3.通过http请求通信。uwsgi和nginx都部署在同一台服务器上,推荐使用Unix套接字。这个套接字不会使用HTTP,而是实现uWSGI的uwsgi协议,更安全,能提供更好的性能。
安装uwsgi
sudo pip3 install uwsgi
#查看版本
uwsgi --version
#编写Python脚本进行测试,test.py
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return ["Hello World"]
# 安装好uwsgi好后可以测试一下:
uwsgi --http :8000 --wsgi-file test.py
# 测试本地项目
uwsgi --chdir /home/bby/myproject --home /home/bby/Env/myproject --http :8000 --module myproject.wsgi:application
--chdir 是项目路径
--home 是项目虚拟路径
![image-20230107135748690](/Users/bby/Library/Application Support/typora-user-images/image-20230107135748690.png)
![](https://img-blog.csdnimg.cn/img_convert/05dfe6c97c06119ef8c1e42ad03d05d2.png)
配置uwsgi,并将其加入系统服务。这样每次启动uwsgi服务时,自动调用配置文件的设置。在终端连续输入以下命令,创建myproject.ini文件,存放uwsgi配置信息。
sudo mkdir -p /etc/uwsgi/sites
cd /etc/uwsgi/sites
sudo vi /etc/uwsgi/sites/myprocject.ini
[uwsgi]
project = myprocject # 项目名
base = /home/bby # 根目录
chdir = %(base)/%(project) #项目目录
home = %(base)/Env/%(project) #虚拟环境目录
module = %(project).wsgi:application #对应wsgi文件
master = true #主进程
processes = 5 #同时进程数
socket = /etc/uwsgi/myprocject.sock # uwsgi和nginx之间的通信是使用socket,要保持设置一致。路径和名称可以自己定义。/路径/name.sock
chown-socket = bby:www-data
chmod-socket = 666
uid = 1000
gid = 2000
pidfile = /etc/uwsgi/sites/master.pid #运行uWSGI后,系统会在你填写的路径按照你设置的文件名创建一个.pid文件。 用于重启关闭uwsgi
daemonize = /etc/uwsgi/sites/mylog.log #运行uWSGI后,系统会在你填写的路径按照你设置的文件名创建一个.log日志文件。 存放uwsgi日志
vacuum = true #每次重启是否清理
在终端启动uWSGI
uwsgi --ini /etc/uwsgi/sites/myproject.ini #启动
uwsgi --stop /etc/uwsgi/sites/master.pid #关闭
uwsgi --reload /etc/uwsgi/sites/master.pid #重启
#安装完毕后,可以使用以下命令关闭 uwsgi 进程
killall -9 uwsgi
# 查看uwsgi,如果看到多个进程启动,则表示uWSGI启动成功。如果只有一个进程,uwsgi配置有问题,重新设置。
ps -aux | grep uwsgi
#在/etc/uwsgi文件夹下也会生成一个myprocject.sock文件。
例如下图,uwsgi启动失败,查看uwsgi配置。
![](https://img-blog.csdnimg.cn/img_convert/8169784c80b170e192a1466d0da6f388.png)
安装nginx
sudo apt-get install nginx
#创建配置文件
sudo vi /etc/nginx/sites-available/myproject.conf
内容:
server {
listen 80;
server_name 域名;
charset utf-8;
access_log /var/log/nginx/django_access.log;
error_log /var/log/nginx/django_error.log;
location /static/ {
root /home/bby/myproject;
} #设置静态文件根目录,路径一定要设置对,不然网站的css样式加载不出来。
location /media/ {
root /home/bby/myproject/media;
} #设置媒体文件根目录
location / {
include uwsgi_params; #此处输入之前uwsgi配置的socket端口
uwsgi_pass unix:/etc/uwsgi/myproject.sock; #与nginx的socket配置保持一致,否则会出现502错误。
} #如果非静态或媒体文件,交由uwsgi处理
}
建好之后要链接文件:
sudo ln -s /etc/nginx/sites-available/myproject.conf /etc/nginx/sites-enabled/myproject.conf
可以检查一下是否有错:
nginx -t
#出现错误那就是配置文件写错了,不行就直接重启
# nginx命令
service nginx start #启动
service nginx stop #停止
service nginx restart #重启
最后再次修改提前提到settings.py文件
#settings.py文件添加以下内容
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
# 静态文件的存放有两种位置,一种是放在app里的static文件夹,另一种给nginx访问的myproject下的static下的文件。运行python3 manage.py collectstatic 后,会将app下的static同步到myproject下的static文件下。
启动项目
#进入虚拟环境
workon myproject
python3 manage.py collectstatic #搜集静态文件
#重启nginx和uwsgi
uwsgi --reload /etc/uwsgi/sites/master.pid
service nginx restart
![](https://img-blog.csdnimg.cn/img_convert/e160b02d06d8ba120c6790fa599ddf21.png)
可能出现的问题
Permission denied,如下图所示,是文件夹的操作权限不够。增加权限
![](https://img-blog.csdnimg.cn/img_convert/b7dbfb10a75e1fbae96fa2bd9231b643.png)
sudo chmod -R 777 /home/bby/UPF_Web/app01/static/data
sudo chmod -R 777 /home/bby/UPF_Web/media
django.db.utils.OperationalError: (1698, "Access denied for user 'root'@'localhost'")错误,执行命令如下。
#进入数据库
mysql -u root -p
use mysql;
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '密码';
FLUSH PRIVILEGES;
建立一个自启动脚本
cd etc/init/
sudo vi /etc/init/uwsgi.conf
内容如下:
description "uWSGI application server in Emperor mode"
start on runlevel [2345]
stop on runlevel [!2345]
setuid UPF_Web
setgid www-data
exec /usr/local/bin/uwsgi --emperor /etc/uwsgi/sites
HTTPS配置
选择下载阿里云Nginx的SSL证书,再通过FileZilla传输到虚拟机上。
![](https://img-blog.csdnimg.cn/img_convert/7763bed5379740076cb15328599497d3.png)
我是在 /home/bby 下建了一个key_dir 文件夹,里面放了这两个文件,就是下载的证书。
![](https://img-blog.csdnimg.cn/img_convert/aa5ec6eae315256c895aff54126176bf.png)
再次修改nginx的conf文件
#把端口80改为443,然后添加以下内容
server {
listen 443;
server_name 申请证书时绑定的域名(如果是通配符的泛域名, 那就写这台服务器对应的子域名);
charset utf-8;
ssl on;
ssl_certificate /home/bby/key_dir/申请的证书.pem;
ssl_certificate_key /home/bby/key_dir/申请的证书.key;
}
# 重启nginx服务
service nginx restart