nginx+uwsgi+python3+pipenv+mysql+redis部署django程序
1、下载项目
git clone https://github.com/wangyitao/MyBlogs.git
2、进入Myblogs目录
cd MyBlogs
3、创建虚拟环境并且安装依赖
pipenv install
4、搭建mysql环境,以及创建数据库和用户
wget https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm # 下载rpm源
rpm -ivh mysql80-community-release-el7-1.noarch.rpm # 添加rpm源到系统
yum update # 更新源,替换掉原来的源
yum install mysql-server # 安装mysql
service mysqld start # 启动mysql
service mysqld status # 查看mysql是否启动
grep 'temporary password' /var/log/mysqld.log # 查找mysql给我们设置的初始密码
mysql -uroot -p # 登录mysql,密码输入上面查到的初始密码
ALTER USER 'root'@'localhost' IDENTIFIED BY '密码';(注意要切换到mysql数据库,使用use mysql)修改root密码
flush privileges; # 直接生效修改之后的密码,不用重启mysql
CREATE DATABASE myblogs DEFAULT CHARSET=utf8 DEFAULT COLLATE utf8_unicode_ci; # 创建一张给网站用的表,表名自定,我的叫myblogs
CREATE USER '用户名'@'localhost' IDENTIFIED BY '密码!'; # 创建新用户来管理这个网站
GRANT ALL PRIVILEGES ON myblogs.* TO '用户名'@'localhost'; # 给用户创建操作表的权限
FLUSH PRIVILEGES; # 刷新
5、修改代码,符合自己的需求
修改settings/production.py文件
from .base import * # SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = os.environ['SECRET_KEY'] # 从环境变量中读取,增加安全性 # SECURITY WARNING: don't run with debug turned on in production!2.
DEBUG = False ALLOWED_HOSTS = ['*'] # Database
# https://docs.djangoproject.com/en/2.1/ref/settings/#databases
DATABASE_PASSSWORD = os.environ['DATABASE_PASSSWORD']
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'myblogs', # 要连接的数据库,连接前需要创建好
'USER': 'root', # 连接数据库的用户名
'PASSWORD': DATABASE_PASSSWORD, # 连接数据库的密码
'HOST': '127.0.0.1', # 连接主机,默认本级
'PORT': 3306 # 端口 默认3306
}
} ADMINS = [ # 配置管理员,出错发送给管理员
('felix', 'felix@example.com'),
]
# 邮件相关配置,用来发邮件
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.qq.com'
EMAIL_PORT = 465
EMAIL_HOST_USER = '1403179190@qq.com' # 这里部署的时候改成自己的qq邮箱
EMAIL_HOST_PASSWORD = os.environ['EMAIL_HOST_PASSWORD'] # 授权码
EMAIL_SUBJECT_PREFIX = u'[FCBlog]'
EMAIL_USE_SSL = True # 与SMTP服务器通信时,是否启动TLS链接(安全链接)
EMAIL_TIMEOUT = 60
FROM_EMAIL = 'FCBlog<1403179190@qq.com>' # 日志配置
LOGGING_FILE_PATH = os.environ['LOGGING_FILE_PATH'] # 配置日志文件位置
# 日志文件
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'file': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': LOGGING_FILE_PATH,
},
'mail_admins': { # 出错发送邮件给管理员
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler',
},
},
'loggers': {
'django': {
'handlers': ['file'],
'level': 'DEBUG',
'propagate': True,
},
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': False,
},
},
} # 配置django的session引擎改成redis
SESSION_ENGINE = 'redis_sessions.session'
# redis服务器地址
SESSION_REDIS_HOST = 'localhost'
# redis端口
SESSION_REDIS_PORT = 6379
# 选择那个redis库
SESSION_REDIS_DB = 2
# 密码
SESSION_REDIS_PASSWORD = ''
# 前缀的键名
SESSION_REDIS_PREFIX = 'myblogs_django_session'
production.py
修改production.py中的邮箱配置,数据库配置等。
6、将production.py中需要从环境变量读取的数据写入环境变量,在/etc/profile下添加如下信息。
# django关键信息变量
export SECRET_KEY="" # 写入自己的django的secret_key
export DATABASE_PASSSWORD="" # 写入自己的数据库密码
export EMAIL_HOST_PASSWORD="" # 写入自己的qq邮箱的key
export LOGGING_FILE_PATH="" # 写入自己的日志存放目录绝对路径 比如我的/home/myblogs_log/mylog.log
a、django的SECRET_KEY重新生成方式如下:
(MyBlogs) [root@localhost MyBlogs]# django-admin shell
Python 3.7.2 (default, Jan 3 2019, 16:25:55)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.core.management import utils
>>> utils.get_random_secret_key()
'yqk27s&bi(11te&8dgl=-r1&638re&)3bj=ozzb1h+72p-ra53'
>>>
b、EMAIL_HOST_PASSWORD 可以从qq邮箱官网获取
7、配置好之后生成表结构
python manage.py makemigrations
python manage.py migrate
8、生成缓存表,并且收集静态资源
python3 manage.py createcachetable # 生成缓存表
python3 manage.py collectstatic # 收集静态资源
9、给mysql配置时区信息,默认为空
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p "密码" mysql
10、第一阶段测试
[root@localhost MyBlogs]# pipenv run python3 FCBlogs/manage.py runserver 0.0.0.0:80
Performing system checks... System check identified no issues (0 silenced).
January 04, 2019 - 22:30:52
Django version 2.1.4, using settings 'myblog.settings.development'
Starting development server at http://0.0.0.0:80/
Quit the server with CONTROL-C.
然后使用ip访问如果成功就表示第一阶段配置完成。
11、安装uwsgi
pip3 install uwsgi
12、配置uwsgi启动文件
新建一个uwsgi.ini文件,内容如下
[uwsgi]
chdir=/root/myblogs/MyBlogs/FCBlogs
home=/root/.local/share/virtualenvs/MyBlogs-7hihB8Gz/
module=myblog.wsgi
master=true
processes=4
socket=0.0.0.0:8001
vacuum=true
max-requests=5000
enable-threads=true
harakiri=20
uid=1000
pid=2000
daemonize=/root/myblogs/MyBlogs/myblogs_uwsgi/myblogs.log
pidfile=/root/myblogs/MyBlogs/myblogs_uwsgi/master.pid
uwsgi参数详解
master = true
#启动主进程,来管理其他进程,其它的uwsgi进程都是这个master进程的子进程,如果kill这个master进程,相当于重启所有的uwsgi进程。 chdir = /web/www/mysite
#在app加载前切换到当前目录, 指定运行目录 module = mysite.wsgi
# 加载一个WSGI模块,这里加载mysite/wsgi.py这个模块 py-autoreload=1
#监控python模块mtime来触发重载 (只在开发时使用) lazy-apps=true
#在每个worker而不是master中加载应用 socket = /test/myapp.sock
#指定socket文件,也可以指定为127.0.0.1:9000,这样就会监听到网络套接字 processes = 2 #启动2个工作进程,生成指定数目的worker/进程 buffer-size = 32768
#设置用于uwsgi包解析的内部缓存区大小为64k。默认是4k。 daemonize = /var/log/myapp_uwsgi.log
# 使进程在后台运行,并将日志打到指定的日志文件或者udp服务器 log-maxsize = 5000000 #设置最大日志文件大小 disable-logging = true #禁用请求日志记录 vacuum = true #当服务器退出的时候自动删除unix socket文件和pid文件。 listen = 120 #设置socket的监听队列大小(默认:100) pidfile = /var/run/uwsgi.pid #指定pid文件 enable-threads = true
#允许用内嵌的语言启动线程。这将允许你在app程序中产生一个子线程 reload-mercy = 8
#设置在平滑的重启(直到接收到的请求处理完才重启)一个工作子进程中,等待这个工作结束的最长秒数。这个配置会使在平滑地重启工作子进程中,如果工作进程结束时间超过了8秒就会被强行结束(忽略之前已经接收到的请求而直接结束) max-requests = 5000
#为每个工作进程设置请求数的上限。当一个工作进程处理的请求数达到这个值,那么该工作进程就会被回收重用(重启)。你可以使用这个选项来默默地对抗内存泄漏 limit-as = 256
#通过使用POSIX/UNIX的setrlimit()函数来限制每个uWSGI进程的虚拟内存使用数。这个配置会限制uWSGI的进程占用虚拟内存不超过256M。如果虚拟内存已经达到256M,并继续申请虚拟内存则会使程序报内存错误,本次的http请求将返回500错误。 harakiri = 60
#一个请求花费的时间超过了这个harakiri超时时间,那么这个请求都会被丢弃,并且当前处理这个请求的工作进程会被回收再利用(即重启)
uwsgi参数详解
13、配置nginx参数
配置文件如下,nginx.conf
user root;
worker_processes 1; error_log logs/error.log; pid logs/nginx.pid; events {
worker_connections 1024;
} http {
include mime.types;
default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'; access_log logs/access.log main; sendfile on;
#tcp_nopush on; #keepalive_timeout 0;
keepalive_timeout 65; # 支持图片 gif等等压缩,减少网络带宽
gzip on; server {
listen 80;
server_name myblog; # substitute your machine's IP address or FQDN
charset utf-8; client_max_body_size 75M; # adjust to taste location /favicon.ico {
alias /root/myblogs/MyBlogs/myicon.ico;
} location /media {
alias /root/myblogs/MyBlogs/FCBlogs/media; # your Django project's media files - amend as required
} location /static {
alias /root/myblogs/MyBlogs/FCBlogs/static_collection; # your Django project's static files - amend as required
} location / {
uwsgi_pass 0.0.0.0:8001;
include uwsgi_params; # the uwsgi_params file you installed
}
} # another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias; # location / {
# root html;
# index index.html index.htm;
# }
#} # HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost; # ssl_certificate cert.pem;
# ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on; # location / {
# root html;
# index index.html index.htm;
# }
#} }
14、启动redis
redis-server
15、启动uwsgi
uwsgi -i uwsgi.ini
当uwsgi启动时如果想要停止可以执行下面代码
uwsgi --stop master.pid # master.pid 为 uwsgi.ini文件中pidfile指定的文件
16、nginx的启动
启动:nginx 如果停止,可以pkill nginx,然后再启动nginx
17、这下就完成了。其他的可以参考我的另一篇文章
nginx+uwsgi+python3+pipenv+mysql+redis部署django程序的更多相关文章
- 基于centos7+nginx+uwsgi+python3+django2.0部署Django项目
0.序言 本文讲解如何基于centos7+nginx+uwsgi+python3+django2.0把windows上的本地项目部署到云服务器上. 本文服务器上的django项目和虚拟环境的路径将建立 ...
- Python3.6+nginx+uwsgi部署Django程序到阿里云Ubuntu16.04系统
Python3.6+nginx+uwsgi部署Django程序到阿里云Ubuntu16.04系统 这个是写好的Django程序在本地机运行的情况,一个查询接口. 准备工作 1.首先购买一台阿里云的EC ...
- 五步教你实现使用Nginx+uWSGI+Django方法部署Django程序
Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式. 在这种方式中,我们的通常做法是,将nginx作为服务器最前端,它将接收WEB的所有请求,统一管理请求.ng ...
- 使用Nginx+uWSGI+Django方法部署Django程序(下)
在上一篇文章<五步教你实现使用Nginx+uWSGI+Django方法部署Django程序(上)>中,阐述了如何只使用uWSGI来部署Django程序. 当然,单单只有uWSGI是不够的, ...
- 使用Nginx+uWSGI+Django方法部署Django程序(上)
Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式. 在这种方式中,我们的通常做法是,将nginx作为服务器最前端,它将接收WEB的所有请求,统一管理请求.ng ...
- centos7下部署Django(nginx+uwsgi+python3+django)
系统版本 centos7 python版本 使用官方python3.6.3正式版 django版本 使用本文发布时最新的1.11.7 uwsgi版本 使用本文发布时最新的2.0.15 nginx版本 ...
- 使用Nginx+uWSGI+Django方法部署Django程序
第一步先解决uwsgi与django的桥接.解决在没有nginx的情况下,如何使用uwsgi+DJANGO来实现一个简单的WEB服务器. 第二步解决uwsgi与Nginx的桥接.通过nginx与uws ...
- Centos7.3+uwsgi+Nginx部署Django程序
1. 安装Python,这里我用的是阿里云的centos7.3,自带python2,所以,此步略过,具体安装Python可Google. 2. 安装uwsgi,如果安装失败的话首先,我的Python解 ...
- 一个适合变化的产品部署集成包(nginx+jdk+tomcat+nodejs+mysql+redis+mongo+MYSQL主主(读写分离)集群建立+代码包+持续上线+备份)
一.前言 最近公司做了一套新产品,需要发布到不确定的硬件环境中(不同使用单位规模,使用人数,服务器提供的资源不同)若每次进行人工部署耗时费力,周期过长. 二.分析 具体的部署流程如下: 由上图流程进行 ...
随机推荐
- [洛谷P4213]【模板】杜教筛(Sum)
题目大意:给你$n$,求:$$\sum\limits_{i=1}^n\varphi(i),\sum\limits_{i=1}^n\mu(i)$$最多$10$组数据,$n\leqslant2^{31}- ...
- JDK8-lambda表达式以及接口可以定义默认方法
一.Lambda表达式 1.Lamdba Lambda 允许把函数作为一个方法的参数,使用Lamdba可以让开发的代码更加简洁,但是易读性差,新人不了解Lamdba表达式或者代码功底有点差,不容易读懂 ...
- wpf Log4net的配置和使用
现在项目涉及的是cs客户端,在项目中使用log4net记录本地日志和异常信息,这里项目做完了,想着自己做一个demo,测试记录一下log4Net的配置使用. 第一步.新建一个wpf应用程序,项目右键 ...
- c#-Json-Json字符串字段递归排序
private static dynamic GetSorObject (Object obj) { if (obj is JArray) { var list = new List<dynam ...
- (一) CentOS 7 进行 Docker CE 安装
参考并感谢 官方文档: https://docs.docker.com/install/linux/docker-ce/centos/ 卸载旧版本 # 停止所有正在运行的容器 docker stop ...
- 转 如何在调用WCF服务之前弹出一个确认对话框
自定义InteractiveChannelInitializer(InvocationConfirmationInteractiveChannelInitializer)定义如下.我们在BeginDi ...
- WebSocket 转
即时通信常用手段 1.第三方平台 谷歌.腾讯 环信等多如牛毛,其中谷歌即时通信是免费的,但免费就是免费的并不好用.其他的一些第三方一般收费的,使用要则限流(1s/限制x条消息)要么则限制用户数. 但稳 ...
- python3基础之“小练习(2)”
(十三)创建一个你最喜欢歌手的列表. # singer=list() # singer=['a','b','c'] # print(singer) (十四)创建一个由元组构成的列表,每个元组包含居住过 ...
- 关于SqlServer数据库数据备份失败的问题
当备份的失败,出现说什么应该支持多少个介质簇,但实际出现了多少介质簇,这个时候就要考虑备份的地址是不是出现问题. 首先,检查备份地址,是不是多于两个以上,那么在备份的时候应该注意,备份地址最好留一个, ...
- linux系统编程面试题
说明:所有题目均摘录于网络以及我所见过的面试题目,欢迎补充! 无特殊说明情况下,下面所有题s目都是linux下的32位C程序. 1.堆和栈有什么区别? (1)栈由操作系统分配和释放:堆则是程序员手动去 ...