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

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

WBOY
풀어 주다: 2016-07-30 13:31:53
원래의
1034명이 탐색했습니다.

머리말:

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教程有兴趣的朋友有所帮助。

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