阿里云ubuntu系统下使用uwsgi+nginx部署django web项目示例

1. 准备工作

首先更新软件

sudo apt-get upgrade

安装虚拟环境

sudo apt-get install python-virtualenv

安装nginx

sudo apt-get install nginx

安装uwsgi

1.先导步骤:
sudo apt-get install python-dev 
sudo apt-get install python3.5-dev
2.安装
sudo pip3 install uwsgi
或者:
sudo pip3 install https://projects.unbit.it/downloads/uwsgi-lts.tar.gz

2. 添加新用户

用root运行uwsgi是不推荐的,推荐的做法是创建一个用户组,再往里面添加一个新用户

创建用户组

组名为:webapps

sudo groupadd --system webapps

创建用户

用户名为:user_test

sudo useradd --system --gid webapps --shell /bin/bash --home /webapps/test user_test

设置密码为:test

passwd test

创建用户目录

mkdir -p /webapps/test

修改目录权限,下面的命令意思是:使/webapps/test/这个目录属于user_test这个用户

chown user_test /webapps/test/

添加用户user_test sudo权限
在/etc/sudoers添加
使用命令vim /etc/sudoers打开/etc/sudoers
在里面添加下面这一句:

user_test ALL=(ALL:ALL) ALL

如下图:
这里写图片描述

3. 开始创建应用

切换用户为:user_test

su - user_test

切换用户
可以看出当前用户的主目录为/webapps/test

这是因为我们创建用户时使用的命令sudo useradd --system --gid webapps --shell /bin/bash --home /webapps/test user_test ,其中--home /webapps/test指定了用户主目录为/webapps/test

4. 创建python虚拟环境

这里指定为3.5版本,并激活
在/webapps/test下执行命令:

virtualenv -p /usr/bin/python3.5 .

注意最后一个哦,它指的是在当前目录下创建。执行后的结果(我之前已经执行过了,所以就不再执行了,直接列出来结果吧)
创建虚拟环境
图中画红线的就是生成的虚拟环境内容,那个mysite是我后来创建的文件夹,先不用管它,下面会说到它的。

激活环境

使用下面的命令:

source bin/activate

结果如下图
激活虚拟环境
前面出现了括号,里面的test也就是当前虚拟环境的目录名,也可以说当前的虚拟环境名为test。

那么怎么退出呢?

很easy啦~

执行命令:deactivate就好了~如下图:
退出虚拟环境

安装django

注意:在进入到虚拟环境的状态下安装哦~

pip install django

创建django工程mysite

django-admin startproject mysite

创建应用app

1 进入mysite目录

cd mysite

2 创建app

django-admin startapp app

修改mysite/settings.py

要做三件事:
1 将外网ip添加到ALLOWED_HOSTS

修改setting.py
这里我的外网IP是106.14.125.141,你要换成你的。
外网IP是啥?这都不知道?就是你买的阿里云服务器分配的啊。
查看公网IP
2 在INSTALLED_APPS里追加 ‘app’
追加app
3 新建app/static目录 ,然后在mysite/settings.py里添加STATIC_ROOT

进入app目录

cd app

创建static文件夹

mkdir static

退回上一层目录,也就是mysite下

cd ../

然后在setting.py末尾,添加下面代码

STATIC_ROOT = os.path.join(BASE_DIR, 'app', 'static')

添加STATIC_ROOT
接下来是一系列命令:

收集静态文件到app/static目录

python manage.py collectstatic

迁移数据库

python manage.py migrate

创建后台管理用户

python manage.py createsuperuser

会让你起个名字,设个密码

添加视图函数,在app/views.py添加

from django.http import HttpResponse
def index(request):
    return HttpResponse('<h1>Hello World!</h1>')

修改mysite/urls.py为:

from django.contrib import admin
from django.urls import path
from app import views
from django.conf.urls import url

urlpatterns = [
    url('admin/', admin.site.urls),
    url(r'^$', views.index),
]

测试django应用运行是否正常

python manage.py runserver

再打开一个连接窗口,输入curl 127.0.0.1:8000测试是否能访问
正常会输出<h1>Hello World!</h1>

然后,按Ctrl C 退出

4. 配置ngnix

https://github.com/nginx/nginx/blob/master/conf/uwsgi_params下载到/etc/nginx/conf/目录

/etc/nginx下应该是没有conf这个文件夹,如果没有,那就创建它!

或者,不下载也可以,我把它的内容贴出来吧~

uwsgi_param  QUERY_STRING       $query_string;
uwsgi_param  REQUEST_METHOD     $request_method;
uwsgi_param  CONTENT_TYPE       $content_type;
uwsgi_param  CONTENT_LENGTH     $content_length;

uwsgi_param  REQUEST_URI        $request_uri;
uwsgi_param  PATH_INFO          $document_uri;
uwsgi_param  DOCUMENT_ROOT      $document_root;
uwsgi_param  SERVER_PROTOCOL    $server_protocol;
uwsgi_param  REQUEST_SCHEME     $scheme;
uwsgi_param  HTTPS              $https if_not_empty;

