Socket.io: WebSocket рд╣реИрдВрдбрд╢реЗрдХ рдХреЗ рджреМрд░рд╛рди рддреНрд░реБрдЯрд┐: рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛрдб: 400

рдХреЛ рдирд┐рд░реНрдорд┐рдд 14 рдЬрдире░ 2015  ┬╖  129рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: socketio/socket.io

рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ, рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрдВрд╕реЛрд▓ рдкрд░ рдорд┐рд▓рддреА рд╣реИ:
'ws://.../socket.io/?EIO=2&transport=websocket&sid=p3af7ZNfvogtq6tAAAG0' рд╕реЗ рд╡реЗрдмрд╕реЙрдХреЗрдЯ рдХрдиреЗрдХреНрд╢рди рд╡рд┐рдлрд▓: рд╡реЗрдмрд╕реЙрдХреЗрдЯ рд╣реИрдВрдбрд╢реЗрдХ рдХреЗ рджреМрд░рд╛рди рддреНрд░реБрдЯрд┐: рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛрдб: 400ред

рд╣рд╛рд╡рд╛ рдХреЛрдИ рд╕рд▓рд╛рд╣?

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдереА, рдореЗрд░рд╛ рдРрдк nginx рдХреЗ рдкреАрдЫреЗ рд╣реИред рдореЗрд░реЗ Nginx config рдореЗрдВ рдЗрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдХрд░рдиреЗ рд╕реЗ рддреНрд░реБрдЯрд┐ рджреВрд░ рд╣реЛ рдЧрдИред

рд╕реНрдерд╛рди / {
рдкреНрд░реЙрдХреНрд╕реА_рдкрд╛рд╕ http://localhost :8080;
рдкреНрд░реЙрдХреНрд╕реА_http_рд╕рдВрд╕реНрдХрд░рдг 1.1;
рдкреНрд░реЙрдХреНрд╕реА_рд╕реЗрдЯ_рд╣реЗрдбрд░ рдЕрдкрдЧреНрд░реЗрдб $http_upgrad;
рдкреНрд░реЙрдХреНрд╕реА_рд╕реЗрдЯ_рд╣реЗрдбрд░ рдХрдиреЗрдХреНрд╢рди "рдЕрдкрдЧреНрд░реЗрдб";
рдкреНрд░реЙрдХреНрд╕реА_рд╕реЗрдЯ_рд╣реЗрдбрд░ рд╣реЛрд╕реНрдЯ $ рд╣реЛрд╕реНрдЯ;
}

рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ https://chrislea.com/2013/02/23/proxying-websockets-with-nginx/ рд╕реЗ рд╣реИ

рд╕рднреА 129 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореИрдВ рдЗрд╕ рд╕рдордп рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдХреЛрдИ рдорджрдж?

рдЬрдм рд╕реЗ рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдбреЛрдореЗрди рдкрд░ SSL рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рддрдм рд╕реЗ рдореБрдЭреЗ рднреА рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдЖ рд░рд╣реА рд╣реИред

рдпрд╣рд╛рдВ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдмреЗрд╣рддрд░ рд╡рд┐рд╡рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: http://stackoverflow.com/questions/28025073/error-during-websocket-handshake-unexpected-response-code-400-with-nginx-proxy

рдореБрдЭреЗ рдПрдВрдбреНрд░реЙрдЗрдб рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рдиреЗ рдореЗрдВ рднреА рдЗрд╕реА рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИред рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдпрд╛ рддреЛ HAproxy ssl рдЯрд░реНрдорд┐рдиреЗрд╢рди рдХрд░рдХреЗ рдпрд╛ рдиреЛрдб рдХреЛ рд╕реАрдзреЗ ssl рдХрд░рдиреЗ рджреЗрдиреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ https рд╕реЗ рдХрдиреЗрдХреНрдЯ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рд╣рд╛рд▓рд╛рдВрдХрд┐ рд▓рдВрдмрд╛ рдорддрджрд╛рди рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

рдореИрдВ рдбреЛрдореЗрди рдХреЛ рд╕рд╣реА рдЖрдИрдкреА рдкрддреЗ рдореЗрдВ рдмрджрд▓рдХрд░ рдЗрд╕реЗ рд╣рд▓ рдХрд░рддрд╛ рд╣реВрдВ:

рд╡рд░ рд╕реЙрдХреЗрдЯ = io.connect ('http://182.92.79.215:3007');

рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдереА, рдореЗрд░рд╛ рдРрдк nginx рдХреЗ рдкреАрдЫреЗ рд╣реИред рдореЗрд░реЗ Nginx config рдореЗрдВ рдЗрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдХрд░рдиреЗ рд╕реЗ рддреНрд░реБрдЯрд┐ рджреВрд░ рд╣реЛ рдЧрдИред

рд╕реНрдерд╛рди / {
рдкреНрд░реЙрдХреНрд╕реА_рдкрд╛рд╕ http://localhost :8080;
рдкреНрд░реЙрдХреНрд╕реА_http_рд╕рдВрд╕реНрдХрд░рдг 1.1;
рдкреНрд░реЙрдХреНрд╕реА_рд╕реЗрдЯ_рд╣реЗрдбрд░ рдЕрдкрдЧреНрд░реЗрдб $http_upgrad;
рдкреНрд░реЙрдХреНрд╕реА_рд╕реЗрдЯ_рд╣реЗрдбрд░ рдХрдиреЗрдХреНрд╢рди "рдЕрдкрдЧреНрд░реЗрдб";
рдкреНрд░реЙрдХреНрд╕реА_рд╕реЗрдЯ_рд╣реЗрдбрд░ рд╣реЛрд╕реНрдЯ $ рд╣реЛрд╕реНрдЯ;
}

рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ https://chrislea.com/2013/02/23/proxying-websockets-with-nginx/ рд╕реЗ рд╣реИ

рдЙрддреНрдкрд╛рджрди рд╕рд░реНрд╡рд░ рдкрд░ рдпрд╣рд╛рдБ рд╡рд╣реА рд╕рдорд╕реНрдпрд╛ред рд╡рд┐рдХрд╛рд╕ рдорд╢реАрдиреЗрдВ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рджрд┐рдЦрд╛рддреА рд╣реИрдВред

рдЕрдЬреАрдм рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдХрдиреЗрдХреНрд╢рди рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рдореИрдВ рд╕рд░реНрд╡рд░ рд╕реЗ рд╡реЗрдмрд╕рд╛рдХреЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрджреЗрд╢ рднреЗрдЬ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдЧреНрд░рд╛рд╣рдХ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдореИрдВ рд╕рд░реНрд╡рд░ рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рд╡реЗрдмрд╕реЙрдХреЗрдЯ рдХрдиреЗрдХреНрд╢рди рдХреЛ рднреА рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВред

рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рдбреЗрд╡рд▓рдкрд░ рдЯреВрд▓ рдореЗрдВ рдпрд╣ рдХрд╣рддреЗ рд╣реБрдП рдорд┐рд▓рддреА рд╣реИ:

' wss://.../socket.io/?EIO=3&transport=websocket&sid=2b_v_BXtbwzl5z2yAAAI ' рд╕реЗ рд╡реЗрдмрд╕реЙрдХреЗрдЯ рдХрдиреЗрдХреНрд╢рди рд╡рд┐рдлрд▓: рд╡реЗрдмрд╕реЙрдХреЗрдЯ рд╣реИрдВрдбрд╢реЗрдХ рдХреЗ рджреМрд░рд╛рди рддреНрд░реБрдЯрд┐: рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛрдб: 400

рдореИрдВ рдиреЛрдб рд╕реЗ рдХрдиреЗрдХреНрд╢рди рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрд╛рдЪреЗ рдкреНрд░реЙрдХреНрд╕реАрдкрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдпрд╣рд╛рдВ рд╡рд╣реА - рджреЗрд╡ рдЙрдкрдХрд░рдг рдореЗрдВ рдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд▓реЗрдХрд┐рди рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ред рдХрд╣реАрдВ рдФрд░ рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрдкрд╛рдЪреЗ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдкрдврд╝рд╛ - рдЗрд╕ рдорд╢реАрди рдкрд░ 2.2.14 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдк socket.io рдХрдиреЗрдХреНрд╢рди рдЕрдореЗрдЬрд╝рди рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд░ рд╕реЗ рдирд╣реАрдВ рдЧреБрдЬрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╛ рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдпрд╣ рдХрд░реЗрдВ: http://blog.flux7.com/web-apps-websockets-with-aws-elastic-load-balancing

рдпрд╣рд╛рдВ рд╡рд╣реА рдореБрджреНрджрд╛, рдХреЗрд╡рд▓ рдЙрддреНрдкрд╛рджрди рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВред
Websockets рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХрдВрд╕реЛрд▓ рд▓реЙрдЧ рдкрд░ рдореИрдВ рдпрд╣ рддреНрд░реБрдЯрд┐ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВред

рдореИрдВ Nginx рдФрд░ рдиреЛрдб рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд▓реЛрдб рд╕рдВрддреБрд▓рди рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА tylercb рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдП рдЧрдП рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛ ("proxy_set_header рд╣реЛрд╕реНрдЯ $ рд╣реЛрд╕реНрдЯ;" рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде) рдФрд░ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред

рд╕рдорд╕реНрдпрд╛ рднреА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░реЛ....

рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣реА рдореБрджреНрджрд╛ рдерд╛ред рдХреНрдпрд╛ рдЖрдк рдХреНрд▓рд╛рдЙрдбрдлреНрд▓реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдХреЗрд╡рд▓ рдЙрдирдХреА рдПрдВрдЯрд░рдкреНрд░рд╛рдЗрдЬрд╝ рдпреЛрдЬрдирд╛ WebSockets рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИред

рдореЗрд░реЗ рд▓рд┐рдП рд╣рд▓ред рдпрд╣ nginx рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдЧрд▓рдд socket.io рдкрддреЗ рдХреЗ рдХрд╛рд░рдг рдерд╛, рдЬреЛ рд╡реЗрдмрд╕реЛрдХреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрде рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛ рд░рд╣рд╛ рдерд╛ред

рдореИрдВрдиреЗ рдЧреБрдЧрд▓реА рдХреА рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ рдФрд░ рдореИрдВ рднреА nginx рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рд╕рдорд╛рдзрд╛рди рдЗрд╕ рднрд╛рдЧ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реИ

рдкреНрд░реЙрдХреНрд╕реА_http_рд╕рдВрд╕реНрдХрд░рдг 1.1;
рдкреНрд░реЙрдХреНрд╕реА_рд╕реЗрдЯ_рд╣реЗрдбрд░ рдЕрдкрдЧреНрд░реЗрдб $http_upgrad;
рдкреНрд░реЙрдХреНрд╕реА_рд╕реЗрдЯ_рд╣реЗрдбрд░ рдХрдиреЗрдХреНрд╢рди "рдЕрдкрдЧреНрд░реЗрдб";
рдкреНрд░реЙрдХреНрд╕реА_рд╕реЗрдЯ_рд╣реЗрдбрд░ рд╣реЛрд╕реНрдЯ $ рд╣реЛрд╕реНрдЯ;

nginx рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреИрд╕реЗ tylercb рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛ред рдзрдиреНрдпрд╡рд╛рджред

рд╡рд┐рдВрдбреЛрдЬ рд╕рд░реНрд╡рд░ 2008R2 (рдХреЛрдИ рдкреНрд░реЙрдХреНрд╕реА рдирд╣реАрдВ, рдХреЛрдИ рдЖрдИрдЖрдИрдПрд╕ рдирд╣реАрдВ) рдкрд░ рд╣реЛрд╕реНрдЯ рдХрд┐рдП рдЧрдП рдореЗрд░реЗ рдРрдк рд╕реЗ рд╕реАрдзреЗ рдХрдиреЗрдХреНрдЯ рд╣реЛрдиреЗ рдореЗрдВ рдПрдХ рд╣реА рддреНрд░реБрдЯрд┐ рдорд┐рд▓реАред рдмреАрдЪ рдореЗрдВ рдХреЗрд╡рд▓ рдЧреВрдВрдЧрд╛ рдордзреНрдпрд╡рд░реНрддреА рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ред

рд╣реЛрд╕реНрдЯ рдирд╛рдо рдХреЛ рдЖрдИрдкреА рдкрддреЗ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдареАрдХ рдХрд╛рдо рдХрд░реЗрдВ, рдпрд╛рдиреА 127.0.0.1:9000ред httpd ProxyPassReverse рдХреЗ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдорд╕реНрдпрд╛ рдХреНрд▓рд╛рдЙрдбрдлрд╝реЗрдпрд░ рдХреЗ рдореБрдлрд╝реНрдд рдкреНрд▓рд╛рди рдкрд░ рд╡реЗрдмрд╕реЛрдХреЗрдЯреНрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдереАред рдореИрдВрдиреЗ рдбреЛрдореЗрди рдХреЗ рд▓рд┐рдП CloudFare рдХреЛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдФрд░ рдпрд╣ рдХрд╛рдо рдХрд░ рдЧрдпрд╛ред

рдореБрдЭреЗ рд╡реЗрдмрд╕реЛрдХреЗрдЯ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрдкрд╛рдЪреЗ рдкреБрдирд░реНрд▓реЗрдЦрди рд╢рд░реНрддреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдпрд╣рд╛рдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА:
http://stackoverflow.com/a/27534443/2044993

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдкреБрд░рд╛рдирд╛ рдореБрджреНрджрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдпрд╣ Google рдЦреЛрдЬ рдкрд░рд┐рдгрд╛рдореЛрдВ рдореЗрдВ рдЙрдЪреНрдЪ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рд▓реЛрдЧреЛрдВ рдХреЛ рдорджрдж рдорд┐рд▓ рд╕рдХрддреА рд╣реИ:

рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рднреА рдХрдиреЗрдХреНрд╢рди рдЕрднреА рднреА рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ socket.io рд╡рд╛рдкрд╕ AJAX рдкрд░ рдЖ рд░рд╣рд╛ рд╣реИ, рдЬреЛ рдЗрд╖реНрдЯрддрдо рдирд╣реАрдВ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╕рд░реНрд╡рд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдареАрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ, рдпрд╣ рдореБрджреНрджрд╛ рдмрдВрдж рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рд╕реЙрдХреЗрдЯ рдирд╣реАрдВ рд╣реИред

@ arosenfeld-mentel рдореИрдВ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдКрдкрд░ рдХреА рдкреЛрд╕реНрдЯ рдкрдврд╝рддрд╛ рд░рд╣рддрд╛ рд╣реВрдВ рдХрд┐ "рдпрд╣ рдПрдХ рд╕реЙрдХреЗрдЯ рдирд╣реАрдВ рд╣реИред рдЖрдИрдУ рдореБрджреНрджрд╛" рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдХреЛрдИ рдХрд╣рд╛рдВ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдХреНрдпрд╛ рд╣реИред рдореИрдВ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ, рдХрдиреЗрдХреНрд╢рди рдЕрднреА рднреА рдХрд╛рдо рдХрд░рддрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред рдХреЛрдИ рднреА рд╕реБрдЭрд╛рд╡ рдмрд╣реБрдд рдХреГрддрдЬреНрдЮрддрд╛рдкреВрд░реНрд╡рдХ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдзрдиреНрдпрд╡рд╛рдж!

