Django(八)部署项目到服务器nginx和uwsgi配置

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/youand_me/article/details/79566635

简介

  在配置部署前先简单描述一下nginx和uWSGI,只是个人学习和理解的,有不对的地方还望指出。
  

  • nginx:

      nginx是一个反向代理服务器,客户端对Web服务器的访问需要先经过反向代理服务器,再由代理服务器决定目标服务器,这样可以防止外部程序对Web服务器的直接攻击;其次可根据负载情况去请求不同的目标服务器达到负载均衡;还有可以知己处理客户端对于静态文件的请求,而不用在去请求目标服务器。

  • uWSGI:

      一个服务器或中间件,其实现了uwsgi协议,请求应用程序并返回处理后的信息。

      uWSGI是可以完成所有和浏览器的交互过程的,但是还是要使用nginx的原因就是上面讲的nginx的功用,一个uwsgi很可能不够用,即使开了多个process和thread也是不行,毕竟一台机器的cpu和内存都是有限的,有了nginx做代理,一个nginx可以代理多台uwsgi实现负载均衡的。

安装nginx和uwsgi

首先我是基于python3的,ubuntu版本为16.04,你想配置python3的话需先安装python3和pip3,然后执行如下命令安装:

sudo apt-get install nginx
sudo pip3 install uwsgi

  如果没有报错基本就安装成功了,这里就不再做测试。细心点会发现nginx是用apt-get安装的,而uwsgi是用pip3,原因就是uwsgi是pyhon包,而nginx是一个类似sql的服务,也就是说nginx可以开机启动,不手动关闭或者关闭服务器是不会停止的。
  我们想把项目部署到服务器上就必须使用它,假设我们在本地连接上了我们购买的服务器(远程),然后使用uwsgi拉起我们的项目(后面讲解怎么拉起项目),这时候我们就能通过外网访问了,但是一旦本地的机器断开与服务器的连接后就无法访问了。原因就是用uwsgi拉起项目只是在服务器端创建了一个进程,而这个进程是远程连接的子进程,远程连接断开子进程也就结束了。所以我们需要通过nginx来连接uwsgi,由于nginx是类似sql的服务,所以一旦开启就会一直在后台运行,只要服务器不关闭项目就处于运行状态。

项目上传及环境配置

首先找到你的本地Django项目,比如我的项目名为bsite,绝对路径为:/home/beau/bsite

bsite
    bsite
        __init__.py
        settings.py
        urls.py
        wsgi.py
    apps
        ...
    media
        ...
    static
        ...
    templates
        ...
    db.sqlite3
    manage.py

将项目上传到服务器:使用本地机器ctr+alt+t打开终端:

# 连接服务器,输入yes和密码进行连接,以下IP和名称改为你自己的,下述IP是我随意写的,只做样例,我真正使用的没有写出
ssh root@192.168.27.110
# 成功后创建项目上传目录
mkdir /var/project
注意:服务器上的项目不要放在root目录,放在root目录里在使用uwsgi的时候写入.socket会出现权限错误。其它目录都没问题。

ctr+c结束连接回到本机终端,进入项目所在目录:

# 注意需要ctr+c结束连接回到本机终端,进入项目所在目录
cd /home/beau/
# 上传项目@后为服务器的IP,需要先在服务器创建/var/project/目录(上面步骤已经做了)
sudo scp -r bsite root@192.168.27.110:/var/project/
cd /home/beau/

我们再连接到服务器,然后给服务器安装nginx、uwsgi、django、python、mysql,这些就不讲了。

配置nginx

打开本地的终端(ctr+alt+t),连接到服务器(ssh [email protected]),将uwsgi_params文件拷贝到项目文件夹下。uwsgi_params文件在/etc/nginx/目录下:

cp /etc/nginx/uwsgi_params /var/project/bsite
vim /etc/nginx/sites-enabled/default

修改default文件为:

