由nodejs+nginx搭配而成的高并发服务器

2,973 阅读2分钟

nginx监听网站80端口,而nodejs监听端口是8000,就可以配置nginx反向代理到nodejs的3000端口,同理,也可以配置代理到多个不同的端口,就可以实现 一台服务器同时服务多个域名,并且可以让nginx负责网站的静态资源请求。有效提高网站的吞吐量和性能!

最简单的做法

直接修改nginx配置,增加下面配置

server {
    listen       80;                # 监听80端口
    server_name node.bluej.cn;      # 监听的域名
    #access_log  /web/nodejs/access.log;     #配置了一下来访日志,怕占用硬盘,关了
    error_log   /web/nodejs/error.log;      #配置了一下错误日志

    ## 针对静态资源做优化,所有静态资源由nginx来处理,注意有新的类型记得加进来
    location ~ \.(gif|jpg|jpeg|png|bmp|swf|css|js|doc|docx|xls|xlsx|zip|rar|mp3|mp4)$     
    {
        root /web/nodejs;       #指向根目录
        expires max;            #用来设置缓存时间
    }

    ## node线程,只负责动态部分
    location /{
        proxy_pass http://127.0.0.1:8000;   #反向代理,指向具体的node监听端口
        proxy_redirect     off;                           #关闭地址的重定向

        # 在代理请求头中加入下面的信息,方便我们用nodejs获取一些客户端信息
        proxy_set_header   Host             $host;        #本机地址(ip或域名)
        proxy_set_header   X-Real-IP        $remote_addr; #客户端真实ip
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;#客户端真实ip
    }
}

常见问题

  1. 访问页面超时 有可能是读取文件fs.readFile的路径出问题了,不同环境下,路径写法有所区别,正确的兼容写法应该是
    var path = require("path");//引入path模块
    
    path.join(__dirname, "../view/index.html");//参数一,表示你当前文件所在物理绝对路径,参数二就是你具体要访问的路径了
    
    否则,很容易请求超时,因为无法读取正确的文件路径
  2. nginx访问静态文件,老是报403 Forbidden 原因可能是 nginx没有访问目录的权限,在 nginx.conf 文件中,标注了user www www;,所以,咱们网站根目录所在的父文件夹的拥有者必须也是www用户,所以,记得设置一下你的目录拥有者
    chown www:www /web
    
  3. 如何设置我们的nodejs网站可以开机启动 如果你是用pm2
    pm2 startup
    pm2 save  
    
    就会把你启动的网站信息存在 ~/.pm2/dump.pm2,例如 /root/.pm2/dump.pm2
    其它同类型产品一样道理

如何搞均衡负载

在配置里,在server段前面加上upstream段

upstream nodejs_upstream {
    server 127.0.0.1:8000;
    server 127.0.0.1:8001;
    server 127.0.0.1:8002;
}
server{
    ...
    location /{
        proxy_pass http://nodejs_upstream
    }
    ...
}

上面的配置意思是nginx会自动分配请求到多个ip端口地址中,实现均衡负载

参考资料

nginx中的Location配置讲解