经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Django » 查看文章
详解Django+uwsgi+Nginx上线最佳实战
来源:jb51  时间:2019/3/15 8:35:17  对本文有异议

什么是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

备份网卡文件

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

配置阿里云镜像源

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

Python3.6.0

上传Python-3.6.0.tar.xz

  1. ~$ rz

安装依赖

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

解压Python-3.6.0.tar.xz

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

修改部分源代码

  1. ~$ vim Modules/Setup.dist
  2. # 将该文件的204到209行部分代码取消注释,完成后如下所示:
  3. # Socket module helper for socket(2)
  4. _socket socketmodule.c
  5.  
  6. # Socket module helper for SSL support; you must comment out the other
  7. # socket line above, and possibly edit the SSL variable:
  8. SSL=/usr/local/ssl
  9. _ssl _ssl.c -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl -L$(SSL)/lib -lssl -lcrypto
  10.  
  11. # The crypt module is now disabled by default because it breaks builds

编译安装

  1. ~$ ./configure
  2. ~$ make -j
  3. ~$ make install
  4. ~$ cd
  5. ~$ rm -rf Python-3.6.0

防火墙

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

SELinux

关闭SELinux

  1. ~$ vim /etc/selinux/config
  2. # 修改配置为如下所示:
  3. SELINUX=permissive
  4.  
  5. ~$ reboot

数据库

二进制方式安装

  1. # 查找相关旧文件并删除
  2. find / -name mysql
  3. find / -name mariadb
  4. # 移除全部相关包
  5. rpm -qa | grep mysql
  6. rpm -qa | grep mariadb
  7. # 添加用户
  8. useradd mysql -s /sbin/nologin -M
  9. # 解压移动文件
  10. tar -xvf mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz
  11. mv mysql-5.7.24-linux-glibc2.12-x86_64 /applications/
  12. ln -s /applications/mysql-5.7.24-linux-glibc2.12-x86_64/ /applications/mysql
  13. # 创建配置文件
  14. vim /etc/my.cnf
  15. # 创建相关目录
  16. mkdir -p /data/mysql/data
  17. mkdir -p /data/mysql/log
  18. # 手动创建日志文件
  19. touch /data/mysql/log/mysqld.log
  20. # 修改权限
  21. chown -R mysql.mysql /applications/mysql
  22. chown -R mysql.mysql /data/mysql

MySQL配置文件

  1. [client]
  2. port=3306
  3. socket=/data/mysql/mysql.sock
  4.  
  5. [mysqld]
  6. port=3306
  7. datadir=/data/mysql/data
  8. basedir=/applications/mysql
  9. pid-file=/data/mysql/mysqld.pid
  10. socket=/data/mysql/mysql.sock
  11. user=mysql
  12. character-set-server=utf8mb4
  13. default-storage-engine=INNODB
  14. collation-server = utf8mb4_general_ci
  15. init_connect='SET NAMES utf8mb4'
  16. max_connections = 1000
  17. max_connect_errors = 1200
  18. max_allowed_packet = 128M
  19. explicit_defaults_for_timestamp = true
  20. query_cache_size = 0
  21. query_cache_type = 0
  22. log_error = /data/mysql/log/error.log
  23. slow_query_log = 1
  24. slow_query_log_file = /data/mysql/log/slow.log
  25. log_queries_not_using_indexes = 1
  26. log_throttle_queries_not_using_indexes = 5
  27. long_query_time = 8
  28. log_slow_slave_statements = 1
  29. min_examined_row_limit = 100
  30. expire_logs_days = 5
  31. tmpdir = /tmp
  32. innodb_buffer_pool_size = 128M
  33.  
  34. [mysqld_safe]
  35. log-error=/data/mysql/log/mysqld.log
  36. pid-file=/data/mysql/mysqld.pid
  1. # 同步数据
  2. /applications/mysql/bin/mysql_install_db --basedir=/applications/mysql/ --datadir=/data/mysql/data/ --user=mysql

配置并启动

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

初始化数据库

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

Django

配置pip3源

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

创建虚拟环境安装依赖

  1. # PublisherPro,一个支持MD轻量级的CMS程式.
  2. git clone https://gitee.com/bluemiaomiao/PublisherPro.git
  3. pip3 install virtualenv
  4. cd PROJECT_DIR
  5. virtualenv venv
  6. source venv/bin/activate
  7. pip3 install -r requestments.txt
  8. pip3 install uwsgi
  9. mkdir log
  10. mkdir script
  11. touch PublisherPro/script/uwsgi.pid
  12. touch PublisherPro/script/uwsgi.status
  13. vim uwsgi.ini

