专栏首页散尽浮华Nginx+Django 部署

Nginx+Django 部署

线上的web环境准备用Nginx+Django部署, 下面简单记录下操作过程:

操作系统为Centos7.4
[root@web-node ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
 
1)  安装Python3.6.1
系统默认的是python2.7, 需要升级到Python3.6.1 ( 该Django项目跑在Python3.6.1版本下)
[root@web-node ~]# python -V
Python 2.7.5
 
下载并安装Python3.6.1
[root@web-node ~]# yum install -y gcc gcc-c++
[root@web-node ~]# yum -y install epel-release
[root@web-node ~]# yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel
[root@web-node ~]# cd /usr/local/src/
[root@web-node src]# wget wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tar.xz
[root@web-node src]#  tar xf Python-3.6.1.tar.xz
[root@web-node src]# cd Python-3.6.1
[root@web-node Python-3.6.1]# ./configure --prefix=/usr/local/python3
[root@web-node Python-3.6.1]#  make && make install
 
确认安装的Python下有pip3
[root@web-node Python-3.6.1]# ll /usr/local/python3/bin/python3
lrwxrwxrwx 1 root root 9 12月 11 21:08 /usr/local/python3/bin/python3 -> python3.6
 
[root@web-node Python-3.6.1]# ll /usr/local/python3/bin/pip3
-rwxr-xr-x 1 root root 222 12月 11 21:08 /usr/local/python3/bin/pip3
 
替换python
[root@web-node ~]# cd /usr/bin
[root@web-node ~]# mv python python.bak
[root@web-node ~]# ln -s /usr/local/python3/bin/python3.6 /usr/bin/python
[root@web-node ~]# python -V
Python 3.6.1
 
2) 安装nginx
[root@web-node ~]# useradd www
[root@web-node ~]# wget http://10.0.8.50/software/nginx-1.12.2.tar.gz
[root@web-node ~]# tar -zvxf nginx-1.12.2.tar.gz
[root@web-node ~]# cd nginx-1.12.2
[root@web-node ~]# ./configure --prefix=/data/nginx --user=www --group=www --with-http_ssl_module
[root@web-node nginx-1.12.2]#  ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream
[root@web-node nginx-1.12.2]# make && make install
 
配置nginx
[root@web-node ~]# cd /usr/local/nginx/conf/
[root@web-node conf]# cp nginx.conf nginx.conf.bak
 
[root@web-node conf]# cat nginx.conf
user  www;
worker_processes  4;
  
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
  
