TranslateProject/translated/tech/20170205 Hosting Django With Nginx and Gunicorn on Linux.md

6.9 KiB
Raw Blame History

在Linux上使用Nginx和Gunicorn托管Django

内容

介绍

托管Django Web应用程序相当简单虽然它比标准的PHP应用程序更复杂一些。 处理带Web服务器的Django接口的方法有很多。 Gunicorn就是其中最简单的一个。

GunicornGreen Unicorn的缩写在你的Web服务器Django之间作为中间服务器使用在这里Web服务器就是Nginx。 Gunicorn服务于应用程序而Nginx处理静态内容。

Gunicorn

安装

使用Pip安装Gunicorn是超级简单的。 如果你已经使用virtualenv搭建好了你的Django项目那么你就有了Pip并且应该熟悉Pip的工作方式。 所以在你的virtualenv中安装Gunicorn。

$ pip install gunicorn

配置

Gunicorn 最有吸引力的一个地方就是它的配置非常简单。处理配置最好的方法就是在Django项目的根目录下创建一个名叫Gunicorn的文件夹。然后 在该文件夹内,创建一个配置文件。

在本篇教程中,配置文件名称是gunicorn-conf.py。在改文件中,创建类似于下面的配置

import multiprocessing

bind = 'unix:///tmp/gunicorn1.sock'
workers = multiprocessing.cpu_count() * 2 + 1
reload = True
daemon = True

在上述配置的情况下Gunicorn会在/tmp/目录下创建一个名为gunicorn1.sock的Unix套接字。 还会启动一些工作进程进程数量相当于CPU内核数量的2倍。 它还会自动重新加载并作为守护进程运行。

运行

Gunicorn的运行命令有点长指定了一些附加的配置项。 最重要的部分是将Gunicorn指向你项目的.wsgi文件。

gunicorn -c gunicorn/gunicorn-conf.py -D --error-logfile gunicorn/error.log yourproject.wsgi

上面的命令应该从项目的根目录运行。 Gunicorn会使用你用-c选项创建的配置。 -D再次指定gunicorn为守护进程。 最后一部分指定Gunicorn的错误日志文件在Gunicorn文件夹中的位置。 命令结束部分就是为Gunicorn指定.wsgifile的位置。

Nginx

现在Gunicorn配置好了并且已经开始运行了你可以设置Nginx连接它为你的静态文件提供服务。 本指南假定你已经配置了Nginx而且你通过它托管的站点使用了单独的服务块。 它还将包括一些SSL信息。

如果你想知道如何让你的网站获得免费的SSL证书请查看我们的LetsEncrypt指南

# 连接到Gunicorn
upstream yourproject-gunicorn {
    server unix:/tmp/gunicorn1.sock fail_timeout=0;
}

# 将未加密的流量重定向到加密的网站
server {
    listen       80;
    server_name  yourwebsite.com;
    return       301 https://yourwebsite.com$request_uri;
}

# 主服务块
server {
	# 设置监听的端口,指定监听的域名
    listen 443 default ssl;
    client_max_body_size 4G;
    server_name yourwebsite.com;

	# 指定日志位置
    access_log /var/log/nginx/yourwebsite.access_log main;
    error_log /var/log/nginx/yourwebsite.error_log info;

	# 将nginx指向你的ssl证书
    ssl on;
    ssl_certificate /etc/letsencrypt/live/yourwebsite.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourwebsite.com/privkey.pem;

	# 设置根目录
	root /var/www/yourvirtualenv/yourproject;

	# 为Nginx指定静态文件路径
    location /static/ {
		# Autoindex the files to make them browsable if you want
        autoindex on;
        # The location of your files
        alias /var/www/yourvirtualenv/yourproject/static/;
		# Set up caching for your static files
        expires 1M;
        access_log off;
        add_header Cache-Control "public";
        proxy_ignore_headers "Set-Cookie";
    }

	# 为Nginx指定你上传文件的路径
    location /media/ {
		Autoindex if you want
        autoindex on;
        # The location of your uploaded files
        alias /var/www/yourvirtualenv/yourproject/media/;
		# Set up aching for your uploaded files
        expires 1M;
        access_log off;
        add_header Cache-Control "public";
        proxy_ignore_headers "Set-Cookie";
    }

	location / {
        # Try your static files first, then redirect to Gunicorn
        try_files $uri @proxy_to_app;
    }

	# 将请求传递给Gunicorn
    location @proxy_to_app {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_pass   http://njc-gunicorn;
    }

	# 缓存HTMLXML和JSON
    location ~* \.(html?|xml|json)$ {
        expires 1h;
    }

	# 缓存所有其他的静态资源
    location ~* \.(jpg|jpeg|png|gif|ico|css|js|ttf|woff2)$ {
        expires 1M;
        access_log off;
        add_header Cache-Control "public";
        proxy_ignore_headers "Set-Cookie";
    }
}

配置文件有点长,但是还可以更长一些。其中重点是指向 Gunicorn 的upstream块以及将流量传递给 Gunicorn 的location块。大多数其他的配置项都是可选,但是你应该按照一定的形式来配置。配置中的注释应该可以帮助你了解具体细节。

保存文件之后你可以重启Nginx让修改的配置生效。

# systemctl restart nginx

一旦Nginx在线生效你的站点就可以通过域名访问了。

结语

如果你想深入研究Nginx可以做很多事情。但是上面提供的配置是一个很好的开始并且你可以用于实践中。 如果你习惯于Apache和臃肿的PHP应用程序像这样的服务器配置的速度应该是一个惊喜。


via: https://linuxconfig.org/hosting-django-with-nginx-and-gunicorn-on-linux

作者:Nick Congleton 译者:Flowsnow 校对:校对者ID

本文由 LCTT 原创编译,Linux中国 荣誉推出