为啥一定呀用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.sh
和upgrade_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;哎,这个小小的问题浪费了我好多时间,所以记录下来希望对其他人有用。