uwsgi_param  REMOTE_ADDR        $remote_addr;
uwsgi_param  REMOTE_PORT        $remote_port;
uwsgi_param  SERVER_PORT        $server_port;
uwsgi_param  SERVER_NAME        $server_name;

切换到/etc/nginx

cd /etc/nginx

创建conf文件夹

mkdir conf

进入conf

cd conf

创建uwsgi_params文件

vim uwsgi_params

然后,把上面的代码复制进去,保存退出。

然后呢,回到mysite目录下

新建test_nginx.conf文件,内容如下

# the upstream component nginx needs to connect to
upstream testapp {
    #server unix:///webapps/test/mysite/mysite.sock; # for a file socket
    server 127.0.0.1:8000; # for a web port socket (we'll use this first)
}

# configuration of the server
server {
    # the port your site will be served on
    listen      80;
    # the domain name it will serve for
    server_name localhost; # substitute your machine's IP address or FQDN
    charset     utf-8;

    # max upload size
    client_max_body_size 75M;   # adjust to taste
    access_log      /webapps/test/mysite/nginx_access.log;
    error_log       /webapps/test/mysite/nginx_error.log;

    # Django media
    location /media  {
        alias /webapps/test/mysite/app/media;  # your Django project's media files - amend as required
    }

    location /static {
        alias /webapps/test/mysite/app/static; # your Django project's static files - amend as required
    }

    # Finally, send all non-media requests to the Django server.
    location / {
        uwsgi_pass  testapp;
        include     /etc/nginx/conf/uwsgi_params; # the uwsgi_params file you installed
    }
}

注意!

listen 80的意思是,从浏览器访问服务器时的端口是80
server 127.0.0.1:8000;是nginx到wsgi的连接地址,这个必须和wsgi.ini里面的socket = 127.0.0.1:8000一致!

test_nginx.conf链接到/etc/nginx/sites-enabled/目录

sudo ln -s /webapps/test/mysite/test_nginx.conf /etc/nginx/sites-enabled/

记得删除自带的default文件,可以到/etc/nginx/sites-enabled/目录下看一看
这里写图片描述
可以看到该目录下已经出现了test_nginx.conf这个文件,而且原来的default文件我已经删除了。删除命令很简单,就是rm命令

sudo rm default

把用户www-data加到webapps用户组

sudo usermod -a -G webapps www-data

重启ngnix

sudo /etc/init.d/nginx stop 
sudo /etc/init.d/nginx start

5. 配置uwsgi

mysite也就是django项目根目录下新建wsgi.ini启动文件,通过这个文件来启动django项目。

[uwsgi]
socket = 127.0.0.1:8000
chdir=/webapps/test/mysite
module=mysite.wsgi
master = true
processes=2
threads=2
max-requests=2000
chmod-socket=664
vacuum=true
daemonize = /webapps/test/mysite/uwsgi.log
virtualenv = /webapps/test
gid=webapps
uid=user_test
stats=/webapps/test/mysite/uwsgi.status
pidfile=/webapps/test/mysite/uwsgi.pid

注意!

socket = 127.0.0.1:8000为wsgi的入口,必须与test_nginx.conf中的server 127.0.0.1:8000;一致
chdir=/webapps/test/mysite :django项目的路径
module=mysite.wsgi :django项目中的wsgi.py
daemonize = /webapps/test/mysite/uwsgi.log :日志路径
virtualenv = /webapps/test 虚拟环境路径
stats=/webapps/test/mysite/uwsgi.status:记录状态的文件
pidfile=/webapps/test/mysite/uwsgi.pid:记录线程的文件,可用于停止uwsgi

运行uwsgi

uwsgi --ini wsgi.ini

用浏览器访问外网ip,你会发现!!!amazing~终于出来了!我的Hello world!
鸡冻不鸡冻~
我搞了快两天,各种错误,各种重装,各种百度,啊啊啊啊,快要崩溃了。。。
最后终于搞出来了QAQ
hello world
这时候,你的mysite目录下应该是这样的:
mysite目录
项目是启动了,如何停止呢?
输入命令

uwsgi --stop uwsgi.pid

停止项目
再访问外网IP试试?
这里写图片描述
OK !停止了,这是一种好的停止方式。
如果不会的话,(怎么会不会,会了不难,不会的难死,我找了好多资料才找到的。。)停止线程也可以。

查看线程号

cat uwsgi.pid

显示uwsgi的线程号
查看线程号
用ps命令再看看当前线程程:
ps查看线程号
证明这个线程号确实是uwsgi的。可以用命令kill -9 2233杀死它,但是不太好吧,还是上面的uwsgi --stop uwsgi.pid这种方式停止uwsgi比较好。。。

啊啊啊好了,终于完了~

参考文章:
https://blog.csdn.net/abc_1234d/article/details/77717523
https://blog.csdn.net/lileihappy/article/details/79580291

展开阅读全文

没有更多推荐了,返回首页