详解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的socket编程入门教程
Apr 23 Python
Python序列操作之进阶篇
Dec 08 Python
分享几道你可能遇到的python面试题
Jul 24 Python
Python实现批量执行同目录下的py文件方法
Jan 11 Python
pytorch 更改预训练模型网络结构的方法
Aug 19 Python
python sorted函数的小练习及解答
Sep 18 Python
关于pycharm中pip版本10.0无法使用的解决办法
Oct 10 Python
pyhton中__pycache__文件夹的产生与作用详解
Nov 24 Python
python多进程并发demo实例解析
Dec 13 Python
python多线程实现同时执行两个while循环的操作
May 02 Python
Pytorch 使用opnecv读入图像由HWC转为BCHW格式方式
Jun 02 Python
matplotlib部件之矩形选区(RectangleSelector)的实现
Feb 01 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来处理多个提交任务
2006/10/09 PHP
PHP设计模式 注册表模式
2012/02/05 PHP
php使用codebase生成随机数
2014/03/25 PHP
Codeigniter购物车类不能添加中文的解决方法
2014/11/29 PHP
CI框架表单验证实例详解
2016/11/21 PHP
php实现统计二进制中1的个数算法示例
2018/01/23 PHP
PHP判断当前使用的是什么浏览器(推荐)
2019/10/27 PHP
Thinkphp 框架扩展之应用模式实现方法分析
2020/04/27 PHP
ExtJS自定义主题(theme)样式详解
2013/11/18 Javascript
基于jQuery实现下拉框
2014/11/24 Javascript
textarea 在浏览器中固定大小和禁止拖动的实现方法
2016/12/03 Javascript
JavaScript适配器模式详解
2017/10/19 Javascript
vue项目webpack中Npm传递参数配置不同域名接口
2018/06/15 Javascript
利用Webpack实现小程序多项目管理的方法
2019/02/25 Javascript
js实现图片上传即时显示效果
2019/09/30 Javascript
vue实现div可拖动位置也可改变盒子大小的原理
2020/09/16 Javascript
js制作提示框插件
2020/12/24 Javascript
对于Python的框架中一些会话程序的管理
2015/04/20 Python
Python在线运行代码助手
2016/07/15 Python
Flask之flask-session的具体使用
2018/07/26 Python
Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
2019/01/04 Python
Django基础知识 web框架的本质详解
2019/07/18 Python
Python 合并多个TXT文件并统计词频的实现
2019/08/23 Python
python 模拟贷款卡号生成规则过程解析
2019/08/30 Python
如何使用python代码操作git代码
2020/02/29 Python
Python基于Tkinter编写crc校验工具
2020/05/06 Python
Matplotlib中rcParams使用方法
2021/01/05 Python
Django实现简单的分页功能
2021/02/22 Python
Exoticca英国:以最优惠的价格提供豪华异国情调旅行
2018/10/18 全球购物
康拓普公司Java笔面试
2016/09/23 面试题
实习公司领导推荐函
2014/05/21 职场文书
个人承诺书怎么写
2014/05/24 职场文书
生产助理岗位职责
2014/06/18 职场文书
物联网工程专业推荐信
2014/09/08 职场文书
考试作弊检讨书
2015/01/27 职场文书
瘦西湖导游词
2015/02/03 职场文书