返回介绍

nginx+nodejs 一台服务器站架多个网站

发布于 2024-01-20 01:25:02 字数 9774 浏览 0 评论 0 收藏 0

搭建 Nodejs 生产环境

  • 下载 nodejs 二进制代码包,然后减压到 /usr/local/nodejs
  • 配置环境变量
    • vi /etc/profile
    • 最后面添加:
      • export NODE_HOME=/usr/local/nodejs/bin
      • export PATH=$NODE_HOME:$PATH
    • :wq 保存,然后运行 source /etc/profile

nodejs 进程管理器 pm2 的使用

PM2 是一款非常优秀的 Node 进程管理工具,它有着丰富的特性:能够充分利用多核 CPU 且能够负载均衡、能够帮助应用在崩溃后、指定时间(cluster model) 和超出最大内存限制 等情况下实现自动重启。 PM2 是开源的基于 Nodejs 的进程管理器,包括守护进程,监控,日志的一整套完整的功能。

PM2 的主要特性:

  • 内建负载均衡(使用 Node cluster 集群模块)
  • 后台运行
  • 0 秒停机重载,我理解大概意思是维护升级的时候不需要停机.
  • 具有 Ubuntu 和 CentOS 的启动脚本
  • 停止不稳定的进程(避免无限循环)
  • 控制台检测

PM2 的常见命令

npm install pm2 -g

运行 pm2 的程序并指定 name

pm2 start app.js --name appName 
pm2 start app.js -i 3 --name appName 3 # 启动 3 个进程 (自带负载均衡)
  • 显示所有进程状态 pm2 list
  • 显示所有进程状态 pm2 logs
  • 显示一个进程的日志 pm2 logs appName
  • 关闭重启所有进程
    • pm2 stop all # 停止所有进程
    • pm2 restart all # 重启所有进程
    • pm2 reload all # 0 秒停机重载进程 (用于 NETWORKED 进程)
  • 关闭重启指定进程
    • pm2 stop 0 # 停止指定的进程
    • pm2 restart 0 # 重启指定的进程
    • pm2 stop appName
    • pm2 restart appName
  • 杀死进程
    • pm2 delete 0 # 杀死指定的进程
    • pm2 delete all # 杀死全部进程
    • pm2 delete appName # 杀死指定名字的进程
  • 显示相应进程/应用的总体信息
    • pm2 show appName

Nginx 的安装

  1. 安装 nginx 源
sudo rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
  1. 查看 Nginx 源是否配置成功
  • 通过 yum search nginx 看看是否已经添加源成功。如果成功则执行下列命令安装 Nginx。
  • 或者 npm info nginx 也可以看看 nginx 源是否添加成功
  1. 安装 Nginx
sudo yum install -y nginx
  1. 启动 Nginx 并设置开机自动运行
sudo systemctl start nginx 
sudo systemctl enable nginx

Nginx 反向代理配置

  1. 关闭 Selinux
# 修改 SELINUX=enforcing 为 SELINUX=disabled 
vi etc/selinux/config 
# 必须重启 
linux init 6
  1. 配置 firewalld 开启 80 端口
firewall-cmd --zone=public --list-ports

firewall-cmd --zone=public --add-port=80/tcp --permanent
  1. 配置反向代理

找到 /etc/nginx/conf.d 然后在里面新建对应网站的配置文件

server { 
  listen 80; 
  server_name www.bbb.com; 
  location / { 
  #设置主机头和客户端真实地址,以便服务器获取客户端真实 IP 
  proxy_set_header Host $host; 
  proxy_set_header X-Real-IP $remote_addr; 
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
  #禁用缓存 
  proxy_buffering off; 
  #反向代理的地址 
  proxy_pass http://127.0.0.1:3001; 
  } 
}

重启 nginx

systemctl restart nginx
  • nginx -t 看配置是否正确
  • systemctl stop nginx 停止 nginx
  • systemctl start nginx 启动 nginx

域名测试

找到 C:\Windows\System32\drivers\etc\hosts

192.168.1.128 
192.168.1.128 www.bbb.com

浏览器输入 www.aaa.com nginx 转发到了 127.0.0.1:3001

相关防火墙配置

# 添加
firewall-cmd --zone=public --add-port=80/tcp --permanent

#  刷新
firewall-cmd --reload

# 查看所有打开的端口: 
firewall-cmd --zone=public --list-ports

# 删除
firewall-cmd --zone= public --remove-port=3306/tcp --permanent

nginx+nodejs 多台服务器负载均衡

负载均衡的种类

  • 一种是通过硬件来进行解决,常见的硬件有 NetScaler、F5、Radware 和 Array 等商用的 负载均衡器,但是它们是比较昂贵的
  • 一种是通过软件来进行解决的,常见的软件有 LVS、Nginx、apache 等,它们是基于 Linux 系统并且开源的负载均衡策略.