# nginx需要连接的组件
upstream django {
    # server unix:///var/project/bsite/uwsgi.sock; # 文件socket
    server 0.0.0.0:8080; # 网络端口socket(我们先使用这个,8080代表在服务端项目在8080端口运行)
}
# 服务器配置
server {
    # 监听端口,通过域名加这个端口号(192.168.27.110:9999)就可访问项目,而不是8080端口
    listen   9999;
    server_name 192.168.27.110; 
    # 如果你有域名则配置如下,没有域名则配置你的服务器ip(如上)
    # listen   80;
    # server_name www.nginx.netcome.net; 
    charset     utf-8;

    # 最大上传大小
    client_max_body_size 75M;

    # Django的静态media文件路径
    location /media  {
        alias /var/project/bsite/media;
    }
    # Django的静态static文件路径
    location /static {
        alias /var/project/bsite/static;
    }
    # Django的项目配置
    location / {
        # uwsgi的方式使用上面upstream django的配置,先使用服务端口
        uwsgi_pass  django;
        include     /var/project/bsite/uwsgi_params; # 复制的 uwsgi_params路径
    }
}

保存然后开启nginx服务

/etc/init.d/nginx start

往/var/project/bsite/media里上传一张图片test.png(在本地使用sudo scp -r test.png [email protected]:/var/project/上传图片到服务器,需要先进入test.png图片的目录),然后访问http://192.168.27.110:9999/media/test.png查看到图片则成功:

配置uwsgi

如下连接到服务器,并进入项目目录,创建一个uwsgi.ini的配置文件

ssh root@192.168.27.110
cd /var/project/bsite
vim uwsgi.ini

然后填入以下内容(不会vim请查询)

注意目录,配置问题多半出在目录上
[uwsgi]
# 项目目录
chdir = /var/project/bsite/
# 指定项目的wsgi文件,我的项目是bsite所以为bsite.wsgi,你自己的对应改
module = bsite.wsgi:application
# 进程个数
workers = 5
pidfile = /var/project/bsite/uwsgi.pid
# 指定静态文件,指定在那里就使用哪里,必须和nginx的default文件里配置的路径一样(当然这个目录可以是随意的,在项目之外也可以,只要保证和nginx的静态文件路径一样就行)
static-map =/static=/var/project/bsite/static
# 启动uwsgi的用户名和用户组
uid=root
gid=root
# 启用主进程
master=true
# 自动移除unix Socket和pid文件当服务停止的时候
vacuum=true
# 序列化接受的内容,如果可能的话
thunder-lock=true
# 启用线程
enable-threads=true
# 设置自中断时间
harakiri=30
# 设置缓冲
post-buffering=4096
# 设置日志目录
daemonize=/var/project/bsite/uwsgi.log
# 指定sock的文件路径
socket=/var/project/bsite/uwsgi.sock

保存(esc + :wq)然后进入uwsgi.ini目录使用写好的uwsgi.ini配置:

cd /var/project/bsite/
uwsgi --ini uwsgi.ini
vim /etc/nginx/sites-enabled/default

然后你会在/var/project/bsite目录下看到生成的uwsgi.sock、uwsgi.pid、uwsgi.log文件:
接着修改default文件,将upstream django修改为如下(这里的server unix:///var/project/bsite/uwsgi.sock; # 文件socket一定和uwsgi那里配置的socket=/var/project/bsite/uwsgi.sock路径一样,nginx会使用uwsgi生成的.socket文件),其它保持不变:

# nginx需要连接的组件
upstream django {
    server unix:///var/project/bsite/uwsgi.sock; # 文件socket
    # server 0.0.0.0:8080;
}

重新启动项目:

cd /var/project/bsite/
uwsgi --reload uwsgi.pid
/etc/init.d/nginx restart

如果nginx配置的域名则访问:http://www.nginx.netcome.net/home(填写你的域名加上网站的首页路由),如果是服务器则访问:http://192.168.27.110:9999/home。这时你会看到你自己的首页,至此配置已经完成。

猜你喜欢

转载自blog.csdn.net/youand_me/article/details/79566635