详解Django+uwsgi+Nginx上线最佳实战
什么是uwsgi?
uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。WSGI是一种Web服务器网关接口。它是一个Web服务器(如nginx,uWSGI等服务器)与web应用(如用Flask框架写的程序)通信的一种规范。
- WSGI是一种通信协议。
- uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信。uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(typeofinformation),每一个uwsgipacket前4byte为传输信息类型描述,它与WSGI相比是两样东西。
- uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。
在开始之前
最小化安装CentOS6
备份网卡文件
~$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.repohttp://mirrors.aliyun.com/repo/Centos-6.repo ~$yumcleanall&&yumrepolistall&&yumupdate-y ~$reboot
Python3.6.0
上传Python-3.6.0.tar.xz
~$rz
安装依赖
yuminstallzlib*gccopensslopenssl-devellibffi-devel-y yuminstallpcrepcre-develpcre-static-y
解压Python-3.6.0.tar.xz
~$tar-xvfPython-3.6.0.tar.xz ~$cdPython-3.6.0
修改部分源代码
~$vimModules/Setup.dist #将该文件的204到209行部分代码取消注释,完成后如下所示: #Socketmodulehelperforsocket(2) _socketsocketmodule.c #SocketmodulehelperforSSLsupport;youmustcommentouttheother #socketlineabove,andpossiblyedittheSSLvariable: SSL=/usr/local/ssl _ssl_ssl.c\ -DUSE_SSL-I$(SSL)/include-I$(SSL)/include/openssl\ -L$(SSL)/lib-lssl-lcrypto #Thecryptmoduleisnowdisabledbydefaultbecauseitbreaksbuilds
编译安装
~$./configure ~$make-j ~$makeinstall ~$cd ~$rm-rfPython-3.6.0
防火墙
#恢复默认配置 iptables-F #放通3306/8000/80端口 iptables-IINPUT-ptcp-mtcp--dport3306-jACCEPT iptables-IINPUT-ptcp-mtcp--dport8000-jACCEPT iptables-IINPUT-ptcp-mtcp--dport80-jACCEPT #保存规则 /etc/init.d/iptablessave
SELinux
关闭SELinux
~$vim/etc/selinux/config #修改配置为如下所示: SELINUX=permissive ~$reboot
数据库
二进制方式安装
#查找相关旧文件并删除 find/-namemysql find/-namemariadb #移除全部相关包 rpm-qa|grepmysql rpm-qa|grepmariadb #添加用户 useraddmysql-s/sbin/nologin-M #解压移动文件 tar-xvfmysql-5.7.24-linux-glibc2.12-x86_64.tar.gz mvmysql-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-Rmysql.mysql/applications/mysql chown-Rmysql.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='SETNAMESutf8mb4' 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|grepmysql #添加服务并设置为开机自启动 chkconfig--addmysqld chkconfigmysqldon
初始化数据库
/applications/mysql/bin/mysql_secure_installation
--设置用户密码 alteruser'root'@'localhost'identifiedby'123456'; --允许root远程访问 GRANTALLPRIVILEGESON*.*TO'root'@'%'IDENTIFIEDBY'123456'WITHGRANTOPTION; FLUSHPRIVILEGES;
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程式. gitclonehttps://gitee.com/bluemiaomiao/PublisherPro.git pip3installvirtualenv cdPROJECT_DIR virtualenvvenv sourcevenv/bin/activate pip3install-rrequestments.txt pip3installuwsgi mkdirlog mkdirscript touchPublisherPro/script/uwsgi.pid touchPublisherPro/script/uwsgi.status vimuwsgi.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':'SETdefault_storage_engine=INNODB;'}, } } #配置静态文件相关 #STATICFILES_DIRS=[os.path.join(BASE_DIR,'static')] STATIC_ROOT=os.path.join(BASE_DIR,'static')
创建数据库和用户
CREATEDATABASE`publisher_pro`CHARACTERSET'utf8'COLLATE'utf8_general_ci'; CREATEUSER`pubpro`@`localhost`IDENTIFIEDBY'bluemiaomiao'PASSWORDEXPIRENEVER; CREATEUSER`pubpro`@`%`IDENTIFIEDBY'bluemiaomiao'PASSWORDEXPIRENEVER; GRANTAllON`publisher\_pro`.*TO`pubpro`@`%`;
同步数据库
./venv/bin/python3manage.pymakemigrations ./venv/bin/python3manage.pymigrate ./venv/bin/python3manage.pycreatesuperuser ./venv/bin/python3manage.pycollectstatic
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 #自动移除unixSocket和pid文件当服务停止的时候 vacuum=true #序列化接受的内容,如果可能的话 thunder-lock=true #启用线程 enable-threads=true #设置自中断时间 harakiri=30 #设置缓冲 post-buffering=4096 #设置日志目录 daemonize=/applications/website/PublisherPro/log/uwsgi.log
创建用户和组并修改权限
#创建用户 useraddpubpro-s/sbin/nologin-M #检查结果 idpubpro #修改权限 chown-Rpubpro.pubpro/applications/website/PublisherPro/ #检查结果 ll-d/applications/website/PublisherPro/
测试Django应用
#启动应用 uwsgi--iniuwsgi.ini #重载应用 uwsgi--reloadscript/uwsgi.pid #状态信息 uwsgi--connect-and-readscript/uwsgi.status #停止应用 uwsgi--stopscript/uwsgi.pid
Nginx
server{ listen80; server_name192.168.2.108; access_log/var/log/nginx/access.logmain; charsetutf-8; gzip_typestext/plainapplication/x-javascripttext/csstext/javascriptapplication/x-httpd-phpapplication/jsontext/jsonimage/jpegimage/gifimage/pngapplication/octet-stream; error_page404/404.html; error_page500502503504/50x.html; #指定项目路径uwsgi location/{ #导入一个Nginx模块他是用来和uWSGI进行通讯的 includeuwsgi_params; #设置连接uWSGI超时时间 uwsgi_connect_timeout30; #指定uwsgi的sock文件所有动态请求就会直接丢给他 uwsgi_passunix:/data/PublisherPro/script/uwsgi.sock; } #指定静态文件路径 location/static/{ alias/data/PublisherPro/static; indexindex.htmlindex.htm; } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。