>백엔드 개발 >PHP 튜토리얼 >uWSGI와 nginx를 사용하여 Django 프로젝트를 빌드하는 방법

uWSGI와 nginx를 사용하여 Django 프로젝트를 빌드하는 방법

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB원래의
2016-07-30 13:31:531090검색

머리말:

nginx와 uWSGI는 Django 배포에 좋은 선택이지만, 이것들만 모두 교체 가능하고 다른 시도도 환영합니다.

배경 지식에 대한 간략한 소개:

1. WSGI는 웹 서버 게이트웨이 인터페이스입니다. 웹 서버(예: nginx)와 애플리케이션 서버(예: uWSGI 서버) 간의 통신을 위한 사양입니다.

2. uWSGI WSGI, uwsgi, http 및 기타 프로토콜을 구현합니다.

3. Nginx는 고성능 HTTP 및 역방향 프록시 서버입니다(저희는 정적 파일 요청을 효율적으로 처리하는 능력 때문에 Nginx를 사용합니다)

4. Django는 MVC 디자인 패턴을 채택한 오픈 소스 웹 애플리케이션 프레임워크입니다.

5. 프로세스간 통신을 구현하기 위해 소켓을 사용합니다.

대략 우리가 사용해야 할 컴포넌트 소개 후, 빌드 단계를 자세히 설명해드립니다. (처음에 잘 읽어보시고 꼭 맞게 해주세요)

마지막 완료해야 하는 작업은 기본적으로 다음과 같습니다.

클라이언트(웹 요청용) - 서버(여기서는 nginx가 사용됨) - 소켓(자동 생성된 통신 파일) - uwsgi - Django

다음 콘텐츠 중 대부분은 http://uwsgi-docs.readthedocs.org/en/latest/tutorials/Django_and_nginx.html#configuring-uwsgi-to-run-에서 제공됩니다. with-a-ini-file

uWSGI 설치 및 기본 구성:

pip 패키지 관리 도구를 사용하여 uWSGI를 설치합니다.

sudo pip install uwsgi

아직 pip가 없다면 설치하세요:

켜기 Debian 및 Ubuntu 시스템 사용:

sudo apt-get install python-pip
Fedora 및 CentOS 시스템에서 사용:
sudo yum install python-pip
uwsgi의 pip 설치 중에 다음과 같은 종속성이 있다는 메시지가 표시되는 경우 설치되지 않음:

Debian 및 Ubuntu:

apt-get groupinstall "개발 도구"

apt-get python-devel 설치

Fedora 및 CentOS:

yum groupinstall "개발 도구"

yum install -y python-devel

기본 테스트

테스트 파일 test.py 만들기:

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return ["Hello World"] # python2
    #return [b"Hello World"] # python3

uWSGI 실행

uwsgi --http :8000 --wsgi-file test.py
코드의 의미는 http 프로토콜, 포트 8000을 사용하여 테스트 파일을 로드한다는 것입니다. 모든 것이 괜찮다면 다음을 방문하세요:

http://127.0.0.1:8000/ (콜론은 영어 콜론임을 참고)

익숙하고 귀여운 헬로월드. 이는 또한 클라이언트-uWSGI-Python 간의 브리지를 열었음을 보여줍니다.

test.py를 Django 프로젝트로 교체

먼저 프로젝트 자체가 정상적으로 실행되는지 확인하고 터미널 디렉토리에 프로젝트를 입력하세요. 을 입력한 후

python manage.py runserver 0.0.0.0:8000
정상적으로 실행될 수 있으면 중지하고 다음 코드를 실행하고 nidegongchenming을 프로젝트 이름으로 변경합니다.

uwsgi --http :8000 --module nidegongchenming.wsgi
모듈 *.wsgi는 wsgi 모듈을 로드하는 것을 의미합니다. 이 모듈이 이미 있으므로 안심하세요.

이제 클라이언트-uWSGI-Django 사이에 브리지가 열렸습니다. 축하합니다.

Django 프로젝트 이름이 abc라면 전체 내용을 /var/www/에 복사하는 것이 좋습니다. 그런 다음 프로젝트의 Manage.py 파일이 /var/www/abc/에 있으므로 파일 권한으로 인해 서비스를 제공할 수 없는 일부 문제를 피할 수 있습니다.

알겠습니다. 서비스를 중지하고 계속 진행하겠습니다.

nginx 설치 및 기본 구성:

nginx 설치

Ubuntu 및 Debian:

sudo apt-get install nginx
sudo /etc/init.d/nginx start
Fedora 및 CentOS
sudo yum install nginx
sudo service nginx start
Fedora에서 서비스 nginx start는 systemctl start nginx.service로 리디렉션됩니다.

모든 것이 정상인 경우(기본 포트 80이 사용되지 않음) 브라우저에서 127.0.0.1에 액세스하면 "Welcome to nginx on XXX"가 표시됩니다.

이제 브리지는 다음과 같습니다: 클라이언트 - 서버(nginx)

포트가 Apache나 다른 것에 의해 점유된 경우 nginx 서비스를 성공적으로 시작할 수 없습니다. 상관없습니다. , 다른 포트에서 수신 대기하도록 nginx를 구성하는 방법을 소개하겠습니다.

nginx 구성

먼저 uwsgi_params 파일이 필요합니다. 예를 들어 내 파일은 /에 있습니다. etc/nginx/, 물론 못찾으시면 https://github.com/nginx/nginx/blob/master/conf/uwsgi_params 에 가셔서 복사하시거나, 다음 내용을 복사하셔도 됩니다.

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  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;

파일 이름은 접미사 없이 uwsgi_params입니다. Django 프로젝트의 Manage.py와 동일한 디렉터리에 넣으세요. 다음으로 nginx를 구성하고 uwsgi_params 파일을 참조하도록 지시합니다.