修改项目配置

  1. # PROJECT_DIR/PROJECT_NAME/settings.py
  2. # 设置为生产环境
  3. DEBUG = False
  4. # 配置数据库
  5. DATABASES = {
  6. 'default': {
  7. 'ENGINE': 'django.db.backends.mysql',
  8. 'NAME': 'publisher_pro',
  9. 'USER': 'pubpro',
  10. 'PASSWORD': 'bluemiaomiao',
  11. 'HOST': '192.168.1.203',
  12. 'PORT': '3306',
  13. 'OPTIONS': {'init_command': 'SET default_storage_engine=INNODB;'},
  14. }
  15. }
  16. # 配置静态文件相关
  17. # STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
  18. STATIC_ROOT = os.path.join(BASE_DIR, 'static')

创建数据库和用户

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

同步数据库

  1. ./venv/bin/python3 manage.py makemigrations
  2. ./venv/bin/python3 manage.py migrate
  3. ./venv/bin/python3 manage.py createsuperuser
  4. ./venv/bin/python3 manage.py collectstatic

uwsgi

配置文件内容

  1. # uwsig使用配置文件启动
  2. [uwsgi]
  3. # 项目目录
  4. chdir=/applications/website/PublisherPro
  5. # 指定项目的application
  6. module=PublisherPro.wsgi:application
  7. # 指定sock的文件路径
  8. socket=/applications/website/PublisherPro/script/uwsgi.sock
  9. # 进程个数
  10. workers=5
  11. pidfile=/applications/website/PublisherPro/script/uwsgi.pid
  12. # 状态文件
  13. stats=/applications/website/PublisherPro/script/uwsgi.status
  14. # 指定IP端口
  15. http=0.0.0.0:8000
  16. # 指定静态文件
  17. static-map=/static=/applications/website/PublisherPro/static
  18. # 启动uwsgi的用户名和用户组
  19. uid=pubpro
  20. gid=pubpro
  21. # 启用主进程
  22. master=true
  23. # 自动移除unix Socket和pid文件当服务停止的时候
  24. vacuum=true
  25. # 序列化接受的内容,如果可能的话
  26. thunder-lock=true
  27. # 启用线程
  28. enable-threads=true
  29. # 设置自中断时间
  30. harakiri=30
  31. # 设置缓冲
  32. post-buffering=4096
  33. # 设置日志目录
  34. daemonize=/applications/website/PublisherPro/log/uwsgi.log

创建用户和组并修改权限

  1. # 创建用户
  2. useradd pubpro -s /sbin/nologin -M
  3. # 检查结果
  4. id pubpro
  5. # 修改权限
  6. chown -R pubpro.pubpro /applications/website/PublisherPro/
  7. # 检查结果
  8. ll -d /applications/website/PublisherPro/

测试Django应用

  1. # 启动应用
  2. uwsgi --ini uwsgi.ini
  3. # 重载应用
  4. uwsgi --reload script/uwsgi.pid
  5. # 状态信息
  6. uwsgi --connect-and-read script/uwsgi.status
  7. # 停止应用
  8. uwsgi --stop script/uwsgi.pid

Nginx

  1. server {
  2. listen 80;
  3. server_name 192.168.2.108;
  4. access_log /var/log/nginx/access.log main;
  5. charset utf-8;
  6. 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;
  7. error_page 404 /404.html;
  8. error_page 500 502 503 504 /50x.html;
  9.  
  10. # 指定项目路径uwsgi
  11. location / {
  12. # 导入一个Nginx模块他是用来和uWSGI进行通讯的
  13. include uwsgi_params;
  14. # 设置连接uWSGI超时时间
  15. uwsgi_connect_timeout 30;
  16. # 指定uwsgi的sock文件所有动态请求就会直接丢给他
  17. uwsgi_pass unix:/data/PublisherPro/script/uwsgi.sock;
  18. }
  19.  
  20. # 指定静态文件路径
  21. location /static/ {
  22. alias /data/PublisherPro/static;
  23. index index.html index.htm;
  24. }
  25. }
  26.  

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号