X-Real-IP 与 X-Forwarded-For

一、X-Real-IP

从字面看 X-Real-IP 代表的是客户端请求真实的 IP 地址,这个参数没有相关标准规范,如果是直接访问的请求,可能是客户端真实的 IP 地址,但是中间若经过了层层的代理,就是最后一层代理的 IP 地址。

Nginx 中的配置

proxy_set_header    X-Real-IP $remote_addr;

"X-Real-IP 与 X-Forwarded-For"继续阅读

理解 serverless 无服务架构原理[转]

一:什么是 serverless 无服务?

serverless 中文的含义是 "无服务器",但是它真正的含义是开发者再也不用过多考虑服务器的问题,但是并不代表完全去除服务器,而是我们依靠第三方资源服务器后端,比如使用 Amazon Web Services(AWS) Lambda. 计算服务来执行代码,那么 Serverless 架构分为 Backend as a Service(BaaS) 和 Functions as a Service(FaaS) 两种技术,Serverless 它是由开发者实现的服务端逻辑运行在无状态的计算容器中,它是由事件触发,完全被第三方管理的。

"理解 serverless 无服务架构原理[转]"继续阅读

浏览器与 Node.js 的事件循环(Event Loop)有何区别?[转]

前言

本文我们将会介绍 JavaScript 实现异步的原理,并且了解了在浏览器和 Node.js 中 Event Loop 其实是不相同的。

一、线程与进程

1. 概念

我们经常说 JavaScript 是单线程执行的,指的是一个进程里只有一个主线程,那到底什么是线程?什么是进程?

官方的说法是:进程是 CPU 资源分配的最小单位;线程是 CPU 调度的最小单位。这两句话并不好理解,我们先来看张图。

  • 进程好比图中的工厂,有单独的专属自己的工厂资源。
  • 线程好比图中的工人,多个工人在一个工厂中协作工作,工厂与工人是 1:n 的关系。也就是说一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线。
  • 工厂的空间是工人们共享的,这象征一个进程的内存空间是共享的,每个线程都可用这些共享内存。
  • 多个工厂之间独立存在。

"浏览器与 Node.js 的事件循环(Event Loop)有何区别?[转]"继续阅读

用 Nginx 反向代理 NodeJS

安装 NodeJS

yum install nodejs -y

node -v

安装 pm2

npm install pm2 -g

ln -s /home/download/node-v8.11.1-linux-x64/lib/node_modules/pm2/bin/pm2 /usr/local/bin/pm2

修改 package.json

"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "pm2": "/home/download/node-v8.11.1-linux-x64/lib/node_modules/pm2/bin/pm2 start /web/mazey.cn/server/app.js"
}

or

"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "pm2": "pm2 start app.js"
}

启动 pm2

npm run pm2

开机启动 pm2

pm2 save

pm2 startup centos

注意

pm2 startup centos失败,可尝试pm2 startup

 PM2 detected systemv but you precised centos
 Please verify that your choice is indeed your init system
 If you arent sure, just run : pm2 startup

修改 Nginx 配置

vim /etc/nginx/conf.d/*.conf

upstream nodejs {
    server 127.0.0.1:3000;
    keepalive 64;
}
server {
    listen 80;
    server_name domain.cn;
    root /web/mazey.cn;
    index index.html index.htm;
    # 网站切到/server下时走nodejs
    location /server {
        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;
        proxy_set_header    Connection "";
        proxy_pass http://nodejs;
    }
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
        expires 30d;
    }
    location ~ .*\.(js|css)?$ {
        expires 1h;
    }
}

相应的 app.js

const express = require('express')
const app = express()
let hi = 'hi'

app.get('/server', (req, res, next) => {
  hi = `Hello Mazey!\n`
  next()
}, (req, res) => {
  res.send(`
  ${hi}
  ${req.method}\n
  ${req.originalUrl}\n
  ${req.query.id}\n
  `)
})

const server = app.listen(3000, function () {
  let host = server.address().address
  let port = server.address().port

  console.log('Example app listening at http://%s:%s', host, port)
})

注意

若报错 Cannot GET /xxx 说明 Express 的路由没配好。