详解Django+uwsgi+Nginx上线最佳实战


Posted in Python onMarch 14, 2019

什么是uwsgi?

uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。WSGI是一种Web服务器网关接口。它是一个Web服务器(如nginx,uWSGI等服务器)与web应用(如用Flask框架写的程序)通信的一种规范。

  1. WSGI是一种通信协议。
  2. uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信。uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。
  3. uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。

在开始之前

最小化安装CentOS 6

备份网卡文件

~$ mkdir /etc/sysconfig/network-scripts/backup
~$ cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/backup/ifcfg-eth0.backup

配置阿里云镜像源

~$ mkdir /etc/yum.repos.d/old
~$ mv /etc/yum.repos.d/CentOS-* /etc/yum.repos.d/old/
~$ cd /etc/yum.repos.d/
~$ curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
~$ yum clean all && yum repolist all && yum update -y
~$ reboot

Python3.6.0

上传Python-3.6.0.tar.xz

~$ rz

安装依赖

yum install zlib* gcc openssl openssl-devel libffi-devel -y
yum install pcre pcre-devel pcre-static -y

解压Python-3.6.0.tar.xz

~$ tar -xvf Python-3.6.0.tar.xz
~$ cd Python-3.6.0

修改部分源代码

~$ vim Modules/Setup.dist
# 将该文件的204到209行部分代码取消注释,完成后如下所示:
# Socket module helper for socket(2)
_socket socketmodule.c

# Socket module helper for SSL support; you must comment out the other
# socket line above, and possibly edit the SSL variable:
SSL=/usr/local/ssl
_ssl _ssl.c \
  -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
  -L$(SSL)/lib -lssl -lcrypto

# The crypt module is now disabled by default because it breaks builds

编译安装

~$ ./configure
~$ make -j
~$ make install
~$ cd
~$ rm -rf Python-3.6.0

防火墙

# 恢复默认配置
iptables -F
# 放通3306/8000/80端口
iptables -I INPUT -p tcp -m tcp --dport 3306 -j ACCEPT
iptables -I INPUT -p tcp -m tcp --dport 8000 -j ACCEPT
iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT
# 保存规则
/etc/init.d/iptables save

SELinux

关闭SELinux

~$ vim /etc/selinux/config
# 修改配置为如下所示:
SELINUX=permissive

~$ reboot

数据库

二进制方式安装

# 查找相关旧文件并删除
find / -name mysql
find / -name mariadb
# 移除全部相关包
rpm -qa | grep mysql
rpm -qa | grep mariadb
# 添加用户
useradd mysql -s /sbin/nologin -M
# 解压移动文件
tar -xvf mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz
mv mysql-5.7.24-linux-glibc2.12-x86_64 /applications/
ln -s /applications/mysql-5.7.24-linux-glibc2.12-x86_64/ /applications/mysql
# 创建配置文件
vim /etc/my.cnf
# 创建相关目录
mkdir -p /data/mysql/data
mkdir -p /data/mysql/log
# 手动创建日志文件
touch /data/mysql/log/mysqld.log
# 修改权限
chown -R mysql.mysql /applications/mysql
chown -R mysql.mysql /data/mysql

MySQL配置文件

[client]
port=3306
socket=/data/mysql/mysql.sock

[mysqld]
port=3306
datadir=/data/mysql/data
basedir=/applications/mysql
pid-file=/data/mysql/mysqld.pid
socket=/data/mysql/mysql.sock
user=mysql
character-set-server=utf8mb4
default-storage-engine=INNODB
collation-server = utf8mb4_general_ci
init_connect='SET NAMES utf8mb4'
max_connections = 1000
max_connect_errors = 1200
max_allowed_packet = 128M
explicit_defaults_for_timestamp = true
query_cache_size = 0
query_cache_type = 0
log_error = /data/mysql/log/error.log
slow_query_log = 1
slow_query_log_file = /data/mysql/log/slow.log
log_queries_not_using_indexes = 1
log_throttle_queries_not_using_indexes = 5
long_query_time = 8
log_slow_slave_statements = 1
min_examined_row_limit = 100
expire_logs_days = 5
tmpdir = /tmp
innodb_buffer_pool_size = 128M

[mysqld_safe]
log-error=/data/mysql/log/mysqld.log
pid-file=/data/mysql/mysqld.pid
# 同步数据
/applications/mysql/bin/mysql_install_db --basedir=/applications/mysql/ --datadir=/data/mysql/data/ --user=mysql

配置并启动