#pid        logs/nginx.pid;
  
  
events {
    worker_connections  65535;
}
  
  
http {
    include       mime.types;
    default_type  application/octet-stream;
    charset utf-8;
        
    ######
    ## set access log format
    ######
    log_format  main  '$http_x_forwarded_for $remote_addr $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_cookie" $host $request_time';
  
    #######
    ## http setting
    #######
    sendfile       on;
    tcp_nopush     on;
    tcp_nodelay    on;
    keepalive_timeout  65;
    proxy_cache_path /var/www/cache levels=1:2 keys_zone=mycache:20m max_size=2048m inactive=60m;
    proxy_temp_path /var/www/cache/tmp;
  
    fastcgi_connect_timeout 3000;
    fastcgi_send_timeout 3000;
    fastcgi_read_timeout 3000;
    fastcgi_buffer_size 256k;
    fastcgi_buffers 8 256k;
    fastcgi_busy_buffers_size 256k;
    fastcgi_temp_file_write_size 256k;
    fastcgi_intercept_errors on;
  
    #
    client_header_timeout 600s;
    client_body_timeout 600s;
   # client_max_body_size 50m;
    client_max_body_size 100m;
    client_body_buffer_size 256k;
  
    gzip  on;
    gzip_min_length  1k;
    gzip_buffers     4 16k;
    gzip_http_version 1.1;
    gzip_comp_level 9;
    gzip_types       text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php;
    gzip_vary on;
  
    ## includes vhosts
    include vhosts/*.conf;
}
 
[root@web-node conf]# mkdir /usr/local/nginx/conf/vhosts
[root@web-node conf]# mkdir /var/www/cache
[root@web-node conf]# ulimit 65535
 
[root@web-node conf]# cat vhosts/ng.conf
upstream py-8001 {
      ip_hash;
      server 127.0.0.1:8001  max_fails=3 fail_timeout=15s;
      server 127.0.0.1:8002  max_fails=3 fail_timeout=15s;
}
           
  server {
      listen      80;
      server_name kevin.com www.kevin.com btc.kevin.com eth.kevin.com;
     
      access_log  /usr/local/nginx/logs/8001-access.log main;
      error_log  /usr/local/nginx/logs/8001-error.log;
     
 location / {
         proxy_pass http://py-8001;
         proxy_redirect off ;
         proxy_set_header Host $host;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header REMOTE-HOST $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_connect_timeout 300;
         proxy_send_timeout 300;
         proxy_read_timeout 600;
         proxy_buffer_size 256k;
         proxy_buffers 4 256k;
         proxy_busy_buffers_size 256k;
         proxy_temp_file_write_size 256k;
         proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_404;
         proxy_max_temp_file_size 128m;
         #proxy_cache mycache;                               
         #proxy_cache_valid 200 302 1h;
         #proxy_cache_valid 301 1d;
         #proxy_cache_valid any 1m;
        }
 
 location /static/ {
      alias /data/www/APPServer/staticfiles/;
}
}
 
3) 安装django (项目中使用的mysql是阿里云上的rds)
[root@web-node ~]# yum install MySQL-python
[root@web-node ~]# pip3 install Django==1.11
[root@web-node ~]# pip3 install pymysql
 
django项目存放路径: /data/www/APPServer
静态页存放路径: /data/www/APPServer/staticfiles/
静态页通过nginx访问展示(匹配static的路径), 动态页面通过nginx转发给python处理
[root@web-node script]# ll /data/www/APPServer/
总用量 32
-rw-r--r-- 1 www www 12288 12月 11 17:55 db.sqlite3
drwxr-xr-x 3 www www  4096 12月 11 22:08 django_auth_example
-rwxr-xr-x 1 www www   817 12月 11 17:55 manage.py
drwxr-xr-x 3 www www  4096 12月 11 17:55 staticfiles
drwxr-xr-x 4 www www  4096 12月 11 17:55 templates
drwxr-xr-x 4 www www  4096 12月 11 18:14 users

[root@web-node script]# chown -R www.www /data/www/APPServer/
 
启动python程序, 由于是交互式的, 这里通过tmux工具
[root@web-node ~]# yum install tmux
[root@web-node ~]# sh /data/script/py.8001_start.sh
 
启动脚本
[root@web-node ~]# cat /data/script/py.8001_start.sh
#!/bin/bash
tmux new -d -s bobo_session && tmux send -t bobo_session 'python /data/www/APPServer/manage.py runserver  0.0.0.0:8001' ENTER
tmux new -d -s bobo_session1 && tmux send -t bobo1_session 'python /data/www/APPServer/manage.py runserver  0.0.0.0:8002' ENTER
 
关闭脚本
[root@web-node ~]# cat /data/script/py.8001_stop.sh
#!/bin/bash
tmux kill-session -t bobo_session
 
[root@web-node ~]# lsof -i:8001
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
python  11375 root    4u  IPv4  35968      0t0  TCP *:vcom-tunnel (LISTEN)
[root@web-node ~]# lsof -i:8002
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
python  11399 root    4u  IPv4  36203      0t0  TCP *:teradataordbms (LISTEN)
[root@web-node ~]# ps -ef|grep tmux
root     11356     1  0 00:16 ?        00:00:00 tmux new -d -s bobo_session
root     11430 11409  0 00:17 pts/0    00:00:00 tmux a
root     11643 11335  0 00:26 pts/3    00:00:00 grep --color=auto tmux
[root@web-node ~]# tmux ls
bobo1_session: 1 windows (created Wed Dec 12 00:17:14 2018) [179x53] (attached)
bobo_session: 1 windows (created Wed Dec 12 00:16:54 2018) [135x33]
 
访问http://www.kevin.com 即可

uwsgi是一种线路协议而不是通信协议,在此常用于在uwsgi服务器与其他网络服务器的数据通信。uwsgi协议是一个uwsgi服务器自有的协议,它用于定义传输信息的类型。uwsgi实现了WSGI的所有接口,是一个快速、自我修复、开发人员和系统管理员友好的服务器。uwsgi代码完全用C编写,效率高、性能稳定。

uwsgi作用 Django 是一个 Web 框架,框架的作用在于处理 request 和 reponse,其他的不是框架所关心的内容。所以怎么部署 Django 不是 Django 所需要关心的。Django 所提供的是一个开发服务器,这个开发服务器,没有经过安全测试,而且使用的是 Python 自带的 simple HTTPServer 创建的,在安全性和效率上都是不行的而uwsgi 是一个全功能的 HTTP 服务器,他要做的就是把 HTTP 协议转化成语言支持的网络协议。比如把 HTTP 协议转化成 WSGI 协议,让 Python 可以直接使用。 uwsgi 是一种 uwsgi 的内部协议,使用二进制方式和其他应用程序进行通信。

如果使用uwsgi, 则操作如下:

安装uwsgi
[root@web-node ~]# pip3 install uwsgi

编写测试:
[root@web-node ~]# cat /root/test.py 
def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World"]

启动测试:
[root@web-node ~]# uwsgi --http :9009 --wsgi-file test.py

访问http://localhost:9009 , 即可看到Hello World

nginx+uwsgi配置
[root@web-node ~]# ll /usr/local/nginx/conf/uwsgi*
-rw-r--r-- 1 root root 395 12月 11 21:36 /usr/local/nginx/conf/uwsgi.ini
-rw-r--r-- 1 root root 664 12月 11 17:06 /usr/local/nginx/conf/uwsgi_params
-rw-r--r-- 1 root root 664 12月 11 17:06 /usr/local/nginx/conf/uwsgi_params.default

[root@web-node ~]# cat vhosts/ng.conf
server {
  listen 80;
  server_name www.kevin.com btc.kevin.com eth.kevin.com;

  access_log  /usr/local/nginx/logs/8001-access.log main;
  error_log  /usr/local/nginx/logs/8001-error.log;


  location / {
    uwsgi_pass 127.0.0.1:8000;    
    include uwsgi_params;
    access_log off;
  }

 location /static/ {
      alias /data/www/APPServer/staticfiles/;
}

}

[root@web-node ~]# cat /usr/local/nginx/conf/uwsgi.ini 
[uwsgi]
socket = 127.0.0.1:8000 
master = true
vhost = true
no-site = true
pidfile = /usr/local/nginx/logs/uwsgi.pid
processes = 4 
chdir = /data/www/APPServer
wsgi-file = django_auth_example/wsgi.py
profiler = true
memory-report = true
enable-threads = true
logdata = true
limit-as = 6048
daemonize = /usr/local/nginx/logs/django.log
pythonpath = /usr/local/python3/lib/python3.6/site-packages

[root@web-node ~]# ll /data/www/APPServer/
总用量 32
-rw-r--r-- 1 www www 12288 12月 11 17:55 db.sqlite3
drwxr-xr-x 3 www www  4096 12月 11 22:08 django_auth_example
-rwxr-xr-x 1 www www   817 12月 11 17:55 manage.py
drwxr-xr-x 3 www www  4096 12月 11 17:55 staticfiles
drwxr-xr-x 4 www www  4096 12月 11 17:55 templates
drwxr-xr-x 4 www www  4096 12月 11 18:14 users
[root@web-node ~]# ll /data/www/APPServer/django_auth_example/
总用量 32
-rw-r--r-- 1 www www   43 12月 11 17:55 __init__.py
-rw-r--r-- 1 www www  184 12月 11 18:03 __init__.pyc
drwxr-xr-x 2 www www 4096 12月 11 21:12 __pycache__
-rw-r--r-- 1 www www 3802 12月 11 17:55 settings.py
-rw-r--r-- 1 www www 3241 12月 11 18:11 settings.pyc
-rw-r--r-- 1 www www 1282 12月 11 18:14 urls.py
-rw-r--r-- 1 www www 1256 12月 11 18:14 urls.pyc
-rw-r--r-- 1 www www  416 12月 11 17:55 wsgi.py

启动uwsgi
[root@web-node ~]# uwsgi --ini /usr/local/nginx/conf/uwsgi.ini 
[root@web-node ~]# /usr/local/nginx/sbin/nginx

最后访问http://www.kevin.com 即可

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • kvm虚拟化管理平台WebVirtMgr部署-完整记录(3)

    继下面三篇文章完成了kvm虚拟化管理平台webvirtmgr环境的部署安装: 一般情况下,虚拟机(下面称vm)跟宿主机通过网桥方式进行通信,只要宿主机能联网...

    洗尽了浮华
  • Find 查找命令时过滤掉某些文件或目录 以及 -maxdepth、-mindepth的用法

    1)find过滤目录 使用find命令在linux系统中查找文件时,有时需要忽略某些目录,可以使用"-path 过滤的目录路径 -prune -o"参数来进行过...

    洗尽了浮华
  • Nginx虚拟目录alias和root目录

    nginx是通过alias设置虚拟目录,在nginx的配置中,alias目录和root目录是有区别的: 1)alias指定的目录是准确的,即location匹配...

    洗尽了浮华
  • 009.KVM配置调整

    注意:qcow2磁盘格式必须采用此方式进行扩展,不要采用dd方式,dd方式适用于raw格式。

    木二
  • 010.KVM虚机冷迁移

    迁移后的主机kvm-host-2虚机环境必须具备,具体环境部署参考002.KVM环境部署。

    木二
  • SAP S/4HANA Customer Vendor Integration-CVI锁机制的实现

    版权声明:本文为博主汪子熙原创文章,未经博主允许不得转载。 https://jerry.bl...

    Jerry Wang
  • LDA—主题模型

    假设我们的词典中一共有 V 个词,Unigram Model就是认为上帝按照下面游戏规则产生文本的。

    用户1062972
  • 【前端开发系列】—— 通过鼠标浮动改变样式

    这个简单的demo,可以应用到很多地方。比如导航鼠标移动到上方时,可以改变样式,或者触发下拉框,等等。很有意思 1 <html> 2 <head> 3 <...

    用户1154259
  • postman也可以使用F12功能

    背景: 做过接口测试的话,大多数都知道或使用过postman工具,使用postman的时候,有时候希望也可以像chrome一样使用F12功能,这样方便观察一些数...

    千往
  • [spark] Standalone模式下Master、WorKer启动流程

    而Standalone 作为spark自带cluster manager,需要启动Master和Worker守护进程,本文将从源码角度解析两者的启动流程。Mas...

    UFO

扫码关注云+社区

领取腾讯云代金券