天天看点

在 Linux 上使用 Nginx 和 Gunicorn 托管 Django 应用

托管 django web 应用程序相当简单,虽然它比标准的 php 应用程序更复杂一些。 让 web 服务器对接 django 的方法有很多。 gunicorn 就是其中最简单的一个。

gunicorn(green unicorn 的缩写)在你的 web 服务器 django 之间作为中间服务器使用,在这里,web 服务器就是 nginx。 gunicorn 服务于应用程序,而 nginx 处理静态内容。

<a target="_blank"></a>

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

<code>$ pip install gunicorn</code>

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

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

<code>import multiprocessing</code>

<code></code>

<code>bind = 'unix:///tmp/gunicorn1.sock'</code>

<code>workers = multiprocessing.cpu_count() * 2 + 1</code>

<code>reload = true</code>

<code>daemon = true</code>

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

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

<code>gunicorn -c gunicorn/gunicorn-conf.py -d --error-logfile gunicorn/error.log yourproject.wsgi</code>

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

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

<code># 连接到 gunicorn</code>

<code>upstream yourproject-gunicorn {</code>

<code>server unix:/tmp/gunicorn1.sock fail_timeout=0;</code>

<code>}</code>

<code># 将未加密的流量重定向到加密的网站</code>

<code>server {</code>

<code>listen 80;</code>

<code>server_name yourwebsite.com;</code>

<code>return 301 https://yourwebsite.com$request_uri;</code>

<code># 主服务块</code>

<code># 设置监听的端口,指定监听的域名</code>

<code>listen 443 default ssl;</code>

<code>client_max_body_size 4g;</code>

<code>server_name yourwebsite.com;</code>

<code># 指定日志位置</code>

<code>access_log /var/log/nginx/yourwebsite.access_log main;</code>

<code>error_log /var/log/nginx/yourwebsite.error_log info;</code>

<code># 告诉 nginx 你的 ssl 证书</code>

<code>ssl on;</code>

<code>ssl_certificate /etc/letsencrypt/live/yourwebsite.com/fullchain.pem;</code>

<code>ssl_certificate_key /etc/letsencrypt/live/yourwebsite.com/privkey.pem;</code>

<code># 设置根目录</code>

<code>root /var/www/yourvirtualenv/yourproject;</code>

<code># 为 nginx 指定静态文件路径</code>

<code>location /static/ {</code>

<code># autoindex the files to make them browsable if you want</code>

<code>autoindex on;</code>

<code># the location of your files</code>

<code>alias /var/www/yourvirtualenv/yourproject/static/;</code>

<code># set up caching for your static files</code>

<code>expires 1m;</code>

<code>access_log off;</code>

<code>add_header cache-control "public";</code>

<code>proxy_ignore_headers "set-cookie";</code>

<code># 为 nginx 指定你上传文件的路径</code>

<code>location /media/ {</code>

<code>autoindex if you want</code>

<code># the location of your uploaded files</code>

<code>alias /var/www/yourvirtualenv/yourproject/media/;</code>

<code># set up aching for your uploaded files</code>

<code>location / {</code>

<code># try your static files first, then redirect to gunicorn</code>

<code>try_files $uri @proxy_to_app;</code>

<code># 将请求传递给 gunicorn</code>

<code>location @proxy_to_app {</code>

<code>proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;</code>

<code>proxy_set_header host $http_host;</code>

<code>proxy_redirect off;</code>

<code>proxy_pass http://njc-gunicorn;</code>

<code># 缓存 html、xml 和 json</code>

<code>location ~* \.(html?|xml|json)$ {</code>

<code>expires 1h;</code>

<code># 缓存所有其他的静态资源</code>

<code>location ~* \.(jpg|jpeg|png|gif|ico|css|js|ttf|woff2)$ {</code>

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

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

<code># systemctl restart nginx</code>

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

原文发布时间为:2017-04-15

本文来自云栖社区合作伙伴“linux中国”