cp /applications/mysql/support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld 
vim /etc/init.d/mysqld
# 修改以下两行
basedir=/applications/mysql
datadir=/data/mysql/data
# 查看是否启动
netstat -tunlap | grep mysql
# 添加服务并设置为开机自启动
chkconfig --add mysqld
chkconfig mysqld on

初始化数据库

/applications/mysql/bin/mysql_secure_installation
-- 设置用户密码
alter user 'root'@'localhost' identified by '123456';
-- 允许root远程访问
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
FLUSH PRIVILEGES;

Django

配置pip3源

mkdir /root/.pip
touch /root/.pip/pip.conf
echo '[global]' >> /root/.pip/pip.conf
echo 'trusted-host=mirrors.aliyun.com' >> /root/.pip/pip.conf
echo 'index-url=https://mirrors.aliyun.com/pypi/simple/' >> /root/.pip/pip.conf

创建虚拟环境安装依赖

# PublisherPro,一个支持MD轻量级的CMS程式.
git clone https://gitee.com/bluemiaomiao/PublisherPro.git
pip3 install virtualenv
cd PROJECT_DIR
virtualenv venv
source venv/bin/activate
pip3 install -r requestments.txt
pip3 install uwsgi
mkdir log
mkdir script
touch PublisherPro/script/uwsgi.pid
touch PublisherPro/script/uwsgi.status
vim uwsgi.ini

修改项目配置

# PROJECT_DIR/PROJECT_NAME/settings.py
# 设置为生产环境
DEBUG = False
# 配置数据库
DATABASES = {
 'default': {
  'ENGINE': 'django.db.backends.mysql',
  'NAME': 'publisher_pro',
  'USER': 'pubpro',
  'PASSWORD': 'bluemiaomiao',
  'HOST': '192.168.1.203',
  'PORT': '3306',
  'OPTIONS': {'init_command': 'SET default_storage_engine=INNODB;'},
 }
}
# 配置静态文件相关
# STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

创建数据库和用户

CREATE DATABASE `publisher_pro` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
CREATE USER `pubpro`@`localhost` IDENTIFIED BY 'bluemiaomiao' PASSWORD EXPIRE NEVER;
CREATE USER `pubpro`@`%` IDENTIFIED BY 'bluemiaomiao' PASSWORD EXPIRE NEVER;
GRANT All ON `publisher\_pro`.* TO `pubpro`@`%`;

同步数据库

./venv/bin/python3 manage.py makemigrations
./venv/bin/python3 manage.py migrate
./venv/bin/python3 manage.py createsuperuser
./venv/bin/python3 manage.py collectstatic

uwsgi

配置文件内容

# uwsig使用配置文件启动
[uwsgi]
# 项目目录
chdir=/applications/website/PublisherPro
# 指定项目的application
module=PublisherPro.wsgi:application
# 指定sock的文件路径  
socket=/applications/website/PublisherPro/script/uwsgi.sock
# 进程个数  
workers=5
pidfile=/applications/website/PublisherPro/script/uwsgi.pid
# 状态文件
stats=/applications/website/PublisherPro/script/uwsgi.status
# 指定IP端口  
http=0.0.0.0:8000
# 指定静态文件
static-map=/static=/applications/website/PublisherPro/static
# 启动uwsgi的用户名和用户组
uid=pubpro
gid=pubpro
# 启用主进程
master=true
# 自动移除unix Socket和pid文件当服务停止的时候
vacuum=true
# 序列化接受的内容,如果可能的话
thunder-lock=true
# 启用线程
enable-threads=true
# 设置自中断时间
harakiri=30
# 设置缓冲
post-buffering=4096
# 设置日志目录
daemonize=/applications/website/PublisherPro/log/uwsgi.log

创建用户和组并修改权限

# 创建用户
useradd pubpro -s /sbin/nologin -M
# 检查结果
id pubpro
# 修改权限
chown -R pubpro.pubpro /applications/website/PublisherPro/
# 检查结果
ll -d /applications/website/PublisherPro/

测试Django应用

# 启动应用
uwsgi --ini uwsgi.ini
# 重载应用
uwsgi --reload script/uwsgi.pid
# 状态信息
uwsgi --connect-and-read script/uwsgi.status
# 停止应用
uwsgi --stop script/uwsgi.pid

Nginx

