Django、Apache和Nginx的配置

8

我已经在Apache+mod_wsgi上设置了Django应用程序。为了提供静态文件,我正在使用Nginx,正如Django项目网站建议的那样。http://docs.djangoproject.com/en/dev/howto/deployment/modwsgi/

Apache运行在8081端口,Nginx运行在80端口。现在有些人建议我的配置是错误的,我应该颠倒Apache和Nginx的角色。我不确定为什么会这样。如果我的配置确实有问题,为什么Django网站会建议错误的方法呢?


在80端口上使用Nginx是安全的。你愿意分享一下你在哪里看到有人说Apache是更好的反向代理吗?基准测试非常关键。 - Yuji 'Tomita' Tomita
在我设置应用程序时,我在stackoverflow http://stackoverflow.com/questions/4868213/apache-reverseproxy-not-working-noob/4870186和sf http://serverfault.com/questions/229842/apache-reverseproxy-to-nginx上发布了问题。我在两个页面上得到了类似的回复。 - Neo
1个回答

13

您提供的Django文档并没有建议您使用Apache作为反向代理。他们只是建议您使用单独的Web服务器,因此我认为该文档在这个问题上不够清晰——它们并没有建议任何错误的内容。

我的初步回答是假设您使用Nginx作为反向代理,因为端口80是HTTP端口,在浏览器尝试访问未指定端口的URL时使用该端口。

通过快速搜索可以找到许多完整的设置Nginx + Apache的指南,但以下是设置Nginx的要点:

location / {
        # proxy / requests to apache running django on port 8081
        proxy_pass         http://127.0.0.1:8081/;
        proxy_redirect     off;
    } 

location /media/ { 
        # serve static media directly from nginx
        root   /srv/anuva_project/www/;
        expires 30d;
        break;
    }

你只需要从你的Apache配置文件中删除代理行,并将代理语句添加到nginx.conf中即可。

如果你真的想从8081端口提供网站服务,你可以让nginx监听8081端口,而让apache监听不同的端口。

关键是,Apache位于某个隐蔽的端口上,仅为从nginx发送给它的请求提供服务,而静态文件服务由nginx处理。


我很困惑。或者我可能完全理解服务器概念有误。由于Django在Apache上运行,为了提供静态媒体,我必须通过Apache反向代理到达nginx。因此,在Apache配置文件中确实使用了反向代理。例如,我的主要应用程序位于:http://enpass.djangoserver:8081/accounts。而在Django模板中,我从nginx检索静态文件。所以我猜Apache在前面(而不是nginx,正如您在答案中所说)。或者我的概念颠倒了。 - Neo
端口80是HTTP端口,因此访问example.com将连接到监听端口80的服务器。在您的情况下,它是nginx。然后,Nginx会将请求代理到8081端口上运行的Apache而不是媒体文件夹。 - Yuji 'Tomita' Tomita
然后,Nginx将代理请求到8081端口上的Apache,而不是您的媒体文件夹。请问你能详细说明一下吗?就Apache和Nginx而言,我是个新手。而且,我肯定没有配置Nginx进行任何代理。 - Neo
让我更新一下帖子 :) 你说得对,我假设端口80是你的反向代理,因为否则你的用户将不得不输入端口号来访问你的网站。 - Yuji 'Tomita' Tomita
哦,现在我明白了。我本来是从Apache转到Nginx,但应该反过来。谢谢。 - Neo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接