Django 프로젝트 디렉터리로 이동하여 mysite_nginx.conf 파일을 만들고 다음을 입력합니다.

# mysite_nginx.conf

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

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

    # max upload size
    client_max_body_size 75M;   # adjust to taste

    # Django media
    location /media  {
        alias /path/to/your/mysite/media;  # your Django project's media files - amend as required
    }

    location /static {
        alias /path/to/your/mysite/static; # your Django project's static files - amend as required
    }

    # Finally, send all non-media requests to the Django server.
    location / {
        uwsgi_pass  django;
        include     /path/to/your/mysite/uwsgi_params; # the uwsgi_params file you installed
    }
}
这个文件中的内容我保留了英文文档中的注释,比较详细,可能会对你有一些意外的帮助。

server{}中的server_name可以接IP地址,比如:server_name  219.242.174.48,测试的话用你本机的吧,搭好了之后方便在同网段内使用其它机器测试。

这份配置文件告诉nginx从文件系统中建立媒体和静态文件服务,同时也处理Django应用中的请求。对于大型的部署而言,让一个服务器处理静态/媒体文件,另一个处理Django应用,会有很好的表现。不过现在,我们这么做也没问题。

然后执行下面的命令,让nginx知道有这么一个配置文件:

sudo ln -s mysite_nginx.conf /etc/nginx/sites-enabled/

部署静态文件

在运行nginx之前,必须把所有的Django静态文件收集到一个静态文件夹中,首先在settings.py中写入:

STATIC_ROOT = os.path.join(BASE_DIR, "static/")

然后运行

python manage.py collectstatic

基本nginx测试

重启nginx服务

Ubuntu,Debian:

sudo /etc/init.d/nginx restart
Fedora,CentOS:
sudo service nginx restart
或者
systemctl restart nginx.service

为了测试我们是不是可以提供访问媒体文件的服务,找张图片比如"abc.png",放到你的Django工程中的媒体目录下,比如/var/www/project/project/media。然后访问http://127.0.0.1:8000/media/abc.png,如果有问题,需要先停止nginx(上面命令中restart改成stop),再启动。这样我们能得到一些提示信息,以便找出问题在哪。

nginx和uWSGI以及test.py的沟通

uwsgi --socket :8001 --wsgi-file test.py
前面nginx已经被设置好在8001端口与uWSGI通信,同时在外界服务被布置在8000端口,访问:http://127.0.0.1:8000/

如果能看到Hell World,说明我们打通的桥梁变成:

客户端(浏览器)——服务器(nginx)——socket——uWSGI——python

同时你也可以访问http://127.0.0.1:8001/,看看uWSGI的反应,暂不剧透……

到现在我们都是在使用TCP port socket,这样开始的时候会容易些,不过实际上使用Unix sockets 会更好些,会有较小的开销。

编辑我们刚才的nginx配置文件mysite_nginx.conf,做以下更改:

server unix:///path/to/your/mysite/mysite.sock; # for a file socket
# server 127.0.0.1:8001; # for a web port socket (we'll use this first)
重启nginx,

停下刚才的uWSGI服务,输入以下命令重新开启:

uwsgi --socket mysite.sock --wsgi-file test.py
mysite.sock文件会被自动建立,用做通信,你可以当它是个临时文件。当然不喜欢这个文件名,你也可以更改。用浏览器再访问一次8000端口,看看结果。

如果服务没能正常运行,查看一次啊nginx的错误日志,在/var/log/nginx/error.log。如果错误日志像是这样:

connect() to unix:///path/to/your/mysite/mysite.sock failed (13: Permission
denied)
那可能需要更改socket的权限,以便nginx可以使用它。

试一下:

uwsgi --socket mysite.sock --wsgi-file test.py --chmod-socket=666 # (very permissive)
或者:
uwsgi --socket mysite.sock --wsgi-file test.py --chmod-socket=664 # (more sensible)
可能你还需要把当前用户加入nginx用户组,反之也需要把nginx加入你当前用户的用户组。这样nginx应该就有权限访问socket文件了。

激动人心的时候要到了

现在我们可以尝试一下用uwsgi和nginx来运行我们的Django应用了。

在工程目录下运行:

uwsgi --socket mysite.sock --module mysite.wsgi --chmod-socket=664
注意mysite.wsgi要改成你的工程名。

现在应该在浏览器中能看到你的工程了。

用ini文件来配置uWSGI

创建一个文件命名为'mysite_uwsgi.ini'

# mysite_uwsgi.ini file
[uwsgi]

# Django-related settings
# the base directory (full path)
chdir           = /path/to/your/project
# Django's wsgi file
module          = project.wsgi
# the virtualenv (full path)
# home            = /path/to/virtualenv

# process-related settings
# master
master          = true
# maximum number of worker processes
processes       = 10
# the socket (use the full path to be safe
socket          = /path/to/your/project/mysite.sock
# ... with appropriate permissions - may be needed
# chmod-socket    = 664
# clear environment on exit
vacuum          = true
如果你使用了virtualenv,home那个位置就不能注释掉。

以后再运行 uswgi就可以使用:

uwsgi --ini mysite_uwsgi.ini
进一步我们还可以让uWSGI运行在上帝模式,设置开机自动启动以及限制最大访问,工程文件大小之类的配置。

去吃饭了

这些内容我可能会在下一篇博客里写,想先了解的同学请移步:http://uwsgi-docs.readthedocs.org/en/latest/tutorials/Django_and_nginx.html#configuring-uwsgi-to-run-with-a-ini-file
这个文档相当全面,而且重要的是没有拼写错误这种情况。







版权声明:本文为博主原创文章,未经博主允许不得转载。

以上就介绍了如何用uWSGI和nginx来搭建Django工程,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.