nginx+uwsgi+python3+pipenv+mysql+redis部署django程序
Posted Felix Wang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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中的邮箱配置,数据库配置等。
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超时时间,那么这个请求都会被丢弃,并且当前处理这个请求的工作进程会被回收再利用(即重启)
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程序的主要内容,如果未能解决你的问题,请参考以下文章
Python3 - Nginx+uwsgi+Flask 部署到Centos服务器
Python3 - Nginx+uwsgi+Flask 部署到Centos服务器
Python3+django+nginx+uwsgi使用场景部署
Python3+django+nginx+uwsgi使用场景部署