server {
 listen 80;
 server_name 192.168.2.108;
 access_log /var/log/nginx/access.log main;
 charset utf-8;
 gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php application/json text/json image/jpeg image/gif image/png application/octet-stream;
 error_page 404 /404.html;
 error_page 500 502 503 504 /50x.html;

 # 指定项目路径uwsgi
 location / {
    # 导入一个Nginx模块他是用来和uWSGI进行通讯的
  include uwsgi_params; 
    # 设置连接uWSGI超时时间
  uwsgi_connect_timeout 30; 
    # 指定uwsgi的sock文件所有动态请求就会直接丢给他
  uwsgi_pass unix:/data/PublisherPro/script/uwsgi.sock; 
 }

 # 指定静态文件路径
 location /static/ {
  alias /data/PublisherPro/static;
  index index.html index.htm;
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中用Descriptor实现类级属性(Property)详解
Sep 18 Python
Python用sndhdr模块识别音频格式详解
Jan 11 Python
解决csv.writer写入文件有多余的空行问题
Jul 06 Python
PyCharm的设置方法和第一个Python程序的建立
Jan 16 Python
Gauss-Seidel迭代算法的Python实现详解
Jun 29 Python
浅谈django 模型类使用save()方法的好处与注意事项
Mar 28 Python
浅谈Django中的QueryDict元素为数组的坑
Mar 31 Python
解决import tensorflow as tf 出错的原因
Apr 16 Python
python如何写个俄罗斯方块
Nov 06 Python
python Protobuf定义消息类型知识点讲解
Mar 02 Python
浅谈Python3中datetime不同时区转换介绍与踩坑
Aug 02 Python
Python 多线程处理任务实例
Nov 07 Python
TensorFlow卷积神经网络之使用训练好的模型识别猫狗图片
Mar 14 #Python
Python通过TensorFlow卷积神经网络实现猫狗识别
Mar 14 #Python
python3实现钉钉消息推送的方法示例
Mar 14 #Python
详解Python做一个名片管理系统
Mar 14 #Python
在Python中使用Neo4j的方法
Mar 14 #Python
浅谈Python中eval的强大与危害
Mar 13 #Python
详解python中init方法和随机数方法
Mar 13 #Python
You might like
php 表单数据的获取代码
2009/03/10 PHP
基于PHP CURL获取邮箱地址的详解
2013/06/03 PHP
PIGCMS 如何关闭聊天机器人
2015/02/12 PHP
基于jquery的多功能软键盘插件
2012/07/25 Javascript
asm.js使用示例代码
2013/11/28 Javascript
js调用打印机打印网页字体总是缩小一号的解决方法
2014/01/24 Javascript
javascript中的return和闭包函数浅析
2014/06/06 Javascript
JavaScript获取网页表单action属性的方法
2015/04/02 Javascript
JS打印组合功能
2016/08/04 Javascript
Chrome不支持showModalDialog模态对话框和无法返回returnValue问题的解决方法
2016/10/30 Javascript
nodejs后台集成ueditor富文本编辑器的实例
2017/07/11 NodeJs
Vue resource中的GET与POST请求的实例代码
2017/07/21 Javascript
Vue.js 利用v-for中的index值实现隔行变色
2018/08/01 Javascript
微信小程序授权登录解决方案的代码实例(含未通过授权解决方案)
2019/05/10 Javascript
vue element-ui之怎么封装一个自己的组件的详解
2019/05/20 Javascript
Javascript和jquery在selenium的使用过程
2019/10/31 jQuery
微信小程序图片右边加两行文字的代码
2020/04/23 Javascript
MySQLdb ImportError: libmysqlclient.so.18解决方法
2014/08/21 Python
Python调用C# Com dll组件实战教程
2017/10/12 Python
Python实现的批量修改文件后缀名操作示例
2018/12/07 Python
opencv3/C++图像像素操作详解
2019/12/10 Python
Python接口测试文件上传实例解析
2020/05/22 Python
python是怎么被发明的
2020/06/15 Python
美国最大的家庭鞋类零售商之一:Shoe Carnival
2017/10/06 全球购物
酒店服务实习自我鉴定
2013/09/22 职场文书
餐饮加盟计划书
2014/01/10 职场文书
社团文化节邀请函
2014/01/10 职场文书
党的群众教育实践活动实施方案
2014/06/12 职场文书
股指期货心得体会
2014/09/10 职场文书
先进事迹材料怎么写
2014/12/30 职场文书
书法社团活动总结
2015/05/07 职场文书
嘉年华活动新闻稿
2015/07/17 职场文书
新教师教学工作总结
2015/08/12 职场文书
MySQL表的增删改查基础教程
2021/04/07 MySQL
Nginx进程管理和重载原理详解
2021/04/22 Servers
Win11 KB5015814遇安装失败 影响开始菜单性能解决方法
2022/07/15 数码科技