基于Nginx 和 uwsgi 搭建 Django部署上线环境

简介:

环境:阿里云 ECS CentOS 7.2 64位
安装:

  • python3
  • python虚拟环境
  • django
  • uwsgi
  • nginx

安装Python3

不动现有的Python2环境安装Python3
下载Python3

wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tgz

解压Python3

tar -zxvf Python-3.6.1.tgz

进入目录

cd Python-3.6.1

安装到指定目录(本次指定路径/usr/local/python3
新建文件夹

mkdir -p /usr/local/python3

配置安装路径

./configure --prefix=/usr/local/python3

编译

make

安装

make install

环境配置,让python3命令即输即用
建立python3的软链

ln -s /usr/local/python3/bin/python3 /usr/bin/python3

并将/usr/local/python3/bin加入PATH:

vim ~/.bash_profile

配置环境变量
修改完毕,执行命令,让修改生效:

source ~/.bash_profile

检查Python3是否安装成功:

python3 -V

安装Python3虚拟环境

为啥要安装虚拟环境:

在一个 Python 环境下开发时间越久、安装依赖越多,就越容易出现依赖包冲突的问题。为了解决这个问题,开发者们开发出了 virtualenv,可以搭建虚拟且独立的 Python 环境。这样就可以使每个项目环境与其他项目独立开来,保持环境的干净,解决包冲突问题。

安装 virtualenv,执行命令即可:

pip3 install virtualenv

创建项目的虚拟环境:

virtualenv venv(虚拟环境名称)

执行后,在本地会生成一个与虚拟环境同名的文件夹,包含 Python 可执行文件和 pip 库的拷贝,可用于安装其他包。默认情况下,虚拟环境中不会包含也无法使用系统环境的global site-packages。比如系统环境里安装了 requests 模块,在虚拟环境里import requests会提示ImportError。如果想使用系统环境的第三方软件包,可以在创建虚拟环境时使用参数–system-site-packages

可以自己指定虚拟环境所使用的 Python 版本,前提系统中已经安装了该版本:

virtualenv -p /usr/bin/python2.7 venv

使用虚拟环境
进入虚拟环境目录,启动虚拟环境。

source venv/bin/activate

看到(venv)表示已经进入虚拟环境。
虚拟环境标识

退出虚拟环境:

deactivate

如果项目开发完成后想删除虚拟环境,直接删除虚拟环境目录即可。

安装Django

在虚拟环境中执行命令即可:

pip install django

本次重点介绍Django如何上线部署,Django相关知识不做具体介绍。
新建Django项目:

django-admin startproject 项目名

安装uwsgi

在虚拟环境中执行命令即可:

pip install uwsgi

现在重点来啦,上面那么多都只是基本的环境配置。下面的是知识点,部分也是难点,笔者在这个地方被困了很久,所以一定要弄得时候写个博文记录下来。

配置uwsgi

当前目录下创建test.py文件

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return "Hello World" #国际惯例,helloworld

运行代码:

uwsgi --http :9111 --wsgi-file test.py

报错:

-bash: uwsgi: command not found

遇到这个情况怎么办?肯定不能放弃,干就行啦。
通过pip安装的组件,执行命令文件在python源目录下的bin目录中,所以解决方案:
执行命令:

ln -s /your-python-dir/bin/* /usr/bin/*

*代表你你需要添加的执行命令uwsgi,故障排除,然后继续执行:

uwsgi --http 0:8000 --wsgi-file test.py

成功后提示:

*** Starting uWSGI 2.0.17.1 (64bit) on [Fri Nov 23 12:12:30 2018] ***
compiled with version: 4.8.5 20150623 (Red Hat 4.8.5-28) on 22 November 2018 09:21:34
os: Linux-3.10.0-514.26.2.el7.x86_64 #1 SMP Tue Jul 4 15:04:05 UTC 2017
nodename: iZhp31ku43vn2fbp1dk355Z
machine: x86_64
clock source: unix
pcre jit disabled
detected number of CPU cores: 1
current working directory: /home/ruanfumin
detected binary path: /usr/local/python3/bin/uwsgi
*** WARNING: you are running uWSGI without its master process manager ***
your processes number limit is 1880
your memory page size is 4096 bytes
detected max file descriptor number: 65535
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
uWSGI http bound on 0:8000 fd 4
spawned uWSGI http 1 (pid: 11058)
uwsgi socket 0 bound to TCP address 127.0.0.1:34451 (port auto-assigned) fd 3
Python version: 3.6.1 (default, Nov 22 2018, 17:05:27)  [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)]
*** Python threads support is disabled. You can enable it with --enable-threads ***
Python main interpreter initialized at 0xaa2120
your server socket listen backlog is limited to 100 connections
your mercy for graceful operations on workers is 60 seconds
mapped 72920 bytes (71 KB) for 1 cores
*** Operational MODE: single process ***
WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0xaa2120 pid: 11057 (default app)
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI worker 1 (and the only) (pid: 11057, cores: 1)

访问一下IP地址,本机就是127.0.0.1:8000,服务器就是服务器ip:8000
浏览器看到:
Hello World
终端会提示:

[pid: 11057|app: 0|req: 1/1] 183.206.12.47 () {42 vars in 829 bytes} [Fri Nov 23 12:13:17 2018] GET / => generated 11 bytes in 0 msecs (HTTP/1.1 200) 1 headers in 44 bytes (1 switches on core 0)

表明uwsgi配置ok,咱继续

直接使用Django跑一下项目,看能不能运行成功,由于Django是在阿里云服务器上,所以项目设置文件settings.py需要修改一下。

ALLOWED_HOSTS = ['*']

酱紫就可以访问了。咱跑一下试试:

python manage.py runserver 0:8000

Django成功运行

使用Uwsgi 跑 django项目

在项目(新建的测试项目testproject)路径下,执行:

uwsgi --http 0:8000 --module testproject.wsgi

解释:
--http 0:8000携带这个参数表明可以http访问,端口号是8000。
--module testproject.wsgi指定Django项目的wsgi文件。
参考Django官方文档:

uwsgi --chdir=/path/to/your/project \
    --module=mysite.wsgi:application \
    --env DJANGO_SETTINGS_MODULE=mysite.settings \
    --master --pidfile=/tmp/project-master.pid \
    --socket=127.0.0.1:49152 \      # can also be a file
    --processes=5 \                 # number of worker processes
    --uid=1000 --gid=2000 \         # if root, uwsgi can drop privileges
    --harakiri=20 \                 # respawn processes taking more than 20 seconds
    --max-requests=5000 \           # respawn processes after serving 5000 requests
    --vacuum \                      # clear environment on exit
    --home=/path/to/virtual/env \   # optional path to a virtualenv
    --daemonize=/var/log/uwsgi/yourproject.log      # background the process

再次访问:http://39.104.91.28:8000/
发现还是成功辣,真好。
终端显示图

在项目目录下新建uwsgi.ini文件,可以参考官方文档

[uwsgi]
#chidr用于指定自己的网站根目录(自行更改)
chdir =  /var/www/testproject
#module指定网站中APP的文件(自行更改)
module = testproject.wsgi
#home用于指定python的虚拟环境,即我们最初创建的虚拟环境位置(自行更改)
home = /var/www/venv
#master不用更改
master = true
#socket用于指定端口号,可以不更改
socket = :8000
#以下两个可以不用更改
chmod-socket = 666

文件里我们指定socket,让Nginx服务器通过这个socket处理uwsgi。

Nginx安装:
这个不细说了,直接yum命令就好:

yum install nginx

Nginx配置修改

进入Nginx配置目录,在/etc/nginx/下:
Nginx配置目录
我们修改nginx.conf文件:

upstream django_test { #加上_test,因为和原来的冲突了,这里备注下
    # server unix:///path/to/your/mysite/mysite.sock; # for a file socket
    server 127.0.0.1:8000; # for a web port socket (we'll use this first) 类似uwsgi端口
}

    server {
        listen       80;
        server_name  ruanfumin;


        location / {
            include uwsgi_params;
            uwsgi_pass django_test;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
        location /static {
        alias /var/www/first/static; # 加载你的静态文件
    }

    }

修改完,保存,重启Nginx服务器,然后再到Django项目目录下启动uwsgi服务:

uwsgi --ini uwsgi.ini

浏览器输入url访问:39.104.91.28:80
当然这次是80端口访问了,因为Nginx我们设置的嘛,你可以随意修改。
80端口访问成功图

注:

相关文章
|
18天前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
|
1月前
|
应用服务中间件 nginx Docker
本地通过域名访问虚拟机上nginx的服务、搭建域名访问环境一(反向代理配置)
这篇文章介绍了如何通过域名在本地访问虚拟机上的nginx服务,包括创建nginx容器、修改配置文件、修改本地host文件以及进行访问测试的详细步骤。文章提供了具体的Docker命令来创建并配置nginx容器,展示了配置文件的修改示例,说明了如何在本地系统的hosts文件中添加虚拟机IP和自定义域名,以及如何通过浏览器进行测试访问。
本地通过域名访问虚拟机上nginx的服务、搭建域名访问环境一(反向代理配置)
|
26天前
|
负载均衡 应用服务中间件 网络安全
Django后端架构开发:Nginx服务优化实践
Django后端架构开发:Nginx服务优化实践
36 2
|
1月前
|
消息中间件 负载均衡 应用服务中间件
高并发环境下的Nginx整合方案
【8月更文挑战第20天】在高并发环境下,整合Nginx代理服务器、静态文件服务器、Tomcat集群、Mycat数据库读写分离和消息队列,可以构建一个强大、灵活且可扩展的Web服务架构。
29 1
|
27天前
|
应用服务中间件 Linux PHP
【Azure 应用服务】App Service For Linux 环境中,如何修改 Nginx 配置中 server_name的默认值 example.com
【Azure 应用服务】App Service For Linux 环境中,如何修改 Nginx 配置中 server_name的默认值 example.com
|
27天前
|
前端开发 JavaScript Linux
【Azure 应用服务】在Azure App Service for Linux环境中,部署的Django应用,出现加载css、js等静态资源文件失败
【Azure 应用服务】在Azure App Service for Linux环境中,部署的Django应用,出现加载css、js等静态资源文件失败
|
30天前
|
应用服务中间件 Linux PHP
Linux搭建tengine2.0<Nginx>+php7环境
本文介绍了在Linux系统上搭建Tengine 2.0(一个Nginx的增强版本)和PHP 7环境的详细步骤,包括创建安装目录、下载源码包及依赖库、编译安装Nginx、配置Nginx、安装PHP及其依赖、设置PHP-FPM、配置环境变量、安装Git和Composer,以及服务管理和日志查看等。
51 0
|
1月前
|
关系型数据库 应用服务中间件 数据库
如何安装和配置 Django 与 Postgres、Nginx 和 Gunicorn
如何安装和配置 Django 与 Postgres、Nginx 和 Gunicorn
15 0
|
3月前
|
安全 Ubuntu 应用服务中间件
NGINX环境下实现Web网站访问控制的实战指南
在NGINX中设置基于IP的访问控制可提升网站安全性。步骤包括安装NGINX、备份配置文件、编辑`/etc/nginx/sites-available/default`,添加`allow`和`deny`指令限制特定IP访问,如`allow 192.168.1.100; deny all;`,然后测试配置并重启服务。成功后,仅允许的IP能访问网站,否则会收到403错误。这为Web安全提供基础保障,还可扩展实现更多高级控制策略。【6月更文挑战第20天】
292 3
|
3月前
|
Linux Shell
Linux配置uwsgi环境
Linux配置uwsgi环境