我正在开发一款完整的js,HTML5画布游戏,并希望它是“实时”的。根据我的研究,我发现node.js是一个令人兴奋的前景,所以我在我的ubuntu 12网络服务器上配置了socket.io,express等。
我是程序员,但只是网络服务器后端世界的新手,这就是我寻求帮助的原因。我对整个系统模型感到困惑,并希望澄清它是如何工作的。也许,我在很短的时间内读了太多文章。
首先:我在网络服务器上运行nginx 1.2.x.据我所知,nginx正在处理请求,它专用于端口80(对我来说)和服务http请求(也使用php-fpm来服务php)。 然后,我在端口8080上有一个成功运行的nodejs服务器。我想通过websocket连接(由于它的性质和协议),因为nginx不支持websocket但我对发生了什么感到困惑。
如果我去http // mydomain.tld:8080,这是通过节点服务器并保持关闭nginx?在这种情况下,连接可以通过websocket而不是回落到xhr或其他任何东西(我不想要它,因为可扩展性),对吗?
那么我应该怎么做才能在http // mydomain.tld / game /中产生相同的效果?只需将nginx.conf中的请求代理到节点服务器?像:
# if a file does not exist in the specified root and nothing else is definded, we want to serve the request via node.js
try_files $uri @nodejs;
location @nodejs
{
proxy_pass 127.0.0.1:8080;
break;
}
来自:https://stackoverflow.com/a/14025374/2039342
当我们需要通过nginx进行websocket通信时,它是否是一个很好的代理解决方案?当我们想要一个常规的php站点和socket.io连接时,我们是否。到目前为止,我认为重点是在端口80上运行流量并分离标准请求和websocket流量。在我的情况下,最简单的解决方案是什么?
http://www.exratione.com/2012/07/proxying-websocket-traffic-for-nodejs-the-present-state-of-play/在本文中我发现HAProxy可能是我的直到nginx 1.3,是吗?
我知道我的问题有点混乱,但我正在分散才能理解确切的技术。请给我一些提示|文章阅读|起点|基本配置。
PS:我在这里阅读了大部分相关主题。
Ps2:看起来不那么愚蠢:我已经在red5(基于java的flash服务器)+ flash中完成了这个游戏,所以我只想重新考虑并使用适当的当前技术发布它。
答案 0 :(得分:6)
最后,我的基本问题是以正确的方式配置nginx。
首先,我使用nginx_tcp_proxy_module重新安装了nginx作为修补版本。
下一步是设置正确的配置来处理请求:通过http或tcp。 我希望标准文件通常来自webroot,通过node.js(和socket.io js本身ofc)的游戏逻辑和php_fpm的.php文件。
所以我最终得到了以下工作nginx设置:
user www-data;
worker_processes 16;
events {
worker_connections 1024;
}
http {
upstream node-js-myapp {
server 127.0.0.1:3000;
}
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
gzip on;
server {
listen 80;
server_name domain.xx; # Multiple hostnames seperated by spaces
root /var/www/domain.xx; # Replace this
charset utf-8;
access_log /var/log/nginx/domain.xx.access.log combined;
error_log /var/log/nginx/domain.xx.error.log;
location ~ \.php$ {
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /etc/nginx/conf.d/php_fpm; # Includes config for PHP-FPM (see below)
}
location / {
index index.html index.htm;
}
location ^~ /socket.io/ {
try_files $uri @node-js-myapp;
}
location /status {
check_status;
}
location @node-js-myapp {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_pass http://node-js-myapp;
}
}
}
tcp {
upstream websocket-myapp {
server 127.0.0.1:8080;
check interval=3000 rise=2 fall=5 timeout=1000;
}
server {
listen 3000;
server_name _;
access_log /var/log/nginx/domain.xx.access.log;
proxy_read_timeout 200000;
proxy_send_timeout 200000;
proxy_pass websocket-myapp;
}
}
这个node.js服务器运行良好:
var app = require('express').createServer()
var io = require('socket.io').listen(app);
io.set('transports', [
'websocket'
, 'flashsocket'
, 'htmlfile'
, 'xhr-polling'
, 'jsonp-polling'
]);
app.listen(8080);
虽然请求的文件位于我的服务器的公共端和HEAD部分:
<script src="/socket.io/socket.io.js"></script>
我很确定我的nginx不完整且可能包含公牛...但是它有点工作且是一个很好的起点。