我今天在Cherokee上设置了Django(使用SCGI),我注意到Django文档说你可以使用主机/端口组合或套接字来进行webserver和Django之间的通信.
他们唯一要说的就是这个问题
你选择的是一种偏好; 由于权限问题,TCP套接字通常更容易.
(顺便说一句,我使用套接字执行此操作时遇到了权限问题,但是没有使用主机:).)
我依旧记得套接字是如何从我的系统编程类中运行的,但我真的很好奇两者之间的有效区别.任何时候都有选择的东西,有人对此事有意见,所以我希望得到那个.特别是,有任何性能差异吗?
或者,如果它真的没关系,我只想要一些确认,所以我可以继续我的编程并忽略这个系统管理员的东西.
如今,运行Perl Web应用程序的一个非常流行的选择似乎是nginx webserver代理对FastCGI守护程序或PSGI启用的Web服务器(例如Starman)的请求.
关于为什么一般会这样做会有很多问题(例如为什么在Catalyst/Plack/Starman中使用nginx?)并且答案似乎适用于这两种情况(例如,允许nginx提供静态内容,轻松重启应用程序服务器,负载均衡等)
但是,我对使用FastCGI与反向代理方法的优缺点特别感兴趣.似乎Starman被广泛认为是最快和最好的Perl PSGI应用程序/网络服务器,我很难看到使用FastCGI的任何优势.这两种方法似乎都支持:
同样,任一选项的nginx配置都非常相似.
那你为什么选择一个呢?
有人可以展示如何使用fastcgi_finish_request()函数的简单示例吗?我用谷歌搜索,但只发现了一些一般提及它,有些人说他们成功使用它但我找不到一个代码的例子.
例如,我有一个PHP对象.要向浏览器发送响应,我会生成HTML,然后通过它返回getResult().然后回应结果.
像这样:
$obj = new controller();
echo $o->getResult();
Run Code Online (Sandbox Code Playgroud)
假设我想利用这种优化技术将结果发送到浏览器,然后完成一些可能很长的过程,比如连接到某些API,比如Facebook API.
我该怎么做呢?我明白,基本上我可以调用fastcgi_finish_request();然后继续执行PHP脚本.
我只需要查看示例代码,我自己也不够聪明.
在我将ICG更改为nginx之后,除索引页之外的所有路由都不起作用.
Laravel配置:
#/etc/nginx/sites-enabled/laravel
server {
listen 80;
root /var/www/home;
index index.php;
server_name 192.168.178.71;
access_log /var/www/home/storage/app/logs/laravel-nginx-access.log;
error_log /var/www/home/storage/app/logs/laravel-nginx-error.log error;
location /home {
root /home/public;
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { log_not_found off; access_log off; }
location = /robots.txt { log_not_found off; access_log off; }
# ERROR
error_page 404 /index.php;
# DENY HTACCESS
location ~ /\.ht {
deny all;
}
}
Run Code Online (Sandbox Code Playgroud)
默认配置:
# /etc/nginx/sites-enabled/default
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www;
# Add index.php to the …Run Code Online (Sandbox Code Playgroud) 我有关于在不同的配置中运行PHP的基本想法,如mod_php,cgi,FastCGI等.
在我的发现和测试中,我发现FastCGI略胜一筹.我最喜欢FastCGI对SuEXEC的支持.等等我不想再次进入基准测试业务.如果你上网,你会发现在每秒处理的请求数量方面,证明一种方式比另一种更快的人.那么它的好指标,但我对不同的因素感兴趣,这是我的问题......
请注意,我对DIGG或交通高峰的生存兴趣不大.我想要一种可以使服务器稳定和可预测的方法.
对不起,如果我很困惑,但我真的很乱.我有512MB物理内存,400MB交换和我的服务器疯狂的内存不足.平均内存需求大约为350MB,只是内存使用量激增使得内存几秒钟无法访问,如果在那几秒钟窗口中收到的额外点击很少,则apache在mysql和所有其他fellas运行正常时崩溃.
请帮帮我们.我不会买更多的RAM或硬件.我很确定问题出在我的配置中.对不起,如果我听起来傲慢或无知.
我一直试图决定我的Web项目是否是使用PSGI实现的候选者,但我真的没有看到它在这个阶段对我的应用程序有什么好处.
我真的不明白所有的大惊小怪.对我来说,PSGI似乎是一个框架,它提供了不同Apache模块之间的通用接口,允许您在它们之间移动应用程序.例如,轻松地将您的应用程序从mod_perl上运行到fastcgi,并提供运行这两个选项的应用程序支持.
是的,还是我错过了什么?
因为我和团队不仅是开发应用程序的一部分,而且几乎都是服务器的维护和设置,我没有看到能够在fastcgi,cgi和mod_perl上运行的价值,我们做只需mod_perl即可.
我误解了PSGI功能,还是不适合我的项目?
我想通过nginx运行几个虚拟主机,每个主机通过fcgi提供不同的django应用程序.这可能吗?如果是这样,有没有人有关于在哪里/如何开始的良好资源?nginx文档似乎主要是示例,但没有我正在尝试的特定配置...
有人可以解释守护进程模式下的apache mod_wsgi和线程模式下的django fastcgi之间的区别.我认为它们都使用线程来实现并发性. 假设我使用nginx作为apache mod_wsgi的前端.
更新:
我正在比较内置fastcgi(./ manage.py方法=线程maxchildren = 15)的django和'daemon'模式下的mod_wsgi(WSGIDaemonProcess示例threads = 15).他们都使用线程并获得GIL,对吗?
UPDATAE 2:
所以,如果它们都相似,那么apache mod_wsgi对fastcgi有什么好处.我看到fastcgi的这些优点:
UPDATAE 3:
我现在对nginx + uwsgi很满意.
UPDATAE 4:
我现在对nginx + gunicorn很满意:)
我了解FastCGI在性能方面优于其他网关接口的目的.但是,如果实现FastCGI的库已经经历了实施安全高效的TCP服务的艰苦措施,为什么不将应用程序编写为Web服务器呢?前端Web服务器实现反向代理的效率低于FCGI的效率吗?或者FCGI的规范比HTTP的规范简单得多?
我很快就计划将我的第一个Ruby on Rails应用程序部署到生产环境中,我甚至选择了一个带有所有托管服务器的webhost,以及你期望从RoR提供商那里获得的Capistrano优点.
提供商允许Mongrel,Thin,Passenger和FastCGI Web服务器,这看起来非常灵活,但老实说我不知道它们之间的差异.我已经对它们进行了一些研究,但是当它们开始讨论功能和最大同时请求时,它们都会变得有点多 - 而且这些数据似乎会因发布者的不同而有所不同.
我看过Passenger(表面上看) - 这看起来对我很有吸引力 - 但我的印象是Passenger不是真正的网络服务器,而是更像是Apache或nginx之上的一层并且管理产生了应用程序的实例(如Mongrel集群).
任何人都可以请我直截了当地说明外行人的条款,以便我可以明智地选择(因为任何看过印第安纳琼斯和最后的十字军的人都知道如果选择不好会发生什么).