рд╕рдорд╕реНрдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рднреА рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдкреВрд░реЗ рд╕реЗрдЯрдЕрдк рдХреЛ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдПрдирдЬреАрдЖрдИрдПрдирдПрдХреНрд╕ рдерд╛, рдЬрд┐рд╕реЗ рд░рд┐рд╡рд░реНрд╕ рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рд░реВрдк рдореЗрдВ рдХрдИ рдмрд╛рд░ рдКрдкрд░ рдкреЛрд╕реНрдЯ рдХреА рдЧрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдХреБрдЫ рдФрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рд╕реНрдерд╛рдиреАрдп рдХрдиреЗрдХреНрд╢рди рдХреЛ рдбрд┐рдмрдЧ рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░реЗрдВ, рдЗрд╕реЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЪреЗрддрд╛рд╡рдиреА рдХреЗ рдХрд╛рдо рдкрд░ рд▓рд╛рдПрдВ, рдлрд┐рд░ рдЙрддреНрдкрд╛рджрди рд╕рд░реНрд╡рд░ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЛ рд╡реЗрдмрд╕рд╛рдХреЗрдЯ рдХреЗ рд╕рд╛рде рд╕рд╣рдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╛рдпрд░рд╡реЙрд▓, рдлреНрд░рдВрдЯ-рдлреЗрд╕рд┐рдВрдЧ рд╕рд░реНрд╡рд░ рдФрд░ рдкреНрд░реЙрдХреНрд╕реА рдорд┐рд▓реЗрдВред

рдпрд╣ рдПрдХ рд╕реЙрдХреЗрдЯ рдирд╣реАрдВ рд╣реИред

рдЙрддреНрддрд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рд╕рдм рдХреБрдЫ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдпрд╛ рд╣рдорд╛рд░реЗ рд╡реАрдкреАрдПрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдмрд╛рд░ рд╣рдорд╛рд░рд╛ рдлрд╝рд╛рдпрд░рд╡реЙрд▓ рд╢рд╛рдорд┐рд▓ рд╣реЛ рдЬрд╛рдиреЗ рдкрд░, рд╕рдВрджреЗрд╢ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдлрд╝рд╛рдпрд░рд╡реЙрд▓ рдХрд┐рд╕реА рддрд░рд╣ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдпрд╣ рд╕реАрдЦрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╕реЙрдХреЗрдЯ рдХреЛ рджреЛрд╖ рджреЗрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХреИрд╕реЗ рдбрд┐рдмрдЧ рдХрд░рдирд╛ рд╣реИред рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдзрдиреНрдпрд╡рд╛рджред

