Après avoir examiné les informations, j'ai une compréhension générale. Veuillez me corriger :
Un site Web fonctionne sur un ordinateur, avec la division du travail suivante.
1. Nginx 监听计算机的某一个端口(比如80), 等待用户的request
2. 远程有一个用户执行了一个request, Nginx监听到了, 然后把这个请求传给CGI程序(比如Python的WSGI)
3. CGI程序接受请求, 运行对应的代码, 然后返回一个response
La compréhension ci-dessus est-elle correcte ? Si elle est correcte, pourquoi Nginx existe-t-il ? Parce qu'il semble que même sans Nginx, il est possible d'utiliser directement CGI pour accepter les requêtes ?
Merci.
Démon crabe. Un style Zhihu
Tout d'abord, corrigez la question en
Pourquoi CGI et WebServer ne peuvent-ils pas se remplacer ?
Parce queCGI
est un standard etNginx
est une application. Les deux ne sont pas identiques, doncWebServer
est utilisé à la place deNginx
ci-dessous.为什么CGI与WebServer不能互相替代?
因为CGI
是一种标准,Nginx
则是一种应用。两者不是同类,所以下面用WebServer
代替Nginx
。CGI
是一种标准,Nginx
则是一种应用。从
浏览器
的角度来看,浏览器只负责发送请求,接收来自WebServer
的返回结果并渲染之。对于WebServer
来讲,它需要做的仅仅是接收请求,寻找浏览器
请求的文件并且发送回去。如果仅仅是这样,世界就很完美了。但是后来发生的事情大家都知道了。。我们不光要浏览静态网页,我们还要登陆论坛、发帖骂人灌水踩答案点赞刷声望等等。这些行为是静态的Html没法完成的。所以有了JS、Flash等等基于前端的交互技术。
WebServer
把包含了这些代码的文件发给浏览器
,后者把它解析称它应该有的样子(或者不应该有的样子,比如IE6),我们可以在页面上看看动画什么的,这些称之为前段交互技术。但是有些交互前端做不了, 比如我上次发了一个高清无码套图,我要看到大家的反应,点个赞啊楼主好人啊之类的,那么这个技术就要用到数据库,但是数据库本身是需要另外一种语言来操作的,这种语言可以是python、prel、Ruby、PHP等等,我们称之为
动态语言
。他们对数据库进行增删查改四大操作,并且返回结果给WebServer
,后者再传给浏览器。由于有很多动态语言和很多种Web服务器,他们彼此之间互不兼容,给程序员造成了很大的麻烦。那么,
CGI
应运而僧。CGI
的定义是统一网关接口。从此WebServer
收到后台动态交互请求就直接发给CGI
,CGI
发给动态语言,动态语言把结果发回给CGI
,CGI
再发回给WebServer
,后面的事情你都清楚了。。。。那么结论就是,
CGI
是一个翻译层,它的功能不是直接提供结果给浏览器,而是翻译来自WebServer的请求并转给后台的应用程序,并且把执行结果翻译成静态网页返回给WebServer
CGI
est un standard,Nginx
est une application.Du point de vue du
Mais tout le monde sait ce qui s'est passé ensuite. . Nous devons non seulement parcourir des pages Web statiques, mais nous devons également nous connecter à des forums, publier des injures, voter contre des réponses et gagner en réputation, etc. Ces comportements ne peuvent pas être accomplis par du HTML statique. Il existe donc JS, Flash et d’autres technologies interactives basées sur le front-end.navigateur
, le navigateur est uniquement responsable de l'envoi des requêtes, de la réception des résultats de retour duWebServer
et de leur rendu. Pour leWebServer
, il lui suffit de recevoir la requête, de trouver le fichier demandé par leNavigateur
et de le renvoyer. Si seulement c’était le cas, le monde serait parfait.WebServer
envoie le fichier contenant ces codes auNavigateur
, qui l'analyse pour déterminer à quoi il devrait ressembler (ou à quoi il ne devrait pas ressembler, comme IE6). Nous pouvons regardez les animations et autres sur la page. C'est ce qu'on appelle les technologies d'interaction frontale. 🎜 Mais il y a certaines interfaces interactives qui ne peuvent pas être réalisées. Par exemple, j'ai posté une photo haute définition non censurée la dernière fois. Je veux voir les réactions de tout le monde, comme l'affiche, quelle bonne personne, etc. utilisation d'une base de données, mais la base de données elle-même l'est. Si un autre langage est nécessaire pour fonctionner, ce langage peut être python, prel, Ruby, PHP, etc. Nous l'appelonslangage dynamique
. Ils effectuent quatre opérations majeures d'ajout, de suppression, de vérification et de modification de la base de données, et renvoient les résultats auWebServer
, qui les transmet ensuite au navigateur. 🎜 🎜Comme il existe de nombreux langages dynamiques et de nombreux types de serveurs Web, ils sont incompatibles les uns avec les autres, causant beaucoup de problèmes aux programmeurs. Ensuite,CGI
est né. La définition deCGI
est Unified Gateway Interface. Dès lors, leWebServer
reçoit la demande d'interaction dynamique en arrière-plan et l'envoie directement auCGI
.CGI
l'envoie au langage dynamique, et le langage dynamique l'envoie. le résultat est renvoyé àCGI
,CGI
puis renvoyé auWebServer
. Vous saurez ce qui se passe ensuite. . . . 🎜 🎜La conclusion est queCGI
est une couche de traduction. Sa fonction n'est pas de fournir directement les résultats au navigateur, mais detraduire la requête du serveur Web et de la transférer vers l'application en arrière-plan, et exécutez-le Les résultats sont traduits en pages Web statiques et renvoyés au serveur Web
, ils ne sont donc pas interchangeables. 🎜 🎜Finalement, je l'ai écrit à la va-vite, et beaucoup de mes expressions ne sont pas rigoureuses. Les commentaires sont les bienvenus. 🎜Il y en a tellement, je pense qu'après y avoir réfléchi, je peux énumérer d'autres avantages de nginx qui sont au moins aussi longs que ceux ci-dessus
La communication entre le navigateur et le serveur web est le protocole HTTP. Le navigateur ne supporte pas le protocole CGI/FastCGI, il est donc impossible d'abandonner Nginx et de communiquer directement avec FPM, PHP-CGI, etc.
Nginx est essentiellement un serveur Web. Si vous utilisez CGI directement, alors ce CGI devient un serveur Web et la logique est déroutante.
CGI sert à gérer la logique dynamique.
Le serveur Web n'est qu'une implémentation d'un service HTTP. Il reçoit uniquement une requête puis répond avec une réponse correspondante (généralement une page HTML ou d'autres fichiers en fonction de la requête), quelle que soit la logique. Tous les traitements logiques sont confiés à CGI. Par exemple, vérification de la connexion de l'utilisateur, etc.
Vous pouvez considérer Nginx comme un messager. Le travail principal n'est pas effectué par lui, mais sans lui,
. Les personnes qui effectuent réellement le travail sont celles qui vont chercher et remettent les tâches en personne.
Ce n’est pas que vous ne pouvez pas le faire, c’est que les gens qui font le travail ne se soucient que de la façon de bien faire le travail,
Je n'ai pas envie de faire beaucoup de courses et de faire de mes fonctions un salmigondis.
Ne pensez-vous pas que sans Nginx, personne ne serait capable de faire le point 1 des 4 points que vous avez listés ?
Les fichiers statiques sont essentiellement transmis à nginx pour traitement.
.Pour les requêtes dynamiques, nginx équivaut à une couche de routage. Vous pouvez aller où vous voulez uniquement en vous concentrant sur le traitement d'une logique métier spécifique