nginx+uwsgi+MySQL 部署 Django http/https应用

nginx+uwsgi+MySQL 部署 Django http/https应用

服务器:阿里云轻量应用服务器,Ubantu系统。

开启服务器的防火墙

找到服务器点击详情进入。

找到安全列表下的防火墙,开启要用到的端口。主要开启80,443,22,3306等端口。80端口用于http服务;443端口用于https服务;22端口用于FileZilla连接,上传本地项目Django代码;3306用于数据库的连接;8000、8080、8005是自己定义的端口,分别用于Django项目测试和uwsgi和nginx通信。

创建个人用户 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)

配置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配置。

安装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

可能出现的问题

Permission denied,如下图所示,是文件夹的操作权限不够。增加权限

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传输到虚拟机上。

我是在 /home/bby 下建了一个key_dir 文件夹,里面放了这两个文件,就是下载的证书。

再次修改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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值