2009-06-17 15 views
4

J'ai Nginx comme serveur web frontal écoute sur le port 80. Et certaines demandes, j'ai configuré nginx pour inverser le proxy à un serveur web basé mochiweb que j'ai écrit , écoute sur le port 8000. Ma configuration nginx pour cela ressemble à ceci:Nginx Reverse Proxy à l'application Mochiweb personnalisée

location /mymochiserver { 

      proxy_pass   http://127.0.0.1:8000; 
      proxy_redirect  off; 

      proxy_set_header Host    $host; 
      proxy_set_header X-Real-IP  $remote_addr; 
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

      client_max_body_size  10m; 
      client_body_buffer_size 128k; 

      proxy_connect_timeout  90; 
      proxy_send_timeout   90; 
      proxy_read_timeout   90; 

      proxy_buffer_size   4k; 
      proxy_buffers    4 32k; 
      proxy_busy_buffers_size 64k; 
      proxy_temp_file_write_size 64k; 
     } 

maintenant, quand j'accéder à l'URL http://localhost/mymochiserver Je ne vois pas de réponse du navigateur. Le navigateur dit simplement "Waiting for localhost". mymochiserver imprime une trace à la fenêtre de terminal à partir de laquelle il est exécuté, chaque fois qu'un utilisateur s'y connecte, et maintenant, je vois la trace pour chaque fenêtre de navigateur que j'ouvre pour connecter cette URL. Mais je ne vois aucune des sorties que je m'attends à voir écrites dans le navigateur. MAIS, quand j'accède directement à l'URL http://127.0.0.1:8000/ tout fonctionne bien, et je vois la sortie de mymochiserver sur le navigateur. Donc ça marche quand on l'appelle directement. Mais lorsqu'il est inversé via nginx, il ne semble pas fonctionner. Une idée de ce qui pourrait être faux?


Mise à jour: Dans mon application Mochiweb je ces lignes de code:

Socket = Req:get(socket), 
inet:setopts(Socket, [{active, once}]), 
proc_lib:hibernate(?MODULE, feed, [Response, Userid, 1]); 

Il est essentiellement une application COMET où les utilisateurs se connectent au mymochiserver et le serveur expulse des données à tous les clients connectés. S'il n'y a aucune donnée à envoyer du serveur, j'hiberne le processus. Et puis quand réveillé, j'appelle la fonction d'alimentation pour envoyer les données. Et si je supprime le code d'hibernation, tout fonctionne bien, et je vois la sortie dans le navigateur. Mais si je fais hiberner, ça ne marche pas. Une idée de ce qui ne va pas?

Répondre

4

Fixé!

Référence: http://timanovsky.wordpress.com/2009/01/09/toward-a-million-user-long-poll-http-application-nginx-erlang-mochiweb/

je devais désactiver en mémoire tampon de proxy et d'augmenter la proxy_read_timeout dans nginx pour le faire fonctionner. Donc, mon fichier de configuration ressemble à ceci maintenant:

location /mymochiapp { 
      proxy_pass   http://127.0.0.1:8000; 
      proxy_redirect  off; 

      proxy_set_header Host    $host; 
      proxy_set_header X-Real-IP  $remote_addr; 
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

      client_max_body_size  10m; 
      client_body_buffer_size 128k; 

      proxy_connect_timeout  90; 
      proxy_send_timeout   90; 
      proxy_read_timeout   3600; 

      proxy_buffering off; 
     } 

merci thomas55 pour avoir signalé la réponse!