Question

Nginx est mon serveur Web frontal qui écoute sur le port 80. Et certaines demandes, j’ai configuré nginx pour inverser le proxy sur un serveur Web basé sur mochiweb que j’ai écrit, en écoutant sur le port 8000. Mon La configuration de Nginx pour cela ressemble à ceci:

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, lorsque j'accède à l'URL http: // localhost / mymochiserver , la réponse ne s'affiche pas. navigateur. Le navigateur dit simplement "En attente de localhost". mymochiserver imprime une trace dans la fenêtre du terminal à partir duquel il est exécuté, chaque fois qu'un utilisateur s'y connecte, et pour le moment, je vois la trace de chaque fenêtre du 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, lorsque j’accède directement à l’URL, http://127.0.0.1:8000/ , tout fonctionne correctement et Je vois la sortie de mymochiserver sur le navigateur. Donc ça marche quand on appelle directement. Mais quand nginx utilise un proxy inverse, il ne semble pas fonctionner. Avez-vous une idée de ce qui pourrait mal se passer?

Mise à jour: Dans mon application Mochiweb, j'ai les lignes de code suivantes:

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

Il s’agit essentiellement d’une application COMET dans laquelle les utilisateurs se connectent au serveur mymochiserver et le serveur envoie les données à tous les clients connectés. S'il n'y a pas de données à envoyer depuis le serveur, je passe en veille le processus. Et puis, une fois réveillé, j'appelle la fonction feed pour envoyer les données. Et si je supprime le code d'hibernation, tout fonctionne bien et la sortie s'affiche dans le navigateur. Mais si je hiberne, cela ne fonctionne pas. Une idée de ce qui ne va pas?

Était-ce utile?

La solution

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 la mise en mémoire tampon du proxy et augmenter le paramètre proxy_read_timeout dans nginx pour que cela fonctionne. 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 d’avoir indiqué la réponse!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top