Nginx 的特点是占有内存少,并发能力强,事实上 nginx 的并发能力确实在同类型的网页服 务器中表现最好,中国大陆使用 nginx 网站用户有:新浪、网易、 腾讯等

nginx 的 upstream 目前支持 3 种方式的分配

  • 轮询(默认)
    • 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉, 能自动剔除。
  • weight 权重 ——you can you up
    • 指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况
  • ip_hash ip 哈希算法
    • 每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器, 可以解决 session 的问题。
  • 配置负载均衡
    • 找到 /etc/nginx/conf.d 然后在里面新建对应网站的配置文件

重启 nginx: systemctl restart nginx

www_aaa_com.conf

upstream bakeaaa {
ip_hash;
server 127.0.0.1:3001; 
}


server {
  listen     80;
  server_name  www.aaa.com;

  #charset koi8-r;
  #access_log  /var/log/nginx/host.access.log  main;

  location / {
    # 获取客户端的 IP 地址
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    # 禁用缓存
    proxy_buffering off;
      
    proxy_pass http://bakeaaa;
  }

  #error_page  404        /404.html;

  # redirect server error pages to the static page /50x.html
  #
  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
    root   /usr/share/nginx/html;
  }
}

www_bbb.com.conf

upstream bakebbb {

ip_hash;
server 127.0.0.1:3002 ; 

}


server {
  listen     80;
  server_name  www.bbb.com;

  #charset koi8-r;
  #access_log  /var/log/nginx/host.access.log  main;

  location / {
    #获取客户端真实 IP
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    #关闭缓存
    proxy_buffering off;
      
    proxy_pass http://bakebbb;
  }

  #error_page  404        /404.html;

  # redirect server error pages to the static page /50x.html
  #
  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
    root   /usr/share/nginx/html;
  }
 
}

www_ccc_com.conf

upstream bakeccc {
ip_hash;
server 192.168.1.129:3001; 
}

server {
  listen     80;
  server_name  www.ccc.com;

  #charset koi8-r;
  #access_log  /var/log/nginx/host.access.log  main;

  location / {
    # 获取客户端真实 IP
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    # 关闭缓存
    proxy_buffering off;
      
    proxy_pass http://bakeccc;
  }

  #error_page  404        /404.html;

  # redirect server error pages to the static page /50x.html
  #
  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
    root   /usr/share/nginx/html;
  }
 
}

负载均衡操作演示

我们使用 docker 跑三个 nodejs 应用程序作为演示

  • 使用 koa 搭建三个服务 3001,3002,3003
  1. 3001 服务
const Koa = require('koa');
const app = new Koa();

app.use(async ctx => {
  ctx.body = 'Hello World 3001';
});

app.listen(3001, ()=>console.log('http://localhost:3001'));
  1. 3002 服务
const Koa = require('koa');
const app = new Koa();

app.use(async ctx => {
  ctx.body = 'Hello World 3002';
});

app.listen(3002, ()=>console.log('http://localhost:3002'));
  1. 3003 服务
const Koa = require('koa');
const app = new Koa();

app.use(async ctx => {
  ctx.body = 'Hello World 3003';
});

app.listen(3003, ()=>console.log('http://localhost:3003'));

在本地启动以上三个服务

  • docker 运行 Nginx
# nginx/Dockerfile
FROM daocloud.io/library/nginx:1.13.0-alpine
# 拷贝配置文件到 Nginx 目录覆盖默认配置
# COPY conf/nginx.conf /etc/nginx/conf/nginx.conf
COPY ./conf.d /etc/nginx/conf.d

本机 conf.d/default.conf 文件

upstream bakeaaa {
ip_hash;
server 192.168.1.34:3001 weight=1;  # 192.168.1.34 本机 ip
server 192.168.1.34:3002 weight=1;
server 192.168.1.34:3003 weight=3;
}

server {
  listen     80;
  # server_name  www.aaa.com;

  #charset koi8-r;
  #access_log  /var/log/nginx/host.access.log  main;

  location / {
    # 获取客户端真实 IP
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    # 关闭缓存
    proxy_buffering off;
      
    proxy_pass http://bakeaaa;
  }

  #error_page  404        /404.html;

  # redirect server error pages to the static page /50x.html
  #
  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
    root   /usr/share/nginx/html;
  }

}
  • 构建 nginx 镜像 docker build -t nginx-demo .
  • 运行 nginx 镜像 ddocker run --name nginx -d -p 8666:80(本机端口:容器端口) -v /Users/poetry/Download/docker/nginx/conf.d:/etc/nginx/conf.d(本机配置文件目录:容器配置文件目录) e00b36d6975b(nginx 镜像 ID)
  • 运行 docker ps 查看启动的服务
  • 修改配置 nginx/conf.d 需要重启容器才生效 docker restart nginx(容器名称)

修改 upstream bakeaaa 中的权重等,可以看到不断刷新页面,可以看到不同的服务器负载均衡的效果

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文