рдареАрдХ рдЙрд╕реА рдореБрджреНрджреЗ рдХрд╛ рд╣реЛрдирд╛ред рдореИрдВрдиреЗ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ (http://stackoverflow.com/questions/34439546/socket-io-with-apache-proxy) рдкреНрд░рд╢реНрди рднреА рдмрдирд╛рдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд╣рд╛рдВ рд╕реБрдЭрд╛рдИ рдЧрдИ рдЪреАрдЬреЛрдВ рдиреЗ рдЕрднреА рддрдХ рдореЗрд░реЗ рд▓рд┐рдП рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред

рдореИрдВрдиреЗ рдЗрди рд╣реЗрдбрд░ рдХреЛ nginx рдореЗрдВ рд░рдЦрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рд╡рд╣реА рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдирд╣реАрдВ рдмрд▓реНрдХрд┐ https://toolbox.seositecheckup.com рдореЗрдВ

рдЕрдЧрд░ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рднреА рд╣реЛрддреА, рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░рд╛ рд╡рд░реНрдЪреБрдЕрд▓ рд╣реЛрд╕реНрдЯ (nginx рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рдЕрдкрдЧреНрд░реЗрдб рд╣реЗрдбрд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдареАрдХ рд╕реЗ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд▓рдЧрднрдЧ рдПрдХ рд╕рд╛рд▓ рдкрд╣рд▓реЗ @tylercb рдХреЗ рдлрд┐рдХреНрд╕ рдиреЗ рдЗрд╕реЗ рдареАрдХ рдХрд░ рджрд┐рдпрд╛ ^

@tylercb рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛ред

+1
рдпрд╣ рддреНрд░реБрдЯрд┐ рдУрдкрдирд╢рд┐рдлреНрдЯ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд╣реБрдИ

рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЕрдЧрд░ рдореИрдВрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдареАрдХ рд╡рд╣реА рдХрд┐рдпрд╛ рдЬреЛ рдореИрдВрдиреЗ рдХрд┐рдпрд╛ рдерд╛ред рдпрд╣ рдЙрдкрд░реЛрдХреНрдд рд╡рд┐рднрд┐рдиреНрди рдкрджреЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдпреЛрдЬрди рд╣реИ рдЬрд┐рд╕реЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкреЛрд╕реНрдЯ рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдвреВрдВрдврдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдИ рднреА рд╡реНрдпрдХреНрддрд┐ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреЗред рдореИрдВ рдХрдбрд╝реА рдореЗрд╣рдирдд рдХрд╛ рдХреЛрдИ рд╢реНрд░реЗрдп рдирд╣реАрдВ рд▓реЗрддрд╛ред

рд╣рдо рджреМрдбрд╝ рд░рд╣реЗ рд╣реИрдВ

  1. рдЙрдмрдВрдЯреВ 14.04 рдПрд▓рдЯреАрдПрд╕ рд╕рд░реНрд╡рд░,
  2. nginx рд╕рдВрд╕реНрдХрд░рдг: nginx/1.4.6 (рдЙрдмрдВрдЯреВ) рдПрдХ рд░рд┐рд╡рд░реНрд╕ рдкреНрд░реЙрдХреНрд╕реА рдФрд░ рдПрд╕рдПрд╕рдПрд▓ рдЧреЗрдЯрд╡реЗ рдХреЗ рд░реВрдк рдореЗрдВред
  3. рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдкрд╛рдЪреЗ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд╣реИред рдЗрд╕реЗ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
  4. рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдиреЛрдб.рдЬреЗрдПрд╕ рд╕рд░реНрд╡рд░ рд╣реИ рдЬреЛ nginx v0.10.25 рдХреЗ рдкреАрдЫреЗ рдЪрд▓ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдкреЛрд░реНрдЯ 4001 рдкрд░ рд╕реБрдирддрд╛ рд╣реИред рдмрд╛рд╣рд░реА рдПрдХреНрд╕реЗрд╕ рдкреЛрд░реНрдЯ 4000 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реИред
  5. рд╣рдо рд╕рд╛рдордиреЗ рдХреА рддрд░рдл ufw рдЪрд▓рд╛рддреЗ рд╣реИрдВ рдФрд░ рдмрд╕ рдкреЛрд░реНрдЯ 4000 рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
  6. рд╣рдо рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рд░реНрд╡рд░ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ Cloudflare рдпрд╛ Openshift рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ
  7. рд╣рдо рдХрд┐рд╕реА рднреА рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд░ (рдЕрднреА рддрдХ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реА рдореБрджреНрджреЗ рдереЗ

WebSocket connection to 'ws://XXXXXXXXXX?EIO=2&transport=websocket&sid=p3af7ZNfvogtq6tAAAG0' failed: Error during WebSocket handshake: Unexpected response code: 400.

рд╣рдордиреЗ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП nginx рдлрд╝рд╛рдЗрд▓ рдХреЛ /etc/nginx/sites-enabled/default рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛: (рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдордиреЗ рдЕрдкрдиреЗ рдбреЛрдореЗрди рдирд╛рдо рдирд┐рдХрд╛рд▓ рд▓рд┐рдП рд╣реИрдВ)

server {
        listen 4000;
        server_name XXXX.YYYY.ZZZZ;

        root html;
        index index.html index.htm;

        ssl on;
        ssl_certificate /etc/ssl/certs/SSL.crt;
        ssl_certificate_key /etc/ssl/private/server.key;

        ssl_session_timeout 5m;

        # ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2; # NOTE WE REMOVE SSLv3
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES1\
28-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECD\
HE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SH\
A256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SH\
A:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';

        ssl_prefer_server_ciphers on;
        ssl_dhparam /etc/ssl/private/dhparams.pem;

        location / {
                 proxy_set_header        Host $host;
                 proxy_set_header        X-Real-IP $remote_addr;
                 proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                 proxy_set_header        X-Forwarded-Proto $scheme;

                 # Fix the тАЬIt appears that your reverse proxy set up is broken" error.
                 proxy_pass          http://127.0.0.1:4001;
                 proxy_read_timeout  90;

                 proxy_redirect      http://127.0.0.1:4001 https://XXXXX.YYYYY.ZZZZZ;

                 # These three lines added as per https://github.com/socketio/socket.io/issues/1942 to remove the error
                 # WebSocket connection to 'wss://XXXXX.YYYYY.ZZZZZ:4000/socket.io/?EIO=3&transport=websocket&sid=0hsRiXu0q9p6RHQ8AAAC' failed:\
 Error during WebSocket handshake: Unexpected response code: 400 in console.log

                 proxy_http_version 1.1;
                 proxy_set_header   Upgrade $http_upgrade;
                 proxy_set_header   Connection "upgrade";
        }
}

рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ

  1. рдкреНрд░реЙрдХреНрд╕реА_http_рд╕рдВрд╕реНрдХрд░рдг 1.1;
  2. рдкреНрд░реЙрдХреНрд╕реА_рд╕реЗрдЯ_рд╣реЗрдбрд░ рдЕрдкрдЧреНрд░реЗрдб $http_upgrad;
    3.proxy_set_header рдХрдиреЗрдХреНрд╢рди "рдЕрдкрдЧреНрд░реЗрдб";

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рдерд╛

  1. рдкреНрд░реЙрдХреНрд╕реА_рд╕реЗрдЯ_рд╣реЗрдбрд░ рд╣реЛрд╕реНрдЯ $ рд╣реЛрд╕реНрдЯ;
  2. рдкреНрд░реЙрдХреНрд╕реА_рдкрд╛рд╕ http://127.0.0.1 :4001;

рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдиреЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛ред

рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж,

рд▓реВрдЯрдирд╛

рдореБрдЭреЗ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬрдм рдореИрдВ рд╕реАрдПрдПрд╕ (рдХреНрд▓рд╛рд╕рд┐рдХ рдлреЙрд░реНрдо рдХреЗ рд╕рд╛рде рдирд╣реАрдВ) рдХреЗ рд╕рд╛рде рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдореИрдВ рдЕрдкрд╛рдЪреЗ рдХреЛ LetEncrypt SSL рдХреЗ рд╕рд╛рде рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдХреНрдпрд╛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реИ?

AWS Elastic BeanStalk рдкрд░ Node.js рдРрдк рдХреЛ рдкрд░рд┐рдирд┐рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реИред
рдореИрдВрдиреЗ рд╕рд░реНрд╡рд░ рдХреЗ рд░реВрдЯ рдореЗрдВ .ebextensions рдлрд╝реЛрд▓реНрдбрд░ рдЬреЛрдбрд╝рд╛ рд╣реИ, рдФрд░ рдЕрдВрджрд░ рдореИрдВрдиреЗ nginx.config рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝ рджреА рд╣реИ рдЬреЛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:

server:
  location /:
    proxy_pass http://localhost:8080;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;

рдореБрдЭреЗ рдЕрднреА рднреА 400 рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рд╕рднреА рд╕реЙрдХреЗрдЯ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП: рдпрд╣ рдПрдХрдорд╛рддреНрд░ рдХрд╛рд░реНрдпрд╢реАрд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕рдорд╛рдзрд╛рди рд╣реИ рдЬреЛ рдореБрдЭреЗ рд╕реЙрдХреЗрдЯ.рдЖрдИрдУ 1.x рдФрд░ рдЕрдкрд╛рдЪреЗ 2.4 рдХреЗ рд▓рд┐рдП рдорд┐рд▓рд╛: https://github.com/meteor/meteor/issues/3339#issuecomment -165188938

ProxyPass / http://localhost:3999/
ProxyPassReverse / http://localhost:3999/

RewriteEngine on
RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]
RewriteRule .* ws://localhost:3999%{REQUEST_URI} [P]

рджреВрд╕рд░реЗ рдкреЛрд░реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдпрд╣ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ

@BlaM рдХрд╛рдордХрд╛рдЬреА рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдПрдбрдмреНрд▓реНрдпреВрдПрд╕ рд▓реЛрдЪрджрд╛рд░ рдмреАрдирд╕реНрдЯреЙрдХ рдореЗрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП, рдЗрд╕ .ebextension рдлрд╝рд╛рдЗрд▓ рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛:

files:
    "/etc/nginx/conf.d/01_websockets.conf" :
        mode: "000644"
        owner: root
        group: root
        content : |
            upstream nodejs {
                server 127.0.0.1:8081;
                keepalive 256;
            }

            server {
                listen 8080;

                location / {
                    proxy_pass  http://nodejs;
                    proxy_set_header Upgrade $http_upgrade;
                    proxy_set_header Connection "upgrade";
                    proxy_http_version 1.1;
                    proxy_set_header        Host            $host;
                    proxy_set_header        X-Real-IP       $remote_addr;
                    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                }
            }

    "/opt/elasticbeanstalk/hooks/appdeploy/enact/41_remove_eb_nginx_confg.sh":
        mode: "000755"
        owner: root
        group: root
        content : |
            mv /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf.old

рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рджрд┐рдП рдЧрдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ред

@BlaM - рдореИрдВ рдЗрд▓рд╛рд╕реНрдЯрд┐рдХ рдмреАрди рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдкрд╛рдЪреЗ рд╕рд░реНрд╡рд░ рдФрд░ ELB рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ
рдореБрдЭреЗ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб рдХрд╣рд╛рдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП?
рдзрдиреНрдпрд╡рд╛рдж!

рдореБрдЭреЗ рд▓реЛрдЪрджрд╛рд░ рдмреАрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЬреЛ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИ рд╡рд╣ рдЕрдкрд╛рдЪреЗ рд╣реЛрд╕реНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИред

@tylercb рдзрдиреНрдпрд╡рд╛рдж! рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ ~

рдХреЛрдИ рднреА nginx рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ?

рд╣рд╛рдБ, рдореИрдВ рдЗрд▓рд╛рд╕реНрдЯрд┐рдХ рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд░ рдХреЗ рдмрд┐рдирд╛ рдПрдХрд▓ рд╕рд░реНрд╡рд░ (рдиреЛрдб рдФрд░ nginx) рдХреЗ рд╕рд╛рде рдЗрд▓рд╛рд╕реНрдЯрд┐рдХ рдмреАрдирд╕реНрдЯреЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд╛рди рдореБрджреНрджреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред
рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ http/https рд╕реЗ ssl/tls . рдореЗрдВ рдХреИрд╕реЗ рдмрджрд▓реЗрдВ

рдпрд╣рд╛рдБ HAProxy рдХреЗ рд╕рд╛рде рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ

рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛ред рдзрдиреНрдпрд╡рд╛рджред рдФрд░ рдЖрдкрдХреЛ рдЖрджреЗрд╢ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП

proxy_set_header   Upgrade $http_upgrade;
proxy_set_header   Connection "upgrade";

рд╣рд╛рдБ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ред

рдореИрдВ рднреА рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред 400 рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рднреА, рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдХреЗ рдмреАрдЪ рд╡реЗрдмрд╕реЛрдХреЗрдЯ рд╕рдВрдЪрд╛рд░ рдареАрдХ рд╣реИред рдпрд╣ рд╣рдорд╛рд░реЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдорд╛рд╣реМрд▓ рдореЗрдВ рд╣реИред

рдХреНрдпрд╛ рдХреЛрдИ рдореБрдЭреЗ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЙрддреНрдкрд╛рджрди рдХреЗ рдорд╛рд╣реМрд▓ рдореЗрдВ рдПрдХ рдореБрджреНрджрд╛ рд╣реЛрдЧрд╛ред

рдПрдлрд╡рд╛рдИрдЖрдИ: рдкреЛрд╕реНрдЯрдЧреНрд░реЗрд╕ рдПрдбрдСрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣реЗрд░реЛрдХреВ рдкрд░ рд╣реЛрд╕реНрдЯ рдХрд┐рдП рдЧрдП рд╕реЙрдХреЗрдЯ.рдЖрдИрдУ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕реЗрд▓ рдмреИрдХрдПрдВрдб рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рдЖрдкрдХреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдпрд╣ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХ рджреЗрдЧрд╛ рдпрджрд┐ рдЖрдкрдХрд╛ io.sails.url https рдирд╣реАрдВ рд╣реИред рдмрд╣реБрдд рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдорд▓рд╛ рд▓реЗрдХрд┐рди рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ Google рдкрд░ рдЗрд╕реЗ рдЦреЛрдЬрдиреЗ рд╡рд╛рд▓реЗ рд╕рдорд╛рди рд╕реНрдЯреИрдХ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреА рд╕рд╣рд╛рдпрддрд╛ рдХрд░рддрд╛ рд╣реИ

рд╕рдмрдХреЛ рдирдореНрд╕реНрдХрд╛рд░,

рдореБрдЭреЗ рдЕрдкрдиреА рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рдорд╢реАрди рдкрд░ рднреА рдЗрд╕реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝ рд░рд╣рд╛ рд╣реИред рд╣рдо рдПрдХ рд╕рд░реНрд╡рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рдпрдерди-рдлреНрд▓рд╛рд╕реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдПрдЪрдЯреАрдПрдордПрд▓/рд╕реАрдПрд╕рдПрд╕/рдЬреЗрдПрд╕ рдлреНрд░рдВрдЯрдПрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рд╡реЗрдмрд╕реЛрдХреЗрдЯ рд╕рд░реНрд╡рд░ рд╕реЗ рдЬреБрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдлреНрд░рдВрдЯрдПрдВрдб рдореЗрдВ рд╣рдордиреЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ
var socket = io.connect('ws://url/namespace', { 'transports': ['websocket'] });

рдЬрдм рдореИрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓рд╛рддрд╛ рд╣реВрдВ рддреЛ рдпрд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрддрд╛ рд╣реИ
WebSocket connection to 'ws://url/namespace/socket.io/?EIO=3&transport=websocket' failed: Error during WebSocket handshake: Unexpected response code: 400

рдЕрдЧрд░ рдЖрдкрдХреЛ рдФрд░ рдЬрд╛рдирдХрд╛рд░реА рдЪрд╛рд╣рд┐рдП рддреЛ рд╣рдореЗрдВ рдмрддрд╛рдПрдВред

рдХрд┐рд╕реА рднреА рдорджрдж рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред
рдЗрд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рд╕рд╛рджрд░
рдЕрдЬрдп

рдореБрдЭреЗ webrtc рдирдореВрдирд╛ рдРрдк рдкрд░ рдПрдХ рд╣реА рддреНрд░реБрдЯрд┐ рдорд┐рд▓реАред рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░, рдХреЛрдб рд╣реИ

var рд╕рд░реНрд╡рд░ = рдЖрд╡рд╢реНрдпрдХрддрд╛ ('http')ред рд╕рд░реНрд╡рд░ (рдРрдк);
var io = рдЖрд╡рд╢реНрдпрдХрддрд╛ ('рд╕реЙрдХреЗрдЯ.io') (рд╕рд░реНрд╡рд░);
var WebRTC = рдЖрд╡рд╢реНрдпрдХрддрд╛ ('../../');
рдРрдк.рдпреВрдЬрд╝ (рдПрдХреНрд╕рдкреНрд░реЗрд╕.рд╕реНрдЯреИрдЯрд┐рдХ (__dirname));
var io = рдЖрд╡рд╢реНрдпрдХрддрд╛ ('рд╕реЙрдХреЗрдЯ.io') (рд╕рд░реНрд╡рд░);

рджреВрд╕рд░реА "рдЖрд╡рд╢реНрдпрдХрддрд╛ ('socket.io')" рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж 400 рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдХреНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдФрд░ рдЦреБрджрд╛рдИ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ... рд▓реЗрдХрд┐рди рдЖрдк рдЬрд╛рдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХрд╛ рдРрдк рджреЛ рдмрд╛рд░ рдПрдХ рд╣реА рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рд╣реЗ рджреЛрд╕реНрддреЛрдВ, рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЪрд░реНрдЪрд╛ рдХреБрдЫ рд╕рдордп рд╕реЗ рдЪрд▓ рд░рд╣реА рд╣реИ рдФрд░ рдПрдХ рд╕рдВрд╕рд╛рдзрди рдкреЛрд╕реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рдПрдбрдмреНрд▓реНрдпреВрдПрд╕ рдИрдмреАрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд░ рдХреЗ рд╕рд╛рде рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред

https://mixmax.com/blog/deploying-meteor-to-elastic-beanstalk-1

рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдорджрдж рдХрд░рддрд╛ рд╣реИред

рдЯреНрд░реИрд╡рд┐рд╕

рдЬрдм рдореИрдВ рдИрдерд░рдкреИрдб-рд▓рд╛рдЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реЛрддреА рд╣реИред
рдореБрдЭреЗ Apache ProxyPass рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдорд┐рд▓рд╛ред
рдореИрдВ рдЕрдкрд╛рдЪреЗ http 2.2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, http 2.4 wstunnel рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдмреИрдХрдкреНрд░реЛрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ v.2.4 рдХреЛ рднреА рдареАрдХ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдореИрдВрдиреЗ socket.io-client/socket.io.js . рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рд╣реИ
WS.prototype.uri = function() рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВ
return schema + '://' + (ipv6 ? '[' + this.hostname + ']' : this.hostname) + port + this.path + query;
рдлрд┐рд░ рдЗрд╕рдореЗрдВ рдмрджрд▓реЗрдВ:

return schema + '://' + (ipv6 ? '[' + this.hostname + ']' : this.hostname) + port + this.path +'ws/'+ query;
рдЗрд╕реЗ рд╕рд╣реЗрдЬреЗрдВ рдФрд░ рдиреЛрдб рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░реЗрдВред

рджреВрд╕рд░рд╛, vhost.conf рдпрд╛ ssl.conf рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ
рд╡рд░реНрдЪреБрдЕрд▓рд╣реЛрд╕реНрдЯ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреЛрдбрд╝реЗрдВ:

        ProxyPass "/etherpad/socket.io/ws/" "ws://localhost:9001/socket.io/"
        ProxyPassReverse "/etherpad/socket.io/ws/" "ws://localhost:9001/socket.io/"

        ProxyPass "/etherpad/socket.io/" "http://localhost:9001/socket.io/"
        ProxyPassReverse "/etherpad/socket.io/" "http://localhost:9001/socket.io/"


        ProxyPass /etherpad/ http://localhost:9001/
        ProxyPassReverse /etherpad/ http://localhost:9001/
        CacheDisable *

        ProxyPreserveHost on
        <Proxy *>
                Options FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Proxy>

`

рдЕрдкрд╛рдЪреЗ httpd рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░реЗрдВ, рдЖрдирдВрдж рд▓реЗрдВ~

рдЕрдкрд╛рдЪреЗ рдХреЗ рд▓рд┐рдП, @cpres рдЙрддреНрддрд░ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ, рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореЗрд░реА рдЬрд╛рдирдХрд╛рд░реА

<VirtualHost *:80>
    ServerAdmin [email protected]
    ServerName reservation.tinker.press

    DocumentRoot /var/www/html/node-js-order-socket-demo
    <Directory />
        Options -Indexes +FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>

    RewriteEngine on
    RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
    RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]
    RewriteRule .* ws://127.0.0.1:3001%{REQUEST_URI} [P]

    ProxyRequests Off
    ProxyPreserveHost On
    ProxyVia Full
    <Proxy *>
        Require all granted
    </Proxy>

    ProxyPass / "http://127.0.0.1:3001/"
    ProxyPassReverse / "http://127.0.0.1:3001/"

    ErrorLog ${APACHE_LOG_DIR}/error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

apache-websocket-use-mode-rewrite

рдореБрдЭреЗ рдкреЛрд░реНрдЯ 80 рдкрд░ HTTP рдХреЗ рдмрдЬрд╛рдп рдкреЛрд░реНрдЯ 80 рдкрд░ рдЯреАрд╕реАрдкреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд▓реЛрдЪрджрд╛рд░ рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд░ рдХреЛ рднреА рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рдкрдбрд╝рд╛ред

рдХреНрдпрд╛ рдХрдИ рдиреЛрдбреНрд╕ рдХреЗ рд╕рд╛рде ProxyPass рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ? рдореИрдВ https://github.com/socketio/socket.io/pull/2819 рдХреЗ рд▓рд┐рдП RewriteRule рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдорд╛рдкреНрдд рд╣реБрдЖ:

Header add Set-Cookie "SERVERID=sticky.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED

<Proxy "balancer://nodes_polling">
    BalancerMember "http://server-john:3000"    route=john
    BalancerMember "http://server-paul:3000"    route=paul
    BalancerMember "http://server-george:3000"  route=george
    BalancerMember "http://server-ringo:3000"   route=ringo
    ProxySet stickysession=SERVERID
</Proxy>

<Proxy "balancer://nodes_ws">
    BalancerMember "ws://server-john:3000"    route=john
    BalancerMember "ws://server-paul:3000"    route=paul
    BalancerMember "ws://server-george:3000"  route=george
    BalancerMember "ws://server-ringo:3000"   route=ringo
    ProxySet stickysession=SERVERID
</Proxy>

RewriteEngine On
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteRule /(.*) balancer://nodes_ws/$1 [P,L]
RewriteCond %{HTTP:Upgrade} !=websocket [NC]
RewriteRule /(.*) balancer://nodes_polling/$1 [P,L]

@darrachequesne рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд┐рдпрд╛! рдзрдиреНрдпрд╡рд╛рдж

рдзрдиреНрдпрд╡рд╛рдж!

рдХрд┐рд╕реА рдРрд╕реЗ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕реЗ рдЕрднреА рднреА AWS рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд░ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдЕрдкрдиреА рд╕реБрд░рдХреНрд╖рд╛ рдиреАрддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рдореИрдВ рдЙрд╕реА рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛, рднрд▓реЗ рд╣реА рдпрд╣ рдХрд┐рд╕реА рдЕрдиреНрдп рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП рд╕рдЯреАрдХ рд╕реЗрдЯрдЕрдк рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдареАрдХ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рджреЗрдЦрд╛ рдХрд┐ рд╕реБрд░рдХреНрд╖рд╛ рдиреАрддрд┐ рд▓рдЧрднрдЧ 1 рд╡рд░реНрд╖ рдкреАрдЫреЗ рдереАред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдПрдХ рдирдП рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИ рд╣реИред

Nginx рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рднреА рдореИрдВ рд╕рдЯреАрдХ рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдШрд░реНрд╖ рдХрд░ рд░рд╣рд╛ рдерд╛ред
рд▓реЗрдХрд┐рди @visibleajay рдиреЗ рд╡рд╣ рдЯрд┐рдкреНрдкрдгреА рдХреА рдФрд░ рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдореИрдВрдиреЗ io.connect рдХрдорд╛рдВрдб рдореЗрдВ {'transports': ['websocket'] } рднрд╛рдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ред

рддреЛ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рднреА рдЬреЛ рдПрдХ рд╣реА рдкрд░реЗрд╢рд╛рдиреА рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ,
var socket = io.connect('https://server.com/socket.io-path-here', { 'transports': ['websocket'] });

рд╕рд╣реА nginx рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░ рдХрд╛рдо рдХрд┐рдпрд╛ред

@ fot1 рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ { 'transports': ['websocket'] } рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЬрдм рд╡реЗрдмрд╕реЛрдХреЗрдЯ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддреЛ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдорддрджрд╛рди рдореЗрдВ рдХреЛрдИ рдХрдореА рдирд╣реАрдВ рд╣реИред

Nginx рдХреЗ рд╕рд╛рде рдкреВрд░рд╛ рдЙрджрд╛рд╣рд░рдг: https://github.com/socketio/socket.io/tree/master/examples/cluster-nginx

@darrachequesne рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЖрдк рд╕рд╣реА рд╣реИрдВ, рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдореИрдВ 'рд╡реЗрдмрд╕реЛрдХреЗрдЯ' 'рдорддрджрд╛рди', рдпрд╛ 'xhr-рдорддрджрд╛рди' рдХреЗ рд╕рд╛рде рд╕рд░рдгреА рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░реВрдВ? рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

@ fott1 рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ ['polling', 'websocket'] ( рд░реЗрдлрд░реА ) рд╣реИред

рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рд╕рд╣реА nginx рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдХреНрдпреЛрдВрдХрд┐ polling ( websocket рдХреЗ рд╡рд┐рдкрд░реАрдд) рдкрд░рд┐рд╡рд╣рди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдПрдХ рд╣реА socket.io рд╕рд░реНрд╡рд░ рдкрд░ рднреЗрдЬрд╛ рдЬрд╛рдПред

@darrachequesne рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВред рдпрджрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХрд╛рдзрд┐рдХ рд╕рд░реНрд╡рд░ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рддреЛ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЛ рдПрдХ рд╣реА рдЙрджрд╛рд╣рд░рдг рдкрд░ рднреЗрдЬрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? рдЕрдЧрд░ рдореИрдВ рдЧрд╝рд▓рдд рд╣реВрдВ рддреЛ рдореЗрд░реА рдЧрд▓рддреА рд╕реБрдЭрд╛рдПрдВред рдЯрд┐рдк рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

@ fott1 рд╣рд╛рдБ, рдпрд╣ рд╕рд╣реА рд╣реИред рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдпрд╣рд╛рдБ рд╣реИ: https://socket.io/docs/using-multiple-nodes/

FWIW - рдореИрдВ рдЗрд╕реЗ рдЕрдкрдиреЗ рд╕реНрдерд╛рдиреАрдп (рдХреЛрдИ nginx, рдХреЛрдИ рдкреНрд░реЙрдХреНрд╕реА рдирд╣реАрдВ) рдкрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣рд╛ рдерд╛ред рд╕реЙрдХреЗрдЯ рдХреЗ рд╕рд╛рде рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддрд╛ рд╣реИред io рдЖрдкрдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рджреЛрдиреЛрдВ рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ рдХреЛ рдкрд╣рд▓реЗ рд╡реЗрдмрд╕реЛрдХреЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдлрд┐рд░ рдорддрджрд╛рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдкрддрд╛ рдирд╣реАрдВ рдХреНрдпреЛрдВ рдпрд╣ рд╕рд┐рд░реНрдл рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдпрд╛ рд╢рд╛рдпрдж рдореИрдВ рдЗрд╕реЗ рдЧрд▓рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдБред

рд╣рдорд╛рд░реА рдореВрд▓ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рдереА рдХрд┐ рд╣рдордиреЗ рд╡реЗрдмрд╕реЛрдХреЗрдЯ рд╕реЗ рдкрд╣рд▓реЗ рдорддрджрд╛рди рдХрд┐рдпрд╛ рдерд╛, рдпрд╣ рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдЖрджреЗрд╢ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИред

рдореВрд▓ рд╕реЗрдЯрдЕрдк:
рд╕рд░реНрд╡рд░:
io.set('transports', ['polling', 'websocket']);
рдЧреНрд░рд╛рд╣рдХ:
var socket = io.connect(server, { reconnect: true });

рд╣рдордиреЗ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рд╣рдорд╛рд░рд╛ рдХреНрд▓рд╛рдЗрдВрдЯ рдорддрджрд╛рди рдХрд░ рд░рд╣рд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рдЙрд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ред рдлрд┐рд░ рд╕рдм рдХреБрдЫ рд╡рд┐рдлрд▓ рд╣реЛрдиреЗ рд▓рдЧрд╛ рдФрд░ рд╣рдореЗрдВ 400 рдЦрд░рд╛рдм рдЕрдиреБрд░реЛрдз рдорд┐рд▓рд╛ред

рддреЛ рдЕрдВрдд рдореЗрдВ рд╣рдореЗрдВ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЖрдкрдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рджреЛрдиреЛрдВ рдореЗрдВ рдСрд░реНрдбрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдпрджрд┐ рдЖрдк рдХреНрд▓рд╛рдЗрдВрдЯ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╕реАрдзреЗ рдорддрджрд╛рди рдХреЗ рд▓рд┐рдП рдЬрд╛рдПрдВрдЧреЗ, рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдХрдо рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ websocket рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реЛрдЧрд╛ред

рдареАрдХ рдХрд░:
рд╕рд░реНрд╡рд░:
io.set('transports', ['websocket', 'polling']);
рдЧреНрд░рд╛рд╣рдХ:
var socket = io.connect(server, { reconnect: true, transports: ['websocket', 'polling'] });

рдлрд┐рд░ рд╕реЗ, рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ { 'transports': ['websocket', 'polling'] } рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЬрдм рд╡реЗрдмрд╕реЛрдХреЗрдЯ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддреЛ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдорддрджрд╛рди рдореЗрдВ рдХреЛрдИ рдХрдореА рдирд╣реАрдВ рд╣реИред

рдЖрдЗрдП рдЙрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд░реЗрдВ, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдХреГрдкрдпрд╛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓реЗрдВред

рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдХреЗ рдХреБрдЫ рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЗ рд╕рдорд╛рди рд╕реНрдерд╛рди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдЗрд▓рд╛рд╕реНрдЯрд┐рдХ рдмреАрдирд╕реНрдЯреЙрдХ рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ nginx рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ "рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд" рдХрд░рдиреЗ рдХрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд▓рд┐рдпрд╛ред рдЗрд╕ рддрд░рд╣ рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдПрдВ:

 ~/рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░/рдорд╛рдИ-рдРрдк/
 |-- .ebextensions
 | `-- nginx
 | `-- conf.d
 | `-- myconf.conf
 `-- web.jar

рдЬрд╣рд╛рдВ myconf.conf , рдЬрд┐рд╕рдХрд╛ рдирд╛рдо рддрдм рддрдХ рдордирдорд╛рдирд╛ рд╣реИ рдЬрдм рддрдХ рд╡рд╣ .conf рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ:

 рд╕рд░реНрд╡рд░ {
 рд╕реНрдерд╛рди / {
 рдкреНрд░реЙрдХреНрд╕реА_рдкрд╛рд╕ http://127.0.0.1:5000;
 рдкреНрд░реЙрдХреНрд╕реА_http_рд╕рдВрд╕реНрдХрд░рдг 1.1;
 рдкреНрд░реЙрдХреНрд╕реА_рд╕реЗрдЯ_рд╣реЗрдбрд░ рдЕрдкрдЧреНрд░реЗрдб $http_upgrad;
 рдкреНрд░реЙрдХреНрд╕реА_рд╕реЗрдЯ_рд╣реЗрдбрд░ рдХрдиреЗрдХреНрд╢рди "рдЕрдкрдЧреНрд░реЗрдб";
 рдкреНрд░реЙрдХреНрд╕реА_рд╕реЗрдЯ_рд╣реЗрдбрд░ рд╣реЛрд╕реНрдЯ $ рд╣реЛрд╕реНрдЯ;
 }
 }

рдкреЛрд░реНрдЯ рдирдВрдмрд░ рдХреЛ рдЕрдкрдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВред

рдореИрдВрдиреЗ рдХреЗрд╡рд▓ {рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ: ['рдорддрджрд╛рди'] } рдЬреЛрдбрд╝рдХрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд┐рдпрд╛ред

_

рд╡рд░ рд╕реЙрдХреЗрдЯ = io.connect (рд╕рд░реНрд╡рд░, {рдкрд░рд┐рд╡рд╣рди: ['рдорддрджрд╛рди']});

_

@ hyewon330 рдпрджрд┐ рдЖрдкрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ _рд╕рдорд╛рдзрд╛рди_ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рддреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реА рдмрд╛рд░ рдореЗрдВ websockets рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ socket.io рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рд╣реИред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдЪрд▓рд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рдЖрдк socket.io рдХреЛ рдорддрджрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рднрд▓реЗ рд╣реА рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдХреЗ рдмреАрдЪ рдХрдиреЗрдХреНрд╢рди _would_ websockets рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реЛред рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдмрд╕ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ

Nginx рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП, @tylercb рд╕рдорд╛рдзрд╛рди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдиреЗ рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЪрдордХрджрд╛рд░ рдРрдкреНрд╕ рдХреЗ рд╕рд╛рде рдареАрдХ рдХрд░ рджрд┐рдпрд╛ред рдкреНрд░реАрдлреЗрдХреНрдЯ

@tylercb @rudolfschmidt @juanjoLenero @rwillett @cpres рд╣реИрд▓реЛ, рдореИрдВ рдЖрдкрдХреА рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ 8080 рдХреЗ рдмрдЬрд╛рдп рдЕрдиреНрдп рдкреЛрд░реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рдРрдк рдХреЛ рдЖрдИрдкреА 170.8.8.8 рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ рдкреЛрд░реНрдЯ 5000 рдХреЗ рд╕рд╛рде рдорд╢реАрди рдП рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдореИрдВрдиреЗ рдорд╢реАрди рдмреА рдореЗрдВ рдЖрдИрдкреА 170.8.8.2 рдХреЗ рд╕рд╛рде nginx рднреА рдкреЛрд░реНрдЯ 5000 рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХреА рд╣реИред рддреЛ рдореИрдВ рдмреА рдореЗрдВ рдЖрдИрдкреА: 5000 рдкрд░ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдП рдореЗрдВ рдЖрдИрдкреА: 5000 рдкрд░ рдЬрд╛рдПрдВред рдиреАрдЪреЗ рдорд╢реАрди рдмреА рдореЗрдВ рдореЗрд░рд╛ nginx рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реИ:

upstream cuitccol.com{ #the name of server cluster
        server 170.8.8.8:5000 max_fails=5 fail_timeout=50s; #for the first web server
        }

    server {
        listen       5000;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            proxy_pass http://cuitccol.com;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
        } 

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд╣рд╛рдВ рдЧрд▓рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдк рдХреБрдЫ рд╕рд▓рд╛рд╣ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ?
рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж~
рдЖрдкрдХреЗ рдЙрддреНрддрд░ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВрдВ

рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рд╕рд╛рдордирд╛ рд╕реНрдерд╛рдиреАрдп рд╕рд╣рд┐рдд рд╣рд░ рдПрдирд╡реА рдореЗрдВ рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП рдХрд░ рд░рд╣рд╛ рд╣реВрдВред @darrachequesne рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдореБрдЭреЗ рдФрд░ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдФрд░ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рдиреЛрдб рдЬреЗрдПрд╕ рд╣реИ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ socket.io "рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ" рдЕрдиреБрднрд╛рдЧ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИ:

var app = require('express')();
var server = require('http').createServer(app);
var io = require('socket.io')(server);
io.on('connection', function(){ /* тАж */ });
server.listen(3000);

рдФрд░ рдореИрдВрдиреЗ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ socket.io-client "рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ" рдЕрдиреБрднрд╛рдЧ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИ:

<script src="/socket.io/socket.io.js"></script>
<script>
  var socket = io('http://localhost:3000');
  socket.on('connect', function(){});
  socket.on('event', function(data){});
  socket.on('disconnect', function(){});
</script>

рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдХрдиреЗрдХреНрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдореБрдЭреЗ рдпрд╣реА рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд░рд╣рддреА рд╣реИ:

'ws:// localhost:3000/socket.io/?EIO=3&transport=websocket&sid=EWl2jAgb5dOGXwScAAAB ' рд╕реЗ рд╡реЗрдмрд╕реЙрдХреЗрдЯ рдХрдиреЗрдХреНрд╢рди рд╡рд┐рдлрд▓: рд╡реЗрдмрд╕реЙрдХреЗрдЯ рд╣реИрдВрдбрд╢реЗрдХ рдХреЗ рджреМрд░рд╛рди рддреНрд░реБрдЯрд┐: рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛрдб: 400

рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрдВрд╕реЛрд▓ рдХреЛ рджреЗрдЦрддреЗ рд╕рдордп, рддреНрд░реБрдЯрд┐ websocket.js рд╕реЗ рд▓рд╛рдЗрди 112 рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░ рд░рд╣реА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ:

try {
    this.ws = this.usingBrowserWebSocket ? (protocols ? new WebSocket(uri, protocols) : new WebSocket(uri)) : new WebSocket(uri, protocols, opts);
  } catch (err) {
    return this.emit('error', err);
  }

рдХрд┐рд╕реА рднреА рд╡рд┐рдЪрд╛рд░ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░реЗрдВ ...

@rafapetter рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдЖрдкрдХреЛ рд╕реЙрдХреЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

Socket.io рдХреНрд▓рд╛рдЗрдВрдЯ рдореЗрдВ рдмрд╕ {transports: ['websocket']} рд╡рд┐рдХрд▓реНрдк рдЬреЛрдбрд╝рдирд╛ред

рдРрд╕реЗ рджрд┐рдЦрддреЗ рд╣реИрдВред

import io from 'socket.io-client'
const socket = io('http://localhost:5000', {transports: ['websocket']})

рд╕рд░реНрд╡рд░ рдкрд░ @spookyUnknownUser рд╕реЙрдХреЗрдЯ.io рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

@prapansak рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓ рд╣реИ, рдПрдХ window.onload рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░, рдХреЛрдИ ES6 рдЖрдпрд╛рдд рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЕрдиреБрднрд╛рдЧ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реВрдВ:
<script src="/socket.io/socket.io.js"></script>

рдФрд░ рдЬреИрд╕рд╛ рдЖрдкрдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рд╣реИ рд╕реЙрдХреЗрдЯ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп:
const socket = io('http://localhost:5000', {transports: ['websocket']})

рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ: 'ws: // localhost: 1337/socket.io/?EIO=3&transport=websocket ' рд╕реЗ рд╡реЗрдмрд╕реЙрдХреЗрдЯ рдХрдиреЗрдХреНрд╢рди рд╡рд┐рдлрд▓: рдЕрдорд╛рдиреНрдп рдлреНрд░реЗрдо рд╣реЗрдбрд░

рдзрдиреНрдпрд╡рд╛рдж рджреЛрд╕реНрддреЛрдВ, рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рдЕрдиреНрдп рд╡рд┐рдЪрд╛рд░ рд╣реИ рддреЛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдФрд░ рдореИрдВ рдЗрд╕реЗ рдпрд╣рд╛рдВ рдЖрдЬрдорд╛рдЙрдВрдЧрд╛ред

рдареАрдХ рд╣реИ, рдЕрдВрдд рдореЗрдВ рдЗрд╕реЗ рд╣рд▓ рдХрд░ рд▓рд┐рдпрд╛!

@spookyUnknownUser рдЖрдкрдХрд╛ рд╡рд┐рдЪрд╛рд░ рдореБрдЭреЗ рджреЛрд╣рд░рд╛рд╡ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИред рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рд╕рд░реНрд╡рд░ рдкрд░ рд╕рд░реНрд╡рд░ рдХреЗ рдареАрдХ рдмрд╛рджред рд╕реБрдиреЛ рдореИрдВ рдпрд╣ рдХрд░ рд░рд╣рд╛ рдерд╛:

io.attach(server, {
  pingInterval: 40000,
  pingTimeout: 25000,
});

рдЬреЛ рдПрдХ рддрд░рд╣ рд╕реЗ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рд░реНрд╡рд░ рдХреЛ рджреВрд╕рд░реА рдмрд╛рд░ рдЕрдЯреИрдЪ рдХрд░ рд░рд╣рд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдФрд░ рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╣реА, рдЬрдм socket.io рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рддреЛ рдореИрдВрдиреЗ рдЗрд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ:

var io = require('socket.io')(server, {
    'pingInterval': 40000,
    'pingTimeout': 25000
});

рдЕрдм, рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рджрд┐рдЦрд╛рдИ рдЬрд╛рддреА рд╣реИ, рдФрд░ рд╕рдм рдХреБрдЫ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЕрдВрддрд░реНрджреГрд╖реНрдЯрд┐ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдзрдиреНрдпрд╡рд╛рдж рджреЛрд╕реНрддреЛрдВ

рдореЗрд░реЗ рдкрд╛рд╕ рдИрдмреАрдПрд╕ (рдПрдбрдмреНрд▓реНрдпреВрдПрд╕ рд▓реЛрдЪрджрд╛рд░ рдмреАрдирд╕реНрдЯреЙрдХ) рдкрд░ рдореЗрд░рд╛ рд╕реЙрдХреЗрдЯ рд╕рд░реНрд╡рд░ рд╣реИред рдореБрдЭреЗ рдЙрддреНрдкрд╛рджрди рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рд▓реЗрдХрд┐рди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд░ рдореЗрдВ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рдФрд░ ngnix рдпрд╛ apache рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдмрджрд▓реЗ рдмрд┐рдирд╛ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░ рд╕рдХрддрд╛ рдерд╛ред

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдЬреЛ рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдП: https рдХреЗ рдмрдЬрд╛рдп, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреЛрд░реНрдЯ рдкрд░ 443 рдкрд░ ssl рдХреА рдЕрдиреБрдорддрд┐ рджреА рдФрд░ рдореЗрд░реЗ рд╕реБрд░рдХреНрд╖рд╛ рд╕рдореВрд╣ рдкрд░ рдкреЛрд░реНрдЯ 443 рдЦреЛрд▓рд╛

ebs_lb
ebs_sg

рдПрдбрдмреНрд▓реНрдпреВрдПрд╕ рдкрд░ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП: рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдиреЗ рд▓рдХреНрд╖реНрдп рд╕рдореВрд╣ рдкрд░ рдЪрд┐рдкрдЪрд┐рдкрд╛рдкрди рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рд╣реИред

рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдпрд╣ рд╣рдорд╛рд░реЗ рд╕рд░реНрд╡рд░ рдкрд░ рд░реБрдХ-рд░реБрдХ рдХрд░ рд╣реЛ рд░рд╣рд╛ рдерд╛ рдЬрдм рдпрд╣ рдЕрддрд┐рднрд╛рд░рд┐рдд рдерд╛ рдФрд░ рдкреАрдХ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рдордп рдХреЗ рднреАрддрд░ рдерд╛ред

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╕рдордп io.connect рдмрдВрдж рд╣реЛрдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж XHR рдЕрдиреБрд░реЛрдз рдФрд░ WS рдЕрдиреБрд░реЛрдз рдмрдирд╛рддрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред рдпреЗ рд╕рднреА XHR рдЕрдиреБрд░реЛрдз рд╕рд░реНрд╡рд░ рдХреЛ рдУрд╡рд░рд▓реЛрдб рдХрд░ рд░рд╣реЗ рдереЗ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ 400 рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рд░рд╣реЗ рдереЗред рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рдореЗрдВ transports: ['websocket']} рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдКрдкрд░ рджрд┐рдП рдЧрдП рд╕реБрдЭрд╛рд╡реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЕрдЧрд░ 400 рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдмрдиреА рд░рд╣рддреА рд╣реИрдВ рддреЛ рдПрдХ рдЕрдкрдбреЗрдЯ рдкреЛрд╕реНрдЯ рдХрд░реЗрдВрдЧреЗ рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рдХреЗ рд▓рд┐рдП рдареЛрд╕ рд▓рдЧрддрд╛ рд╣реИред

рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ, рди рддреЛ рдКрдкрд░ рд╕реБрдЭрд╛рдП рдЧрдП рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдиреЗ рдЗрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ред рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдкрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ socket = io.connect(); рд╣реИ рдФрд░ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ рдХрд┐ рдореИрдВ рдХрд┐рд╕ рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП server рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдПрдХ рддрд░рд╣ рдХреА рдкрд░реЗрд╢рд╛рдиреА рд╣реИ рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдореИрдВ { reconnect: true, transports: ['websocket', 'polling'] } рдХреИрд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ? рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ #1 рд╣реИ, рд▓реЗрдХрд┐рди рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреИрд░рд╛рдореАрдЯрд░ #2 рд╣реИ

рдореИрдВрдиреЗ рдЗрд╕реЗ рдиреАрдЪреЗ рдЬреЛрдбрд╝рд╛, рдФрд░ рдЗрд╕рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛ред
рд╕реНрдерд╛рди / {
рдкреНрд░реЙрдХреНрд╕реА_рдкрд╛рд╕ http://localhost :8080;
рдкреНрд░реЙрдХреНрд╕реА_http_рд╕рдВрд╕реНрдХрд░рдг 1.1;
рдкреНрд░реЙрдХреНрд╕реА_рд╕реЗрдЯ_рд╣реЗрдбрд░ рдЕрдкрдЧреНрд░реЗрдб $http_upgrad;
рдкреНрд░реЙрдХреНрд╕реА_рд╕реЗрдЯ_рд╣реЗрдбрд░ рдХрдиреЗрдХреНрд╢рди "рдЕрдкрдЧреНрд░реЗрдб";
рдкреНрд░реЙрдХреНрд╕реА_рд╕реЗрдЯ_рд╣реЗрдбрд░ рд╣реЛрд╕реНрдЯ $ рд╣реЛрд╕реНрдЯ;
}
https://chrislea.com/2013/02/23/proxying-websockets-with-nginx/

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдореБрдЭреЗ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрдЪреНрдЫреЗ рд╣реЗрдбрд░ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рднреА .. рдореИрдВрдиреЗ рдЕрдкрдиреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдмрдирд╛рдпрд╛ рд╣реИ ..

https://stackoverflow.com/questions/50431587/proxy-socket-io-fails-to-connect-with-nginx-node-on-docker

рдпрд╣рд╛рдВ рджреЛрд╣рд░реЗ рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрдиреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ:

рдкреНрд░реЙрдХреНрд╕реА_рд╕реЗрдЯ_рд╣реЗрдбрд░ рдХрдиреЗрдХреНрд╢рди "рдЕрдкрдЧреНрд░реЗрдб";

рдореБрдЭреЗ рдпрд╣ рд╕рдВрджреЗрд╢ рд╕рд┐рдВрдЧрд▓ рдХреЛрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ рд▓реЗрдХрд┐рди рдбрдмрд▓реНрд╕ рдХреЛрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рд╣рд▓ рдХрд░ рджрд┐рдпрд╛ред

рд╕рдорд╕реНрдпрд╛ рдирд┐рд╡рд╛рд░рдг рдХреЗ рд▓рдЧрднрдЧ рдПрдХ рдШрдВрдЯреЗ рдХреЗ рдмрд╛рдж, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдЕрдкрдирд╛ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рд╛ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред

рдпрд╣рд╛рдБ рджреЗрдЦреЗрдВ

tylercb рд╕рдорд╛рдзрд╛рди рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛ (NgInx)ред рдзрдиреНрдпрд╡рд╛рдж!

рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХреБрдВрдЬреА proxy_http_version 1.1; @tylercb рдХреЗ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдереА

рдореИрдВрдиреЗ рдЙрди рдХрдИ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЕрдкрдиреЗ рд╕рд░реНрд╡рд░ рдкрд░ NginX рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕рдВрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдпрд╣ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕рд░реНрд╡рд░ рдкреБрдирд░рд╛рд░рдВрдн рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдЦрд░рд╛рдм рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЬреНрдпрд╛рджрд╛рддрд░ рд╣рд╛рд░реНрдб-рд░рд┐рдлреНрд░реЗрд╢ рдХреЗ рд╕рд╛рдеред рдмрд╛рдж рдореЗрдВ рдпрд╣ рдмреЗрд╣рддрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдмрд╕ рдХрднреА-рдХрднреА рд╣рд╛рд░реНрдб рд░рд┐рдлреНрд░реЗрд╢ рдХреА рдЬрд░реВрд░рдд рд╣реЛрддреА рд╣реИред
рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ sails lift рдХреЗ рд╕рд╛рде рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ sails lift --prod рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рд╡рд╣реА рдЪреАрдЬрд╝ рдорд┐рд▓рддреА рд╣реИ, рд╡рд╣ рд╕реЙрдХреЗрдЯ рдХрдиреЗрдХреНрдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ 400 рдЦрд░рд╛рдм рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реЛрддреА рд╣реИред рд▓реЗрдХрд┐рди рдХреБрдЫ рдХреЛрд╢рд┐рд╢реЛрдВ рдХреЗ рдмрд╛рдж рдпрд╣ рдлрд┐рд░ рд╕реЗ рд╕реНрдерд┐рд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрднреА рднреА рд╣рд▓ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ - рдХреЛрдИ рдЕрдВрддрд┐рдо рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдорд┐рд▓рд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реИ ..

рдореИрдВрдиреЗ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдиреНрдпрд╛рд╕ рдЬреЛрдбрд╝реЗ: https://socket.io/docs/using-multiple-nodes/

рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рд╕реБрдЭрд╛рд╡ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ! => https://github.com/socketio/socket.io-website

рдореБрдЭреЗ рдЕрднреА рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЕрднреА рднреА рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реА рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдореЗрд░реЗ nginx рдХреЛ рднреА рдЕрдХреНрд╖рдо рдХрд░ рджреЗрдВред рдЕрдВрдд рдореЗрдВ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдкрд░ express-status-monitor рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреА рд╡рдЬрд╣ рд╕реЗ рд╕рдорд╕реНрдпрд╛, рдпрд╣ рд╡реЗрдмрд╕рд╛рдХреЗрдЯ рдХреЗ рдкрд╣рд▓реЗ (рдЕрдиреБрд░реЛрдз) рд╣реИрдВрдбрд╢реЗрдХ рдкрд░ HTTP рдХреЙрд▓ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИред

рдореИрдВ рдЙрд╕ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдФрд░ рд╡реЗрдмрд╕реЙрдХреЗрдЯ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ

рд╣реИрдВрдбрд╢реЗрдХ рдХреЗ рджреМрд░рд╛рди рдЖрдкрдХреЛ 400 рдХреНрдпреЛрдВ рдорд┐рд▓реЗрдВрдЧреЗ, рдЗрд╕рдХреЗ рдХрдИ рдХрд╛рд░рдг рд╣реИрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреБрдЫ рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдЬрдорд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

  1. 443 рдЗрди (ufw/рдЕрдиреНрдп) рдлрд╝рд╛рдпрд░рд╡реЙрд▓ рдХреЗ рд╕рд╛рде-рд╕рд╛рде (AWS/Google рдХреНрд▓рд╛рдЙрдб/рдЕрдиреНрдп) рдХрдВрд╕реЛрд▓ рдХреА рд╕реЗрдЯрд┐рдВрдЧ рд╕рдХреНрд╖рдо рдХрд░реЗрдВ
  2. рдиреЛрдбрдЬ рд╕рд░реНрд╡рд░ рдореЗрдВ рдЯреАрдПрд▓рдПрд╕ рд╕рдХреНрд╖рдо рди рдХрд░реЗрдВред рдЗрд╕реЗ nginx рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд░реЗрдВред
  3. рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд nginx рд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВ
    рдиреЛрдЯ: рдпрд╣ рдХреЗрд╡рд▓ рддрднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рдЖрдкрдХрд╛ рд╕реЙрдХреЗрдЯ.рдЖрдИрдУ рдХрдиреЗрдХреНрд╢рди рдкрд╣рд▓реЗ рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реЛ рд▓реЗрдХрд┐рди рд╡реЗрдмрд╕реЛрдХреЗрдЯ рдХреЗ рдмрдЬрд╛рдп рд▓рдВрдмреЗ рдорддрджрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реЛред рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдХреЛ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдпрд╣ websocket рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдЧрд╛ред
        location /{
            proxy_pass http://127.0.0.1:5000/;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
        }

рд╢рд╛рдпрдж рдпрд╣ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░реЗрдЧрд╛ред рдореЗрд░реЗ рдРрдк рдореЗрдВ socket.io рдХреЗ рджреЛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╕рдордп рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реАред рдореИрдВрдиреЗ io = socketio(server) рдХреЛ рджреЛ рдмрд╛рд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдФрд░ рддреНрд░реБрдЯрд┐ 400 рдорд┐рд▓реАред рдпрд╣ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рддреНрд░реБрдЯрд┐ рд╣реИ рд▓реЗрдХрд┐рди... рд╡рд╣ рдореЗрд░реА рдереАред

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд░ рдореЗрдВ рд╕реНрдЯрд┐рдХреА рд╕рддреНрд░ рд╕рдХреНрд╖рдо рдХрд░рддреЗ рд╣реИрдВ (рдХреНрд▓рд╛рд╕рд┐рдХ рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ)ред рдпрджрд┐ рдЖрдк рд╕реНрдЯрд┐рдХреА рд╕рддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрднрд╡рддрдГ рдЖрдкрдХреЛ 400 рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рдорд┐рд▓реЗрдВрдЧреАред

рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рдкреЛрд▓рд┐рдВрдЧ рд╕реЗ рд╡реЗрдмрд╕реЛрдХреЗрдЯ рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд░ рдЕрдкрдЧреНрд░реЗрдб рдЕрдиреБрд░реЛрдз рдХреЛ рдЙрд╕ рд╕рд░реНрд╡рд░ рд╕реЗ рд╕рдВрддреБрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдиреЗ рдХрднреА рдЗрд╕ рд╕реЙрдХреЗрдЯ рдЖрдИрдбреА рдХрд╛ рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдФрд░ 400 рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрддрд╛ рд╣реИред рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдпрд╣рд╛рдВ: https://socket.io/docs/using-multiple-nodes/

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдЖрдк рдЗрд▓рд╛рд╕реНрдЯрд┐рдХ рдмреАрдирд╕реНрдЯреЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╡реЗрдмрд╕реЛрдХреЗрдЯ рдореЗрдВ Nginx рдХреЗ рдЙрдиреНрдирдпрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП .ebextensions рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдирд┐рдореНрди websocket.config рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВ:

container_commands:
  enable_websockets:
    command: |
     sed -i '/\s*proxy_set_header\s*Connection/c \
              proxy_set_header Upgrade $http_upgrade;\
              proxy_set_header Connection "upgrade";\
      ' /tmp/deployment/config/#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf

рдореИрдВрдиреЗ рдЧреБрдЧрд▓реА рдХреА рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ рдФрд░ рдореИрдВ рднреА nginx рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рд╕рдорд╛рдзрд╛рди рдЗрд╕ рднрд╛рдЧ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реИ

рдкреНрд░реЙрдХреНрд╕реА_http_рд╕рдВрд╕реНрдХрд░рдг 1.1;
рдкреНрд░реЙрдХреНрд╕реА_рд╕реЗрдЯ_рд╣реЗрдбрд░ рдЕрдкрдЧреНрд░реЗрдб $http_upgrad;
рдкреНрд░реЙрдХреНрд╕реА_рд╕реЗрдЯ_рд╣реЗрдбрд░ рдХрдиреЗрдХреНрд╢рди "рдЕрдкрдЧреНрд░реЗрдб";
рдкреНрд░реЙрдХреНрд╕реА_рд╕реЗрдЯ_рд╣реЗрдбрд░ рд╣реЛрд╕реНрдЯ $ рд╣реЛрд╕реНрдЯ;

nginx рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреИрд╕реЗ tylercb рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рддреЛ рдХрдо рд╕реЗ рдХрдо рдпрд╣ рддрдм рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рдЖрдк nginx рдХреЛ рд░рд┐рд╡рд░реНрд╕ рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣рд╛рдБ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рд╣реИ

WebSocket proxying
To turn a connection between a client and server from HTTP/1.1 into WebSocket, the protocol switch mechanism available in HTTP/1.1 is used.

There is one subtlety however: since the тАЬUpgradeтАЭ is a hop-by-hop header, it is not passed from a client to proxied server. With forward proxying, clients may use the CONNECT method to circumvent this issue. This does not work with reverse proxying however, since clients are not aware of any proxy servers, and special processing on a proxy server is required.

Since version 1.3.13, nginx implements special mode of operation that allows setting up a tunnel between a client and proxied server if the proxied server returned a response with the code 101 (Switching Protocols), and the client asked for a protocol switch via the тАЬUpgradeтАЭ header in a request.

As noted above, hop-by-hop headers including тАЬUpgradeтАЭ and тАЬConnectionтАЭ are not passed from a client to proxied server, therefore in order for the proxied server to know about the clientтАЩs intention to switch a protocol to WebSocket, these headers have to be passed explicitly:

location /chat/ {
    proxy_pass http://backend;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}
A more sophisticated example in which a value of the тАЬConnectionтАЭ header field in a request to the proxied server depends on the presence of the тАЬUpgradeтАЭ field in the client request header:

http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }

    server {
        ...

        location /chat/ {
            proxy_pass http://backend;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
        }
    }
By default, the connection will be closed if the proxied server does not transmit any data within 60 seconds. This timeout can be increased with the proxy_read_timeout directive. Alternatively, the proxied server can be configured to periodically send WebSocket ping frames to reset the timeout and check if the connection is still alive.

рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдХреЛрдИ рдЦрдмрд░? рдореИрдВрдиреЗ рдЗрд╕реЗ рдпрд╣рд╛рдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд┐рдпрд╛ рд╣реИ

рдХрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ nginx рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдХрд╛рд░рдг рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рд╕рдорд░реНрдкрд┐рдд рд╕рд░реНрд╡рд░ рдкрд░ рдЖрдк рдЗрд╕реЗ рдКрдкрд░ рджрд┐рдП рдЧрдП рд╡рд┐рдЪрд╛рд░реЛрдВ (nginx рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди, рдЖрджрд┐) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдкрд╛рд╕ рдЗрди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рддрдХ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рдкрд░ sockets.io рд╕реЗ рдареАрдХ рдХрд░реЗрдВ ...

рдХреЛрдИ рднреА рдирд╣реАрдВ?

@deemeetree
рдпрджрд┐ рдЖрдк рдПрдХрд╛рдзрд┐рдХ рдиреЛрдбреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреА рд╕рд╛рдЗрдЯ "рд╕рддреНрд░ рдЖрдИрдбреА рдЕрдЬреНрдЮрд╛рдд" рдкрд░ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЗ рдХрд╛рд░рдг рдореБрдЭреЗ рд╕рдВрднрд╡ рд▓рдЧрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ (https://stackoverflow.com/a/53163917/6271092) рдкрд░ рдореЗрд░реЗ рдЙрддреНрддрд░ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рдиреА рдЪрд╛рд╣рд┐рдПред

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, socket.io рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдЕрдкрдиреА рд╕рд╛рдЗрдЯ рдкрд░ рдХрд╣рддреЗ рд╣реИрдВ (https://socket.io/docs/using-multiple-nodes/) ,

рдпрджрд┐ рдЖрдк рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдпрд╛ рдорд╢реАрдиреЛрдВ рдХреЗ рдмреАрдЪ рдХрдиреЗрдХреНрд╢рди рдХреЗ рднрд╛рд░ рдХреЛ рд╡рд┐рддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд╕рддреНрд░ рдЖрдИрдбреА рд╕реЗ рдЬреБрдбрд╝реЗ рдЕрдиреБрд░реЛрдз рдЙрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдЬреБрдбрд╝реЗрдВ рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред

рдпрд╣ "рд╕реЙрдХреЗрдЯ" рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЗ рджреМрд░рд╛рди рдХрдИ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдлрд╛рдпрд░ рдХрд░рдиреЗ рдкрд░ рдирд┐рд░реНрднрд░ XHR рдкреЛрд▓рд┐рдВрдЧ рдпрд╛ JSONP рдкреЛрд▓рд┐рдВрдЧ рдЬреИрд╕реЗ рдХреБрдЫ рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ рдХреЗ рдХрд╛рд░рдг рд╣реИред рдЪрд┐рдкрдЪрд┐рдкрд╛ рд╕рдВрддреБрд▓рди рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд╣реЛрдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЦрддрд░рдирд╛рдХ рд╣реЛрдЧрд╛:

Error during WebSocket handshake: Unexpected response code: 400

рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрдИ рд╕реЙрдХреЗрдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рдиреЛрдбреНрд╕ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдЕрдкрдиреЗ рд╕рд░реНрд╡рд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ рдЬреИрд╕рд╛ рд╡рд╣ рдХрд╣рддрд╛ рд╣реИред рдФрд░ рдЕрдкрдиреЗ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХреЗ рд▓рд┐рдП, рдЕрдкрдиреЗ рдкреЛрд░реНрдЯ рдХреЛ рдЗрд╕ рддрд░рд╣ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ,
parseInt(your_port) + parseInt(process.env.NODE_APP_INSTANCE);

рдЖрд╢рд╛ рд╣реИ рдпреЗ рдорджрдж рдХрд░реЗрдЧрд╛ред

рд╡рд┐рдВрдбреЛрдЬ рд╕рд░реНрд╡рд░ 2008R2 (рдХреЛрдИ рдкреНрд░реЙрдХреНрд╕реА рдирд╣реАрдВ, рдХреЛрдИ рдЖрдИрдЖрдИрдПрд╕ рдирд╣реАрдВ) рдкрд░ рд╣реЛрд╕реНрдЯ рдХрд┐рдП рдЧрдП рдореЗрд░реЗ рдРрдк рд╕реЗ рд╕реАрдзреЗ рдХрдиреЗрдХреНрдЯ рд╣реЛрдиреЗ рдореЗрдВ рдПрдХ рд╣реА рддреНрд░реБрдЯрд┐ рдорд┐рд▓реАред рдмреАрдЪ рдореЗрдВ рдХреЗрд╡рд▓ рдЧреВрдВрдЧрд╛ рдордзреНрдпрд╡рд░реНрддреА рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ред

рдореБрдЭреЗ рд╡рд┐рдВрдбреЛ рд╕рд░реНрд╡рд░ 2016 рдкрд░ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝ рд░рд╣рд╛ рд╣реИ рдХреГрдкрдпрд╛ рдЕрдкрдиреЗ рдлрд┐рдХреНрд╕ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░реЗрдВред рдзрдиреНрдпрд╡рд╛рдж

рдореИрдВ рдХрд╛рдлреА рд╕рдордп рд╕реЗ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рд╣реИ рддреЛ рдХреГрдкрдпрд╛ рдорджрдж рдХрд░реЗрдВред рдореИрдВ рдЕрдкрд╛рдЪреЗ рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред

рдХреЛрдИ рд╕реБрд░рд╛рдЧ? рджреЗрд╡ рдкрд░ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдПрд╕рдПрд╕рдПрд▓ рдкрд░ рдПрдХ рд╣реА рдореБрджреНрджрд╛ред

PM2 рдиреЛрдб рдХреНрд▓рд╕реНрдЯрд░ рдореЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛: 4 x 1

рдЕрдкрд╛рдЪреЗ рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдЕрднреА рднреА рдХреЛрдИ рд╕реБрд░рд╛рдЧ рдирд╣реАрдВ рд╣реИ

рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ httpd2/apache2 рдкрд░ рд╣реИрдВ, рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ рдЬреЛ рдХрд╛рдо рдХрд░рддрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ:

    ProxyRequests Off
    <Location />
        ProxyPass http://127.0.0.1:1337/
        ProxyPassReverse http://127.0.0.1:1337/

        RewriteEngine On
        RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
        RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]
        RewriteRule /socket.io/(.*) ws://127.0.0.1:1337/socket.io/$1 [P]
    </Location>

рдЕрд░реЗ @ZeldaZach .htaccess рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рд╣реИ? рдзрдиреНрдпрд╡рд╛рдж!

рдпрд╣ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрд░реА рд╕рд╛рдЗрдЯ-рд╕рдХреНрд╖рдо/рд╕рд╛рдЗрдЯ.рдХреЙрдиреНрдлрд╝ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдПрдЪрдЯреАрдПрд╕реАрдПрд╕реА рдореЗрдВ рднреА рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП

рдореИрдВ рдХреЗрд╡рд▓ рдЗрддрдирд╛ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ, рдПрд╕рдПрд╕рдПрд▓ рдпрд╣рд╛рдВ рдЕрдкрд░рд╛рдзреА рд╣реИ :) рдЕрдХреНрд╖рдо рдХрд░реЗрдВ, рдХреНрд▓рд╛рдЙрдбрдлреНрд▓реЗрдпрд░ рд▓рдЪреАрд▓рд╛ рдПрд╕рдПрд╕рдПрд▓ рдореЛрдб рдФрд░ рдкреВрд░реНрдг (рд╕рдЦреНрдд) рдореЛрдб рдкрд░ рдЬрд╛рдПрдВред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдареАрдХ рдХрд░ рджреЗрдЧрд╛,
рдЕрдЧрд░ рдирд╣реАрдВ,

рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ: рд░рд┐рд╡рд░реНрд╕ рдкреНрд░реЙрдХреНрд╕реА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдкреЛрд░реНрдЯ ред

рдпрд╣рд╛рдВ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рднреА Nginx рдФрд░ React Express (MERN) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдереА рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ proxy_pass http://localhost:3000; рд▓рд╛рдЗрди рдереАред рдореИрдВрдиреЗ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдКрдкрд░ рд╕реЗ @tylercb рдЙрддреНрддрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рд╛:

"рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдереА, рдореЗрд░рд╛ рдРрдк nginx рдХреЗ рдкреАрдЫреЗ рд╣реИред рдореЗрд░реЗ Nginx рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдЗрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдХрд░рдиреЗ рд╕реЗ рддреНрд░реБрдЯрд┐ рджреВрд░ рд╣реЛ рдЧрдИред

location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}

рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ https://chrislea.com/2013/02/23/proxying-websockets-with-nginx/ рд╕реЗ рд╣реИред

рдпрджрд┐ рдХрд┐рд╕реА рдХреЛ рдЕрднреА рднреА Nodejs + Express рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд░рд╣реА рд╣реИ, рддреЛ рд╢рд╛рдпрдж рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ express-status-monitor рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ @slaveofcode рдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕рдХреЗ рдПрдирдкреАрдПрдо рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рдореЙрдбреНрдпреВрд▓ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕реЙрдХреЗрдЯ.рдЖрдИрдУ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЛ рдЬрдиреНрдо рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдореБрдЦреНрдп рд╕реЙрдХреЗрдЯ.рдЖрдИрдУ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдкреЛрд░реНрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рд╡реЗрдмрд╕реЛрдХреЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рднрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

const io = require('socket.io')(server);
const expressStatusMonitor = require('express-status-monitor');
app.use(expressStatusMonitor({
  websocket: io,
  port: app.get('port')
}));

рдпрд╣ рдореЗрд░реА рдЕрдкрд╛рдЪреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реИ, рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ /ws/ рдкрде рдЙрдкрд╕рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреНрдпрдерд╛ рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

    ProxyRequests Off
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>

    RewriteEngine On
    RewriteCond %{REQUEST_URI}  ^/ws/socket.io         [NC]
    RewriteCond %{QUERY_STRING} transport=websocket    [NC]
    RewriteRule /ws/(.*)           ws://localhost:6001/$1 [P,L]
    ProxyPass /ws http://127.0.0.1:6001
    ProxyPassReverse /ws http://127.0.0.1:6001

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣рдорд╛рд░реЗ EKS рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рд▓рд┐рдП Linkerd рдбреИрд╢рдмреЛрд░реНрдб (рд╕рд░реНрд╡рд┐рд╕ рдореЗрд╢) рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдореЗрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝ рд░рд╣рд╛ рд╣реИред рд╣рдо nginx рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕ рд╕рдордп рдЙрд╕ рд╕реЗ рдХреИрд╕реЗ рдирд┐рдХрд▓рд╛ рдЬрд╛рдПред

@andrzj рдУрдПрдордЬреА рдпрд╛рд░, рддреБрдордиреЗ рдореБрдЭреЗ рдмрдЪрд╛ рд▓рд┐рдпрд╛ред

рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдереА, рдореЗрд░рд╛ рдРрдк nginx рдХреЗ рдкреАрдЫреЗ рд╣реИред рдореЗрд░реЗ Nginx config рдореЗрдВ рдЗрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдХрд░рдиреЗ рд╕реЗ рддреНрд░реБрдЯрд┐ рджреВрд░ рд╣реЛ рдЧрдИред

рд╕реНрдерд╛рди / {
рдкреНрд░реЙрдХреНрд╕реА_рдкрд╛рд╕ http://localhost :8080;
рдкреНрд░реЙрдХреНрд╕реА_http_рд╕рдВрд╕реНрдХрд░рдг 1.1;
рдкреНрд░реЙрдХреНрд╕реА_рд╕реЗрдЯ_рд╣реЗрдбрд░ рдЕрдкрдЧреНрд░реЗрдб $http_upgrad;
рдкреНрд░реЙрдХреНрд╕реА_рд╕реЗрдЯ_рд╣реЗрдбрд░ рдХрдиреЗрдХреНрд╢рди "рдЕрдкрдЧреНрд░реЗрдб";
рдкреНрд░реЙрдХреНрд╕реА_рд╕реЗрдЯ_рд╣реЗрдбрд░ рд╣реЛрд╕реНрдЯ $ рд╣реЛрд╕реНрдЯ;
}

рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ https://chrislea.com/2013/02/23/proxying-websockets-with-nginx/ рд╕реЗ рд╣реИ

рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИрдВред

рд╕рд╣рд╛рдпрддрд╛ рдЧрд┐рд░реЛрд╣ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдпрджрд┐ рдХреЛрдИ рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп HTTPS рдЯреНрд░реИрдлрд╝рд┐рдХ рдХреЗ рдмрдЧрд▓ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ, рддреЛ рдпрд╣ рдЕрдм рдореЗрд░реЗ рд▓рд┐рдП рдирд┐рдореНрди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдЗрд▓рд╛рд╕реНрдЯрд┐рдХ рдмреАрдирд╕реНрдЯреЙрдХ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ:

  • рд▓реЛрдЪрджрд╛рд░ рдмреАрдирд╕реНрдЯреЙрдХ рдкрд░: nginx рдмрдВрдж рд╣реЛ рдЧрдпрд╛ (рдЕрднреА рдХреЗ рд▓рд┐рдП, рдЙрдкрд░реЛрдХреНрдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдЖрдЬрдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рддрдХ рдЧреЛрд▓ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ)ред
  • рд▓реЛрдЪрджрд╛рд░ рдмреАрдирд╕реНрдЯреЙрдХ рдкрд░: рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
  • рдиреЛрдб/рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдкрд░: const io = require('socket.io')(3030)
  • рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдХреЗрд╡рд▓ let connection = io(https://www.myurl.com:3030) . рдирд╛рдордХрд░рдг

рдпрджрд┐ рдЖрдк рд▓реЛрдЧ рдЕрднреА рднреА рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЖрдкрдиреЗ рдореВрд▓ рдХреЛ рд╕реЙрдХреЗрдЯ рд╕рд░реНрд╡рд░ рдореЗрдВ рд╕рд░рдгреА рдпрд╛ рдореВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдореВрд▓ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрдЬрд╛рдп рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рдлреЗрдВрдХ рджреЗрдЧрд╛

Error during WebSocket handshake: Unexpected response code: 400

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрд╕ рддрд░реНрдХ рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдирд╛

io.origins(['https://foo.example.com:443']);

рдЗрд╕рдХреЗ рд▓рд┐рдП

io.origins((origin, callback) => {  
     if (origin !== 'https://foo.example.com') {    
         return callback('origin not allowed', false);  
     }  
    callback(null, true);
});

рдмрд┐рдирд╛ рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреЗ рдХрд╛рдо рдХрд┐рдпрд╛ред

рдпрд╣ рд╡рд╣реА рддреНрд░реБрдЯрд┐ рд╣реЛ рд░рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдПрдирдЬреАрдЖрдИрдПрдирдПрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдЬреЛрдбрд╝рд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рдЕрднреА рднреА рд╡рд╣реА 400 рд╣реИрдВрдбрд╢реЗрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд░рд╣реА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рдПрдбрдмреНрд▓реНрдпреВрдПрд╕ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдореИрдВрдиреЗ рдЗрд╕реЗ 80 рд▓рдХреНрд╖реНрдп рд╕рдореВрд╣ рдФрд░ 443 рд╢реНрд░реЛрддрд╛ рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рд▓рдХреНрд╖реНрдп рд╕рдореВрд╣ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рддрд╛ рд╣реИред

рдПрдирдЬреАрдЖрдИрдПрдирдПрдХреНрд╕ рдХреЙрдиреНрдлрд╝ рдлрд╝рд╛рдЗрд▓:

`рд╕рд░реНрд╡рд░ {

listen [::]:80;
listen 80;

server_name <domain_name>;
access_log  /var/log/nginx/access.log;

location / {
    proxy_pass http://127.0.0.1:8000;
    include proxy_params;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
}

location /socket.io {
    include proxy_params;
    proxy_http_version 1.1;
    proxy_cache_bypass $http_upgrade;
    proxy_buffering off;
    proxy_set_header Host $host;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_pass http://127.0.0.1:8000;
}

}`

рдФрд░ рдореЗрд░реА рдЬреЗрдПрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ рднреАрддрд░ рдореЗрд░реЗ рдкрд╛рд╕ рд╕реЙрдХреЗрдЯ.рдЖрдИрдУ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдиреЗрдХреНрд╢рди рд╣реИ рдЬреЛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
var socket = io()

рдореИрдиреНрдпреБрдЕрд▓ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдмрдирд╛рдПрдВ (рдмрд┐рдирд╛ рдПрдХреНрд╕рдкреНрд░реЗрд╕ app рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЗ) рдФрд░ рдПрдХ рдЕрд▓рдЧ рдкреЛрд░реНрдЯ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ

const io = require('socket.io')(3001, {
  path: '/',
  serveClient: false,
  // below are engine.IO options
  pingInterval: 10000,
  pingTimeout: 5000,
  cookie: false
})

рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдереА, рдореЗрд░рд╛ рдРрдк nginx рдХреЗ рдкреАрдЫреЗ рд╣реИред рдореЗрд░реЗ Nginx config рдореЗрдВ рдЗрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдХрд░рдиреЗ рд╕реЗ рддреНрд░реБрдЯрд┐ рджреВрд░ рд╣реЛ рдЧрдИред

рд╕реНрдерд╛рди / {
рдкреНрд░реЙрдХреНрд╕реА_рдкрд╛рд╕ http://localhost :8080;
рдкреНрд░реЙрдХреНрд╕реА_http_рд╕рдВрд╕реНрдХрд░рдг 1.1;
рдкреНрд░реЙрдХреНрд╕реА_рд╕реЗрдЯ_рд╣реЗрдбрд░ рдЕрдкрдЧреНрд░реЗрдб $http_upgrad;
рдкреНрд░реЙрдХреНрд╕реА_рд╕реЗрдЯ_рд╣реЗрдбрд░ рдХрдиреЗрдХреНрд╢рди "рдЕрдкрдЧреНрд░реЗрдб";
рдкреНрд░реЙрдХреНрд╕реА_рд╕реЗрдЯ_рд╣реЗрдбрд░ рд╣реЛрд╕реНрдЯ $ рд╣реЛрд╕реНрдЯ;
}

рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ https://chrislea.com/2013/02/23/proxying-websockets-with-nginx/ рд╕реЗ рд╣реИ

рдореБрдЭреЗ proxy_set_header Connection "upgrade"; . рдпрд╛рдж рдЖ рд░рд╣рд╛ рдерд╛

рдЬрдм рдореИрдВ https рдпрд╛ wss рдпрд╛ ssl рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореИрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рд░рд╛рдд рдмрд┐рддрд╛рддрд╛ рд╣реВрдВред рдпрд╣ рд╣рдореЗрд╢рд╛ connection stopped before establish рдХреЗ рд╕рд╛рде 400 рддреНрд░реБрдЯрд┐ рдХреЛрдб рдХрд╣рддрд╛ рд╣реИред

рдмрд╕ рдПрдХ рдорд┐рдирдЯ рдкрд╣рд▓реЗ, рдореБрдЭреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛:

0. рдХреНрд▓рд╛рдЙрдбрдлреНрд▓реЗрдпрд░

рдПрд╕рдПрд╕рдПрд▓/рдЯреАрдПрд▓рдПрд╕ рдЯреИрдм рдкрд░:

  • рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдкрдирд╛ cert рдпрд╛ SSL рдпрд╛ HTTPS рд╣реИ: рдЗрд╕реЗ Full рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВред (рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд 123 рдЪрд░рдгреЛрдВ рдореЗрдВ рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ https рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╣реИ)

  • рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ http server рд╣реИ: рдЗрд╕реЗ Flexible рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВред (рдХреНрд▓рд╛рдЙрдбрдлреНрд▓реЗрдпрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЖрдкрдХреА рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ https рдпрд╛ ssl рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред)

  • рдЙрд╕рдХреЗ рдмрд╛рдж, DNS рдЯреИрдм рдкрд░ рдЬрд╛рдПрдВ, Proxied рд╕реЗрдЯ рдХрд░реЗрдВред

рдпрджрд┐ рдЖрдк рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдмрд╕ DNS рдЯреИрдм рдкрд░ рдЬрд╛рдПрдВ, DNS only . рд╕реЗрдЯ рдХрд░реЗрдВ

1. рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рд╣реА рдкреНрд░реЙрдХреНрд╕реА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реИред

server {
    listen 80;
    server_name ai-tools-online.xyz;
    return 301 https://ai-tools-online.xyz$request_uri;
}

server {
    listen 443 ssl http2;

    ssl_certificate       /data/v2ray.crt;
    ssl_certificate_key   /data/v2ray.key;
    ssl_protocols         TLSv1.2 TLSv1.3;
    #ssl_ciphers           3DES:RSA+3DES:!MD5;
    server_name ai-tools-online.xyz;

    location / {
        proxy_pass http://127.0.0.1:5000;
    }

    location /socket.io {
        proxy_http_version 1.1;
        proxy_buffering off;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_pass http://127.0.0.1:5000/socket.io;
    }
}

ai-tools-online.xyz рдЖрдкрдХрд╛ рдбреЛрдореЗрди рд╣реИ, http://127.0.0.1:5000 рдЖрдкрдХрд╛ рд╕реЙрдХреЗрдЯ рд╕рд░реНрд╡рд░ рд╣реИред

2. рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХрд╛ рд╕рд░реНрд╡рд░ Cross-Origin Controls '*' Cross-Origin Access рдЕрдиреБрдорддрд┐ рдорд┐рд▓ рд╕рдХреЗ

flask-socketio рдХреЗ рд▓рд┐рдП, flask_socketio.SocketIO(app, cors_allowed_origins = '*') . рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ

3. рдирдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ nginx рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рдирд╛ рд╣реЛрдЧрд╛

systemctl restart nginx

4. caddy рдХреИрд╕реЗ рд╕реЗрдЯ рдХрд░реЗрдВ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рд▓рд┐рдВрдХ рджреЗрдЦреЗрдВ:

https://github.com/yingshaoxo/Web-Math-Chat#reverse -proxy-configuration-for-https
https://caddy.community/t/using-caddy-0-9-1-with-socket-io-and-flask-socket-io/508/6
https://www.nginx.com/blog/nginx-nodejs-websockets-socketio/

рдореИрдВрдиреЗ рдЧреБрдЧрд▓реА рдХреА рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ рдФрд░ рдореИрдВ рднреА nginx рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рд╕рдорд╛рдзрд╛рди рдЗрд╕ рднрд╛рдЧ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реИ

рдкреНрд░реЙрдХреНрд╕реА_http_рд╕рдВрд╕реНрдХрд░рдг 1.1;
рдкреНрд░реЙрдХреНрд╕реА_рд╕реЗрдЯ_рд╣реЗрдбрд░ рдЕрдкрдЧреНрд░реЗрдб $http_upgrad;
рдкреНрд░реЙрдХреНрд╕реА_рд╕реЗрдЯ_рд╣реЗрдбрд░ рдХрдиреЗрдХреНрд╢рди "рдЕрдкрдЧреНрд░реЗрдб";
рдкреНрд░реЙрдХреНрд╕реА_рд╕реЗрдЯ_рд╣реЗрдбрд░ рд╣реЛрд╕реНрдЯ $ рд╣реЛрд╕реНрдЯ;

nginx рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреИрд╕реЗ tylercb рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдореЗрд░реЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд┐рдпрд╛ рдзрдиреНрдпрд╡рд╛рдж!

рдпрджрд┐ рдЖрдк рдореЗрд░реА рддрд░рд╣ рд▓реЛрдЪрджрд╛рд░ рдмреАрдирд╕реНрдЯреЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдиреЛрдб-рд╕рд░реНрд╡рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд░рд╣реЗ рд╣реИрдВ,
рд╡рд╛рддрд╛рд╡рд░рдг рдмрдирд╛рддреЗ рд╕рдордп рд╣рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдХрд┐рд╕ рдкреНрд░реЙрдХреНрд╕реА рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдЬрд┐рд╕рдореЗрдВ nginx рдкреВрд░реНрд╡-рдЖрдмрд╛рджреА рдпрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯ рд╣реИред
рдореИрдВрдиреЗ рдЙрд╕ рдкреНрд░реЙрдХреНрд╕реА рд╕рд░реНрд╡рд░ рдХреЛ рдХреЛрдИ рдирд╣реАрдВ рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдФрд░ рдлрд┐рд░ рдЕрдкрдирд╛ рд╕рд░реНрд╡рд░ рдмрдирд╛рдирд╛ рдЬрд╛рд░реА рд░рдЦрд╛ред рдореИрдВ рдПрдХ рдиреЛрдб рд╕рд░реНрд╡рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд▓рд╛рд╕реНрдЯрд┐рдХ рдмреАрдирд╕реНрдЯреЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛ рдЬрд┐рд╕рдореЗрдВ рдореЗрд░рд╛ рдкреНрд░реЙрдХреНрд╕реА рд╕рд░реНрд╡рд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ nginx рдкрд░ рд╕реЗрдЯ рдерд╛ред
рдЪреВрдВрдХрд┐ рдпрд╣ рдкреНрд░реЙрдХреНрд╕реА рд╕рд░реНрд╡рд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╣реИред рдХрд┐рд╕реА рднреА рдкреНрд░реЙрдХреНрд╕реА рд╕рд░реНрд╡рд░ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рддреНрд░реБрдЯрд┐ рдЧрд╛рдпрдм рд╣реЛ рдЧрдИред

рдШрдВрдЯреЛрдВ рддрдХ рдЧреБрдЧрд▓реА рдХрд░рддреЗ рд░рд╣реЗ рдФрд░ рдКрдкрд░ рджрд┐рдП рдЧрдП рд╕рдорд╛рдзрд╛рдиреЛрдВ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рд╣рдо рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реБрдЖ рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рд┐рд░реНрдл рдПрдХ рдиреЛрдбрдЬ рдРрдк рдерд╛ рдФрд░ рдХреЛрдИ nginx рдирд╣реАрдВ рдерд╛ред

рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╣рдордиреЗ рдЗрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рд╡рд╣ рд╕рд┐рд░реНрдл рдХрдВрдЯреЗрдирд░ рд╕реЗ nginx рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдерд╛ -> рд╕рднреА рдЯреНрд░реИрдлрд╝рд┐рдХ рдХреЛ рд╕реАрдзреЗ рдиреЛрдб рдореЗрдВ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреИрд▓реЗрдВрд╕рд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд▓реЛрдб рдХрд░реЗрдВред

рдШрдВрдЯреЛрдВ рддрдХ рдЧреБрдЧрд▓реА рдХрд░рддреЗ рд░рд╣реЗ рдФрд░ рдКрдкрд░ рджрд┐рдП рдЧрдП рд╕рдорд╛рдзрд╛рдиреЛрдВ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рд╣рдо рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реБрдЖ рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рд┐рд░реНрдл рдПрдХ рдиреЛрдбрдЬ рдРрдк рдерд╛ рдФрд░ рдХреЛрдИ nginx рдирд╣реАрдВ рдерд╛ред

рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╣рдордиреЗ рдЗрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рд╡рд╣ рд╕рд┐рд░реНрдл рдХрдВрдЯреЗрдирд░ рд╕реЗ nginx рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдерд╛ -> рд╕рднреА рдЯреНрд░реИрдлрд╝рд┐рдХ рдХреЛ рд╕реАрдзреЗ рдиреЛрдб рдореЗрдВ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреИрд▓реЗрдВрд╕рд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд▓реЛрдб рдХрд░реЗрдВред

рдЖрдкрдиреЗ рдРрд╕рд╛ рдХреИрд╕реЗ рдХрд┐рдпрд╛?

рдпрджрд┐ рдЖрдк рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди> рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд░ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдкреНрд░реЙрдХреНрд╕реА рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдбреНрд░реЙрдк-рдбрд╛рдЙрди рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдк nginx, Apache рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЗрд╕реЗ рдиреЛрдб рдРрдк рдХреЗ рд╕рднреА рдХрдиреЗрдХреНрд╢рдиреЛрдВ рд╕реЗ рдЧреБрдЬрд░рдиреЗ рдХреЗ рд▓рд┐рдП "рдХреЛрдИ рдирд╣реАрдВ" рдкрд░ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣ рдХреЗрд╡рд▓ рддрднреА рдкреНрд░рдХрдЯ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдк рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд╛рддрд╛рд╡рд░рдг рдмрдирд╛рддреЗ рд╣реИрдВ, рдПрдХрд▓ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореЗрд░реА рдореВрд▓ рдЯрд┐рдкреНрдкрдгреА рд▓реЛрдЪрджрд╛рд░ рдмреАрдирд╕реНрдЯреЙрдХ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХреА рдЧрдИ рдереА

рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдереА, рдореЗрд░рд╛ рдРрдк nginx рдХреЗ рдкреАрдЫреЗ рд╣реИред рдореЗрд░реЗ Nginx config рдореЗрдВ рдЗрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдХрд░рдиреЗ рд╕реЗ рддреНрд░реБрдЯрд┐ рджреВрд░ рд╣реЛ рдЧрдИред

рд╕реНрдерд╛рди / {
рдкреНрд░реЙрдХреНрд╕реА_рдкрд╛рд╕ http://localhost :8080;
рдкреНрд░реЙрдХреНрд╕реА_http_рд╕рдВрд╕реНрдХрд░рдг 1.1;
рдкреНрд░реЙрдХреНрд╕реА_рд╕реЗрдЯ_рд╣реЗрдбрд░ рдЕрдкрдЧреНрд░реЗрдб $http_upgrad;
рдкреНрд░реЙрдХреНрд╕реА_рд╕реЗрдЯ_рд╣реЗрдбрд░ рдХрдиреЗрдХреНрд╢рди "рдЕрдкрдЧреНрд░реЗрдб";
рдкреНрд░реЙрдХреНрд╕реА_рд╕реЗрдЯ_рд╣реЗрдбрд░ рд╣реЛрд╕реНрдЯ $ рд╣реЛрд╕реНрдЯ;
}

рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ https://chrislea.com/2013/02/23/proxying-websockets-with-nginx/ рд╕реЗ рд╣реИ

рддреЛ рдереИрдВрдХ рдпреВред

рдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдФрд░ рд░реЗрдбрд┐рд╕-рд╕рд░реНрд╡рд░ рдХреЗ рдмреАрдЪ рдЕрд▓рдЧ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рд▓рд╛рд░реНрд╡рд╛-рдЗрдХреЛ-рд╕рд░реНрд╡рд░ рдФрд░ Nginx рдФрд░ рд╕реЙрдХреЗрдЯ.рдЖрдИрдУ рдФрд░ рд░реЗрдбрд┐рд╕-рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдХреГрдкрдпрд╛ рдпрд╣рд╛рдВ рд▓рд┐рдВрдХ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ ред

рдзрдиреНрдпрд╡рд╛рдж

рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рдореБрджреНрджрд╛ рдерд╛ред рдореЗрд░реЗ nginx config рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рд╕реЗ рдХреЛрдИ рдорджрдж рдирд╣реАрдВ рдорд┐рд▓реА, рд▓реЗрдХрд┐рди @ santhosh77h рдХреЗ рд╕рдорд╛рдзрд╛рди рдиреЗ рдЗрд╕реЗ рдореЗрд░реЗ рд▓рд┐рдП рдареАрдХ рдХрд░ рджрд┐рдпрд╛ред рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЕрдиреБрдордд рдЙрддреНрдкрддреНрддрд┐ рдХреА рд╕рд░рдгреА рдкрд╛рд╕ рдХрд░рдирд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЙрд▓рдмреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдореИрдВ Nest.js websockets (рд╕реЙрдХреЗрдЯ.io рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд╕рд┐рд░реНрдл рдПрдХ рдЖрд╡рд░рдг) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЕрдкрдиреЗ рдЧреЗрдЯрд╡реЗ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ рдЬреЛрдбрд╝рд╛:

afterInit(server: Server): any {
    const origins = getOrigins(); // returns an array of origin strings
    server.origins((origin, cb) => {
      if (origins.includes(origin)) {
        cb(null, true)
      } else {
        cb('Invalid origin', false);
      }
    });
  }

рдореЗрд░реЗ рдкрд╛рд╕ NUXT.js рдХреЗ рд╕рд╛рде Node.js / Express рдХреЗ рд╕рд╛рде AWS рдЗрд▓рд╛рд╕реНрдЯрд┐рдХ рдмреАрдирд╕реНрдЯреЙрдХ (Nginx рдкреНрд░реЙрдХреНрд╕реА) рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рд╣реА рдореБрджреНрджрд╛ рдерд╛ред рдореБрдЭреЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдХреБрдЫ рджрд┐рди рд▓рдЧреЗред рдореИрдВ рдЕрдкрдиреЗ рдкрдврд╝рдиреЗ рдХреЗ рдмрд┐рдВрджреБ рд╕рд╛рдЭрд╛ рдХрд░реВрдВрдЧрд╛ред рд╢рд╛рдпрдж рдХрд┐рд╕реА рдХреЛ рдпрд╣ рдЙрдкрдпреЛрдЧреА рд▓рдЧреЗрдЧрд╛ред

рдореЗрд░рд╛ рд╡рд╛рддрд╛рд╡рд░рдг рдПрд╕рдПрд╕рдПрд▓ рдХреЗ рд╕рд╛рде https рдХреЗ рд▓рд┐рдП рджреЛ рдкреЛрд░реНрдЯ 80 рдФрд░ https рдХреЗ рд▓рд┐рдП 443 рдХреЗ рд╕рд╛рде рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд░ рдкрд░ рд╣реИред

рдКрдкрд░ рд╕реЗ рдЙрддреНрддрд░ рдХреЗ рд╕рдВрдпреЛрдЬрди рдореЗрдВ, @tylercb рдХреЗ рд▓рд┐рдП рдмрдбрд╝рд╛ рдзрдиреНрдпрд╡рд╛рдж рдФрд░ AWS рдФрд░ socket.io рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕реЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореИрдВрдиреЗ рдПрдХ Nginx рдХреЙрдиреНрдлрд╝рд┐рдЧ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдИ рдЬреЛ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рддреА рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИред

рдореИрдВ рдЬрд▓реНрджреА рд╕реЗ рдЪрд░рдгреЛрдВ рдХреА рд░реВрдкрд░реЗрдЦрд╛ рддреИрдпрд╛рд░ рдХрд░реВрдВрдЧрд╛:

рдореЗрд░реЗ index.js рдиреЛрдб рдлрд╝рд╛рдЗрд▓ рдореЗрдВ:

const express = require('express')
const app = express()
const server = http.createServer(app)
const io = require('socket.io')(server)
const host = process.env.HOST || '127.0.0.1'
const port = process.env.PORT || 8081

рдлреНрд░рдВрдЯ-рдПрдВрдб рдкрд░ (рдореЗрд░реЗ рдШрдЯрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ):
import io from 'socket.io-client';
рдореЗрд░реЗ Vue рдбреЗрдЯрд╛ рдореЗрдВ ():
socket: io()

рдЕрдВрдд рдореЗрдВ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд░реВрдЯ рдореЗрдВ, рдореИрдВрдиреЗ рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдпрд╛ .ebextensions
рдареАрдХ рдЕрдВрджрд░ рдореИрдВрдиреЗ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдИ 01-proxy.config рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде:

files:
  /etc/nginx/conf.d/01-proxy.conf:
     mode: "000644"
     owner: root
     group: root
     content: |
        upstream nodejs {
          server 127.0.0.1:8081;
          keepalive 256;
        }
        server {
          listen 8080;
          server_name yourdomain.com;

          if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2})") {
            set $year $1;
            set $month $2;
            set $day $3;
            set $hour $4;
          }
          access_log /var/log/nginx/healthd/application.log.$year-$month-$day-$hour healthd;
          access_log  /var/log/nginx/access.log  main;

          location / {
              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
              proxy_set_header Host $host;

              proxy_pass http://nodejs;

              proxy_http_version 1.1;
              proxy_set_header Upgrade $http_upgrade;
              proxy_set_header Connection "upgrade";
          }

          gzip on;
          gzip_comp_level 4;
          gzip_types text/html text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

          location /static {
              alias /var/app/current/static;
          }

        }

  /opt/elasticbeanstalk/hooks/configdeploy/post/99_kill_default_nginx.sh:
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/bin/bash -xe
      rm -f /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf
      service nginx stop 
      service nginx start

container_commands:
  removeconfig:
    command: "rm -f /tmp/deployment/config/#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf"

рдЕрддрд┐рд░рд┐рдХреНрдд рд░реАрдбрд┐рдВрдЧ:
nginx рд╡рд┐рдиреНрдпрд╛рд╕

рдмрд╕, рдЗрддрдирд╛ рд╣реАред рдХрд╛рдлреА рд▓рдВрдмрд╛ред рдореЗрд░реА рдорд╛рдлрд╝реА рдФрд░ рд╢реБрднрдХрд╛рдордирд╛рдПрдБред

рдореЗрд░реЗ рд▓рд┐рдП рдХреЛрдгреАрдп .net рдХреЛрд░ рдХреЗ рд▓рд┐рдП ubuntu рдФрд░ ngnix рд╕рд░реНрд╡рд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдиреАрдЪреЗ рдХрд╛рдо рдХрд░рдирд╛

рд╕реНрдерд╛рди / {
рдкреНрд░реЙрдХреНрд╕реА_рдкрд╛рд╕ http://localhost :8080;
рдкреНрд░реЙрдХреНрд╕реА_http_рд╕рдВрд╕реНрдХрд░рдг 1.1;
рдкреНрд░реЙрдХреНрд╕реА_рд╕реЗрдЯ_рд╣реЗрдбрд░ рдЕрдкрдЧреНрд░реЗрдб $http_upgrad;
рдкреНрд░реЙрдХреНрд╕реА_рд╕реЗрдЯ_рд╣реЗрдбрд░ рдХрдиреЗрдХреНрд╢рди "рдЕрдкрдЧреНрд░реЗрдб";
рдкреНрд░реЙрдХреНрд╕реА_рд╕реЗрдЯ_рд╣реЗрдбрд░ рд╣реЛрд╕реНрдЯ $ рд╣реЛрд╕реНрдЯ;
}

рдпрджрд┐ рдХрд┐рд╕реА рдХреЛ рдЕрднреА рднреА Nodejs + Express рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд░рд╣реА рд╣реИ, рддреЛ рд╢рд╛рдпрдж рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ express-status-monitor рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ @slaveofcode рдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕рдХреЗ рдПрдирдкреАрдПрдо рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рдореЙрдбреНрдпреВрд▓ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕реЙрдХреЗрдЯ.рдЖрдИрдУ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЛ рдЬрдиреНрдо рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдореБрдЦреНрдп рд╕реЙрдХреЗрдЯ.рдЖрдИрдУ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдкреЛрд░реНрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рд╡реЗрдмрд╕реЛрдХреЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рднрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

const io = require('socket.io')(server);
const expressStatusMonitor = require('express-status-monitor');
app.use(expressStatusMonitor({
  websocket: io,
  port: app.get('port')
}));

рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдиреЗ рдореЗрд░реА рдорджрдж рдХреА

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдк socket.io рдХрдиреЗрдХреНрд╢рди рдЕрдореЗрдЬрд╝рди рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд░ рд╕реЗ рдирд╣реАрдВ рдЧреБрдЬрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╛ рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдпрд╣ рдХрд░реЗрдВ: http://blog.flux7.com/web-apps-websockets-with-aws-elastic-load-balancing

рдЕрдЧрд░ рдХрд┐рд╕реА рдФрд░ рдХреЛ рдПрдбрдмреНрд▓реНрдпреВрдПрд╕ рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдереА, рддреЛ рд▓реЗрдЦ рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдПрд╕рдПрд╕рдПрд▓ рдХреЛ рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ рдФрд░ рдЖрдк рдРрдк рд╕рд░реНрд╡рд░ рд╕реНрддрд░ рд╕реЗ рдЗрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкрд░ рдЕрдкрдиреЗ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдореЗрд░реЗ рдПрд▓рдмреА рд╢реНрд░реЛрддрд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВ

image

рдореЗрд░реЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд┐рдпрд╛!

рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдереА, рдореЗрд░рд╛ рдРрдк nginx рдХреЗ рдкреАрдЫреЗ рд╣реИред рдореЗрд░реЗ Nginx config рдореЗрдВ рдЗрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдХрд░рдиреЗ рд╕реЗ рддреНрд░реБрдЯрд┐ рджреВрд░ рд╣реЛ рдЧрдИред

рд╕реНрдерд╛рди / {
рдкреНрд░реЙрдХреНрд╕реА_рдкрд╛рд╕ http://localhost :8080;
рдкреНрд░реЙрдХреНрд╕реА_http_рд╕рдВрд╕реНрдХрд░рдг 1.1;
рдкреНрд░реЙрдХреНрд╕реА_рд╕реЗрдЯ_рд╣реЗрдбрд░ рдЕрдкрдЧреНрд░реЗрдб $http_upgrad;
рдкреНрд░реЙрдХреНрд╕реА_рд╕реЗрдЯ_рд╣реЗрдбрд░ рдХрдиреЗрдХреНрд╢рди "рдЕрдкрдЧреНрд░реЗрдб";
рдкреНрд░реЙрдХреНрд╕реА_рд╕реЗрдЯ_рд╣реЗрдбрд░ рд╣реЛрд╕реНрдЯ $ рд╣реЛрд╕реНрдЯ;
}

рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ https://chrislea.com/2013/02/23/proxying-websockets-with-nginx/ рд╕реЗ рд╣реИ

рд╣рд╛рдВред рдпрд╣ рдорджрджрдЧрд╛рд░ рдерд╛ рдФрд░ рдореЗрд░реЗ рд▓рд┐рдП рднреА рдХрд╛рдо рдХрд┐рдпрд╛ред

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдк socket.io рдХрдиреЗрдХреНрд╢рди рдЕрдореЗрдЬрд╝рди рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд░ рд╕реЗ рдирд╣реАрдВ рдЧреБрдЬрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╛ рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдпрд╣ рдХрд░реЗрдВ: http://blog.flux7.com/web-apps-websockets-with-aws-elastic-load-balancing

рдЕрдЧрд░ рдХрд┐рд╕реА рдФрд░ рдХреЛ рдПрдбрдмреНрд▓реНрдпреВрдПрд╕ рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдереА, рддреЛ рд▓реЗрдЦ рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдПрд╕рдПрд╕рдПрд▓ рдХреЛ рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ рдФрд░ рдЖрдк рдРрдк рд╕рд░реНрд╡рд░ рд╕реНрддрд░ рд╕реЗ рдЗрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкрд░ рдЕрдкрдиреЗ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдореЗрд░реЗ рдПрд▓рдмреА рд╢реНрд░реЛрддрд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВ

image

рдореЗрд░реЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд┐рдпрд╛!

рдЕрдЪреНрдЫрд╛, рдпрд╣ рдХрд╛рдо рдХрд┐рдпрд╛ред

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдк socket.io рдХрдиреЗрдХреНрд╢рди рдЕрдореЗрдЬрд╝рди рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд░ рд╕реЗ рдирд╣реАрдВ рдЧреБрдЬрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╛ рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдпрд╣ рдХрд░реЗрдВ: http://blog.flux7.com/web-apps-websockets-with-aws-elastic-load-balancing

рдЕрдЧрд░ рдХрд┐рд╕реА рдФрд░ рдХреЛ рдПрдбрдмреНрд▓реНрдпреВрдПрд╕ рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдереА, рддреЛ рд▓реЗрдЦ рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдПрд╕рдПрд╕рдПрд▓ рдХреЛ рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ рдФрд░ рдЖрдк рдРрдк рд╕рд░реНрд╡рд░ рд╕реНрддрд░ рд╕реЗ рдЗрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкрд░ рдЕрдкрдиреЗ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдореЗрд░реЗ рдПрд▓рдмреА рд╢реНрд░реЛрддрд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВ

image

рдореЗрд░реЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд┐рдпрд╛!

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдкрдХрд╛ рдЖрд╡реЗрджрди 80 рдкрд░ рдЪрд▓ рд░рд╣рд╛ рд╣реИ?

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

рдЬрдм рдЕрдиреБрд░реЛрдз рдХрд╛ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рдореЛрдб 'рд╢рд╛рдорд┐рд▓' рд╣реЛ, рддреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ 'рдкрд╣реБрдВрдЪ-рдирд┐рдпрдВрддреНрд░рдг-рдЕрдиреБрдорддрд┐-рдЙрддреНрдкрддреНрддрд┐' рд╢реАрд░реНрд╖рд▓реЗрдЦ рдХрд╛ рдорд╛рди рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб '*' рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрддреНрдкрддреНрддрд┐ 'http://localhost:3000' рдЗрд╕рд▓рд┐рдП рдкрд╣реБрдВрдЪ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИред XMLHttpRequest рджреНрд╡рд╛рд░рд╛ рд╢реБрд░реВ рдХрд┐рдП рдЧрдП рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рдореЛрдб withCredentials рд╡рд┐рд╢реЗрд╖рддрд╛ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
akasrai picture akasrai  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Aweather picture Aweather  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Elliot9 picture Elliot9  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

chfeizy picture chfeizy  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

stnwk picture stnwk  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