当前位置:脚本大全 > > 正文

nginxpython编写模块(Python开发之Nginx+uWSGI+virtualenv多项目部署教程)

时间:2021-10-01 01:11:18类别:脚本大全

nginxpython编写模块

Python开发之Nginx+uWSGI+virtualenv多项目部署教程

1、新建独立运行环境,命名为env

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • [root@vultr ~]# mkdir projects # 测试的项目总目录
  • [root@vultr ~]# pip3 install virtualenv
  • [root@vultr ~]# cd projects
  • [root@vultr projects]# virtualenv env --python=python3 --no-site-packages
  • --python:指定python版本
  • --no-site-packages:不复制系统已安装python包
  • 2、激活虚拟环境

    [root@vultr projects]# source env/bin/activate

    执行后命令提示符前面会出现一个env,变成(env)[root@vultr opt]#,退出虚拟环境执行deactivate即可。

    3、安装项目依赖:

    pip3 install, 在虚拟环境中安装的包,不会对系统环境造成影响。

    django项目配置

    1、上传django项目: hello项目

    目录结构:

  • ?
  • 1
  • 2
  • 3
  • 4
  • hello/
  •  apps/
  •  hello/
  •  manage.py
  • 2、配置项目的数据库信息:vi hello/hello/settings.py

    如果是远程服务器,需要修改setting.py文件中的allowed_hosts:

    allowed_hosts = ['*']

    3、数据迁移

    (env)[root@vultr hello]# python3 manage.py makemigrations
    (env)[root@vultr hello]# python3 manage.py migrate

    4、收集静态文件:vi hello/hello/settings.py

    static_root = os.path.join(base_dir, "static")

    :wq保存后,执行

    (env)[root@vultr hello]# python3 manage.py collectstatic --noinput

    5、用runserver启动项目,看是否正常运行

    (env)[root@vultr hello]# python3 manage.py runserver 0.0.0.0:8088

    uwsgi配置

    deactivate退出虚拟环境

    1、安装uwsgi

    [root@vultr hello]# pip3 install uwsgi

    2、命令行运行测试

    在 项目目录hello 下,执行以下命令:

    [root@vultr hello]# uwsgi --http ip:端口 --home /root/env/ --file hello/wsgi.py --static-map=/static=static

    --home:指定虚拟环境的目录

    wsgi.py:django创建项目时生成的文件

    如果访问url正常,说明python虚拟环境和uwsgi没有问题.

    3、使用ini配置文件来启动uwsgi

    我习惯性创建projects目录,目录结构如下:

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • /root/projects/
  •    script/  --> 存放uwsgi相关的文件,例如uwsgi.ini, uwsgi.pid...
  •    hello/ --> 项目目录
  •      apps/ --> 应用程序目录
  •      hello/ --> settings.py等文件所在目录
  •      static/
  •    env/ --> 虚拟环境目录
  • [root@vultr projects]# vi script/uwsgi.ini

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • [uwsgi]
  • # 项目目录
  • chdir=/root/projects/hello/
  • # 虚拟环境目录
  • home=/root/projects/env/
  • # 启动uwsgi的用户名和用户组
  • uid=root
  • gid=root
  • # 指定项目的application
  • module=hello.wsgi:application
  • # 指定sock的文件路径
  • socket=/root/projects/script/uwsgi.sock
  • # 启用主进程
  • master=true
  • # 进程个数
  • workers=5
  • pidfile=/root/projects/script/uwsgi.pid
  • # 自动移除unix socket和pid文件当服务停止的时候
  • vacuum=true
  • # 序列化接受的内容,如果可能的话
  • thunder-lock=true
  • # 启用线程
  • enable-threads=true
  • # 设置自中断时间
  • harakiri=30
  • # 设置缓冲
  • post-buffering=4096
  • # 设置日志目录
  • daemonize=/root/projects/script/uwsgi.log
  • 4、后台启动停止uwsgi的命令

  • ?
  • 1
  • 2
  • [root@vultr projects]# uwsgi --ini script/uwsgi.ini # 启动
  • [root@vultr projects]# uwsgi --stop script/uwsgi.pid # 停止
  • nginx配置

    1、 配置yum:

    [root@vultr projects]# vi /etc/yum.repos.d/nginx.repo

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • [nginx]
  • name=nginx repo
  • # 下面这行centos根据你自己的操作系统修改比如:os/rehel
  • # 6是你linux系统的版本,可以通过url查看路径是否正确
  • baseurl=http://nginx.org/packages/centos/6/$basearch/
  • gpgcheck=0
  • enabled=1
  • 2、 安装: yum -y install nginx

    3、添加配置文件

    [root@vultr projects]# vi /etc/nginx/conf.d/hello.conf  # 名字是随便起的,建议跟项目目录一样

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • server {
  •  listen 84; # 端口
  •  server_name 10.129.205.183 ; # 域名
  •  access_log /var/log/nginx/access.log main;
  •  charset utf-8;
  •  gzip on;
  •  gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php application/json text/json image////octet-stream;
  •  
  •  error_page 404   /404.html;
  •  error_page 500 502 503 504 /50x.html;
  •  # 指定项目路径uwsgi
  •  location / {
  •   include uwsgi_params; # 加载nginx和uwsgi的通信协议模块
  •   uwsgi_connect_timeout 30; # 超时时间
  •   uwsgi_pass unix:/root/projects/script/uwsgi.sock;
  •  }
  •  # 指定静态文件路径
  •  location /static/ {
  •  alias /root/projects/hello/static/;
  •  index index.html index.htm;
  •  }
  • }
  • 4、启动与停止nginx

    检查uwsgi是否启动了

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • [root@vultr projects]# ps -ef | grep uwsgi
  • root  2299  1 0 06:22 00:00:00 uwsgi --ini script/uwsgi.ini
  • root  2301 2299 0 06:22 00:00:00 uwsgi --ini script/uwsgi.ini
  • root  2302 2299 0 06:22 00:00:00 uwsgi --ini script/uwsgi.ini
  • root  2303 2299 0 06:22 00:00:00 uwsgi --ini script/uwsgi.ini
  • root  2304 2299 0 06:22 00:00:00 uwsgi --ini script/uwsgi.ini
  • root  2305 2299 0 06:22 00:00:00 uwsgi --ini script/uwsgi.ini
  • root  2306 2299 0 06:22 00:00:00 uwsgi --ini script/uwsgi.ini
  • root  2361 2016 0 06:32 pts/1 00:00:00 grep uwsgi
  • 启动nginx

    [root@vultr projects]# /etc/init.d/nginx start

    访问url,见证奇迹的时刻到了,然后...

    nginxpython编写模块(Python开发之Nginx+uWSGI+virtualenv多项目部署教程)

    ok,报错了,莫慌。度娘查了502是服务器错误,然而前面测试了django+uwsgi没问题,所以最有可能是在nginx出错了。

    来,我们查看一下nginx的错误日志文件,日志文件在哪呢???

  • ?
  • 1
  • 2
  • 3
  • [root@vultr projects]# find / -name nginx.conf
  • /etc/nginx/nginx.conf
  • [root@vultr projects]# vi /etc/nginx/nginx.conf
  • nginxpython编写模块(Python开发之Nginx+uWSGI+virtualenv多项目部署教程)

    error_log参数就是错误日志文件了,让我们再打开error.log文件,找到最后一条记录:

    2019/05/12 06:41:43 [crit] 1514#1514: *2 connect() to unix:/root/projects/script/uwsgi.sock failed (13: permission denied) while connecting to upstream, ...(后面省略)

    从 failed (13: permission denied) while connecting to upstream 可以看出是没有权限???原因是我贪图方便, 直接把项目文件以及uwsgi文件放在了/root/目录下 !!!

    好,修改路径,先停止nginx和uwsgi,再修改路径/root/projects/更改为/opt/projects/:

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • [root@vultr projects]# uwsgi --stop script/uwsgi.pid
  • [root@vultr projects]# /etc/init.d/nginx stop
  • 停止 nginx:            [确定]
  • [root@vultr projects]# cd ..
  • [root@vultr ~]# mv projects /opt/
  • [root@vultr ~]# cd /opt/projects/
  • 然后将script/uwsgi.ini和/etc/nginx/conf.d/hello.conf中关于路径的都修改过来,修改好后,再次启动uwsgi和nginx:

  • ?
  • 1
  • 2
  • 3
  • [root@vultr projects]# uwsgi --ini script/uwsgi.ini
  • [uwsgi] getting ini configuration from script/uwsgi.ini
  • [root@vultr projects]# /etc/init.d/nginx start
  • 正在启动 nginx:                                           [确定]

    再次访问url, 访问正常。

    多项目部署

    利用virtualenv可以在服务器上配置多个python运行环境,因此根据nginx、uwsgi、virtualenv可以实现一个服务器上运行多个项目,且互不干扰。

    首先我们先来了解一下nginx+uwsgi通信原理。

    nginxpython编写模块(Python开发之Nginx+uWSGI+virtualenv多项目部署教程)

    请求首先交给nginx,如果是静态内容nginx就直接处理了,如果是动态内容就将请求交给uwsgi服务器,nginx和uwsgi之间是通过socket来通信的,通信协议就是/etc/nginx/conf.d/hello.conf里配置的uwsgi_params文件。

    那么,现在我们来梳理一下,nginx是怎么知道uwsgi在哪里?通过什么和uwsgi做socket通信,回看/etc/nginx/conf.d/hello.conf文件:

    nginxpython编写模块(Python开发之Nginx+uWSGI+virtualenv多项目部署教程)

    原来是根据uwsgi_pass指定了nginx与uwsgi通信的socket文件路径,看到这,就知道好办了,一个项目配置一个uwsgi.ini文件和nginx.conf里的一个server,那既然需要部署多个项目,那就是多个uwsgi.ini和nginx.conf里的多个server。

    好的,我们开始测试:

    1、配置虚拟环境以及测试用runserver运行django项目是否正常。 我的目录结构是:

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • opt/
  •  projects/
  •   hello/ --> 第一个django项目
  •   env/  --> 第一个django项目的虚拟环境
  •   world/ --> 第二个django项目
  •   env_1/ --> 第二个django项目的虚拟环境
  •   script/ --> uwsig.ini等文件存放
  • 2、配置world项目的uwsgi_world.ini文件

    [root@vultr projects]# vi script/uwsgi_w.ini

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • [uwsgi]
  • # 项目目录
  • chdir=/opt/projects/world/
  • # 虚拟环境目录
  • home=/opt/projects/env_1/
  • # 启动uwsgi的用户名和用户组
  • uid=root
  • gid=root
  • # 指定项目的application
  • module=world.wsgi:application
  • # 指定sock的文件路径
  • socket=/opt/projects/script/uwsgi_w.sock
  • # 启用主进程
  • master=true
  • # 进程个数
  • workers=5
  • pidfile=/opt/projects/script/uwsgi_w.pid
  • # 自动移除unix socket和pid文件当服务停止的时候
  • vacuum=true
  • # 序列化接受的内容,如果可能的话
  • thunder-lock=true
  • # 启用线程
  • enable-threads=true
  • # 设置自中断时间
  • harakiri=30
  • # 设置缓冲
  • post-buffering=4096
  • # 设置日志目录
  • daemonize=/opt/projects/script/uwsgi_w.log
  • 3、配置nginx

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • # 可以分开多个配置文件,这里我放在同一个配置文件里
  • [root@vultr projects]# vi /etc/nginx/conf.d/hello.conf
  •  
  • server {
  •  listen 84; # 端口,请注意端口
  •  server_name 10.129.205.183 ; # 域名
  •  access_log /var/log/nginx/access.log main;
  •  charset utf-8;
  •  gzip on;
  •  gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php application/json text/json image////octet-stream;
  •  
  •  error_page 404   /404.html;
  •  error_page 500 502 503 504 /50x.html;
  •  # 指定项目路径uwsgi
  •  location / {
  •   include uwsgi_params; # 加载nginx和uwsgi的通信协议模块
  •   uwsgi_connect_timeout 30; # 超时时间
  • 猜您喜欢