为啥一定呀用nginx做反向代理呢?直接使nodejs应用listen 80端口不就是行么?这是最简单的方法,使用nginx做代理有如下几个好处: - 同一个服务器(一般大家用的都是VPS)可以同时在不同的端口跑多个网站,比如一个你的技术nodejs程序跑3000端口,一个Python的跑9000端口,php程序跑5000端口,端口是用不完的所以在该服务器上可以放非常非常多的网站。 - 充分利用nginx处理静态文件的优势,虽然node和nginx都是基于事件响应的比Apache能有更高的并发链接数,但nginx比node明显更胜一筹,而且这样做也能为你的node进程减轻压力。 - 便于后期做负载均衡,将不同类型的请求分配到不同的机器。

由于以前的一些小php程序也要放在同一个vps上所以为了偷懒我选择了lnmp,但是我在安装lnmp的时候当前lnmp的nginx的版本才1.2不支持websocket,必须要到1.3版本以后才能让socket.io使用websocket,而且php的版本也才5.3无法运行我写laravel站点(代码里面数组我全用[],而php5.5才支持这种写法),所以必须将他们升级,lnmp就是好直接让我偷懒到低:使用soft.vpser.net/lnmp/ 目录下的upgrade_nginx.shupgrade_php.sh就可升级到任何版本,怎么使用我就不用说了吧。之后再安装nodejs和mongodb,安装方法非常简单自己谷歌;接下来使用/root目录下的vhost.sh来创建一个域名的虚拟服务器然后把配置改成如下代码。

server
{
    listen       80;
    server_name *****.com;

    #静态文件的位置
    root  /home/wwwroot/****.com/public;

    location /
    {
        # 设定正确的header
        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_set_header X-NginX-Proxy true;

        # nginx 1.13版本以上,支持websocket
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        proxy_redirect off;

        #代理设置最关键的一行
        proxy_pass http://127.0.0.1:5000/;
        break;
    }

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
            expires      30d;
    }

# 下面这四行代码把我坑惨了
#   location ~ .*\.(js|css)?$
#   {
#     expires      12h;
#   }

    access_log off;
}

配置好了程序可以运行了,但是始终出现一个很蛋疼的问题:http://**.com/socket.io/socket.io.js 404 not found .也就是访问不到这个文件,我试了很多方法,改变socket.io的端口然后再nginx配置文件里单独添加一个location,以及改变socket.io的resource:

//Client
var socket = io.connect('http://localhost:8081', {resource: 'test'});

//Server
var io = require('socket.io').listen(8081, {resource: '/test'});
location /test/ {
    proxy_pass http://localhost:8081;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
}

结果都不行,然后我就意识到一定是静态文件设置的问题,这个js文件本来是nodejs生成的,而nginx一定是把它认为是静态文件了,然后从/public/文件夹里找,当然找不到,于是我又改变了nginx配置里的root及location的位置,。。。。。居然还是不行!我想可能是缓存的问题,于是,将

location ~ .*\.(js|css)?$
  {
    expires      12h;
  }

注释掉就好了,或者去掉js;哎,这个小小的问题浪费了我好多时间,所以记录下来希望对其他人有用。

    CentOS 修复一键安装l2tpd+pptpd遇到的问题深入理解AngularUI路由_ui-router