文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
nginx+nodejs 一台服务器站架多个网站
搭建 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 的安装
- 安装 nginx 源
sudo rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
- 查看 Nginx 源是否配置成功
- 通过
yum search nginx
看看是否已经添加源成功。如果成功则执行下列命令安装 Nginx。 - 或者
npm info nginx
也可以看看 nginx 源是否添加成功
- 安装 Nginx
sudo yum install -y nginx
- 启动 Nginx 并设置开机自动运行
sudo systemctl start nginx sudo systemctl enable nginx
Nginx 反向代理配置
- 关闭 Selinux
# 修改 SELINUX=enforcing 为 SELINUX=disabled vi etc/selinux/config # 必须重启 linux init 6
- 配置
firewalld
开启80
端口
firewall-cmd --zone=public --list-ports firewall-cmd --zone=public --add-port=80/tcp --permanent
- 配置反向代理
找到 /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
停止 nginxsystemctl 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
- 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'));
- 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'));
- 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论