一、Nginx简介

1.1 为什么要使用Nginx

如果将前端项目资源也放置在tomcat中部署,那么在访问一些静态资源的时候就需要访问单tomcat,增加服务器压力(本身tomcat服务器处理能力有限),所以我们需要一台更高效的静态资源服务器 随着项目访问量的增加,tomcat并不能满足要求,tomcat 的并发量大概在200左右。这时候我们需要搭建集群,来处理并发问题。所以我们需要一台高效的反向代理服务器

1.2 什么是Nginx

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。

1.3 Nginx特点

稳定性极强,可以实现7*24不间断运行提供简洁、直观的配置占用内存很小、并发能力很强(5w+)

二、Nginx的相关概念

2.1 正向代理

正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。

2.2 反向代理

向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。

2.3 动静分离

随着前后端分离开发, 我们也可以实现前后端项目的分离部署,即将前端项目部署到Nginx上直接进行访问,后端资源通过Nginx反向代理进行访问

2.4 负载均衡

通过负载均衡策略,分发请求到集群中的不同tomcat服务器上

三、Nginx安装

3.1 Linux安装

3.1.1 安装Nginx所需环境

1、安装gcc

yum install -y gcc-c++

2、安装PCRE pcre-devel

yum install -y pcre pcre-devel

3、安装zlib

yum install -y zlib zlib-devel

4、安装Open SSL

yum install -y openssl openssl-devel

3.1.2 安装Nginx

下载地址:http://nginx.org/en/download.html

1、下载并解压

# 将nginx-1.18.0.tar.gz上传到linux中

# 将nginx-1.18.0.tar.gz解压到 /usr/local下

tar -zxvf nginx-1.18.0.tar.gz -C /usr/local

2、编译安装

# 进入nginx目录

cd /usr/local/nginx-1.18.0

# 生成makefile文件

./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre

# 编译 安装

make && make install

3、启动运行

# 进入nginx目录

cd /usr/local/nginx/sbin

# 查看nginx版本

./nginx -v

#启动nginx

./nginx

# 停止nginx

./nginx -s stop

#重新加载nginx.conf配置文件

./nginx -s reload

4、测试访问

http://ip(默认端口为80)

3.2 window安装

1、下载nginx window版本

http://nginx.org/en/download.html

2、执行根目录下nginx.exe启动

3、测试访问 http://localhost

四、Nginx配置文件

4.1 配置文件

#user nobody;

worker_processes 1;

#error_log logs/error.log;

#error_log logs/error.log notice;

#error_log logs/error.log info;

#pid logs/nginx.pid;

events {

worker_connections 1024;

}

http {

include mime.types;

default_type application/octet-stream;

#log_format main '$remote_addr - $remote_user [$time_local] "$request" '

# '$status $body_bytes_sent "$http_referer" '

# '"$http_user_agent" "$http_x_forwarded_for"';

#access_log logs/access.log main;

sendfile on;

#tcp_nopush on;

#keepalive_timeout 0;

keepalive_timeout 65;

#gzip on;

server {

listen 80;

server_name localhost;

#charset koi8-r;

#access_log logs/host.access.log main;

location / {

root html;

index index.html index.htm;

}

#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 html;

}

}

}

4.2 全局配置

#user nobody;

# 设置worker进程数(默认为1 一般设置为CPU核心数)

worker_processes 1;

# 配置nginx运行日志文件

#error_log logs/error.log;

#error_log logs/error.log notice;

#error_log logs/error.log info;

# 配置Nginx进程的进程号的存储文件

#pid logs/nginx.pid;

4.3 events配置

# 配置nginx连接数,数值越大并发能力越强

events {

worker_connections 100000; # 默认1024

}

worker_connections不是随便设置的,而是与两个指标有重要关联,一是内存,二是操作系统级别的“进程最大可打开文件数”。

内存:每个连接数分别对应一个read_event、一个write_event事件,一个连接数大概占用232字节,2个事件总占用96字节,那么一个连接总共占用328字节。 通过数学公式可以算出100000个连接数大概会占用 31M = 100000 * 328 / 1024 / 1024,当然这只是nginx启动时,connections连接数所占用的nginx。 进程最大可打开文件数:进程最大可打开文件数受限于操作系统,可通过 ulimit -n 命令查询,以前是1024,现在是65535,nginx提供了worker_rlimit_nofile指令,这是除了ulimit的一种设置可用的描述符的方式。 该指令与使用ulimit对用户的设置是同样的效果。此指令的值将覆盖ulimit的值,如:worker_rlimit_nofile 20960;

nginx的并发数计算公式:

nginx的并发数 = worker_processes*worker_connections/(4或者2)

动态资源除以4静态资源除以2

4.4 http配置

http {

include mime.types;

default_type application/octet-stream;

#log_format main '$remote_addr - $remote_user [$time_local] "$request" '

# '$status $body_bytes_sent "$http_referer" '

# '"$http_user_agent" "$http_x_forwarded_for"';

#access_log logs/access.log main;

sendfile on;

#tcp_nopush on;

#keepalive_timeout 0;

keepalive_timeout 65;

#gzip on;

server {

# nginx监听端口

listen 80;

# nginx服务名称

server_name localhost;

#charset koi8-r;

#access_log logs/host.access.log main;

# 路径映射匹配

location / {

# 设置根目录

root html;

# 设置默认访问的网页

index index.html index.htm;

}

#error_page 404 /404.html;

# redirect server error pages to the static page /50x.html

# 指定错误页面 /aaaa

error_page 500 502 503 504 /50x.html;

location = /50x.html {

root html;

}

}

}

五、反向代理

5.1 nginx配置

server {

listen 80;

server_name localhost;

#charset koi8-r;

#access_log logs/host.access.log main;

location / {

#root html;

#index index.html index.htm;

proxy_pass http://101.132.152.21:8888/;

}

}

六、负载均衡

6.1 ngxin配置

#声明tomcat集群

upstream fengmi {

server localhost:8889;

server localhost:8888;

}

server {

listen 80;

server_name localhost;

#charset koi8-r;

#access_log logs/host.access.log main;

location / {

proxy_pass http://fengmi/;

}

}

6.2 nginx负载均衡策略

6.2.1 默认轮询

6.2.2 权重

#声明tomcat集群

upstream fengmi {

server localhost:8889 weight=2;

server localhost:8888 weight=1;

}

server {

listen 80;

server_name localhost;

#charset koi8-r;

#access_log logs/host.access.log main;

location / {

proxy_pass http://fengmi/;

}

}

6.2.3 iphash

指定负载均衡服务器按照基于客户端IP的分配方式,这个方法确保了相同的客户端的请求一直发送到相同的服务器,以保证session会话。这样每个访客都固定访问一个后端服务器,可以解决session不能跨服务器的问题。

#声明tomcat集群

upstream fengmi {

ip_hash;

server localhost:8889;

server localhost:8888;

}

server {

listen 80;

server_name localhost;

#charset koi8-r;

#access_log logs/host.access.log main;

location / {

proxy_pass http://fengmi/;

}

}

6.2.4 least_conn

把请求转发给连接数较少的后端服务器。轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。

#声明tomcat集群

upstream maitaole {

least_conn; #把请求转发给连接数较少的后端服务器

server localhost:8889;

server localhost:8888;

}

server {

listen 80;

server_name localhost;

#charset koi8-r;

#access_log logs/host.access.log main;

location / {

proxy_pass http://fengmi/;

}

}

七、动静分离

7.1 打包前端项目

修改src/utils/request.jsp中的baseUrl为后端的nginx服务器的地址 执行npm run build打包项目

7.2 部署前端项目

将dist目录下的资源上传到nginx服务器的html目录下 修改nginx服务器配置

location / {

root html;

index index.html index.htm;

}

因为现在前端和后端都在同一个nginx服务器上,所以要分开部署

同一台服务器上安装两个Nginx,并修改不同的端口(如:前端部署在8080上,后端部署在80上)将前端和后端部署在不同的服务器上

7.3 配置静态图片资源访问

配置Nginx访问路径

# 配置图片访问地址

location /upload/ {

alias D:/workspace/upload/; # 如果是linux环境则配置(路径自由选择):/usr/local/upload

}

八、虚拟域名配置

8.1 修改nginx配置

#声明tomcat集群

upstream maitaole {

server localhost:8889;

server localhost:8888;

}

server {

listen 80;

server_name www.qfjava.com;

#charset koi8-r;

#access_log logs/host.access.log main;

location / {

proxy_pass http://fengmi/;

}

}

8.2 修改本地域名解析器

修改C:\Windows\System32\drivers\etc\hosts文件

# localhost name resolution is handled within DNS itself.

# 127.0.0.1 localhost

# ::1 localhost

101.132.152.21 www.qfjava.com

8.3 访问测试

http://www.qfjava.com/

九、Nginx集群

9.1什么是高可用?

高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。如果一个系统能够一直提供服务,那么这个可用性则是百分之百,但是天有不测风云。所以我们只能尽可能的去减少服务的故障。

9.2 生产环境下的问题

在生产环境上很多时候是以Nginx做反向代理对外提供服务,但是一天Nginx难免遇见故障,如:服务器宕机。当Nginx宕机那么所有对外提供的接口都将导致无法访问。虽然我们无法保证服务器百分之百可用,但是也得想办法避免这种悲剧,今天我们使用keepalived来实现Nginx的高可用。

9.3 keepalived是什么

Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP (Virtual Router Redundancy Protocol ,虚拟路由器冗余协议)功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案软件

9.4 nginx高可用实现

9.4.1 环境准备

两台Linux虚拟机分别安装nginx分别安装keepalived

9.4.2 安装keepalived

#两台服务器都需要安装

# yum安装keepalived

yum install -y keepalived

# 查看是否已安装keepalived

rpm -q -a keepalived

9.4.3 配置keepalive

192.168.31.42主机配置

编辑/etc/keepalived/keepalived.conf配置文件

! Configuration File for keepalived

global_defs {

router_id LVS_DEVEL #

}

#检测脚本

vrrp_script chk_http_port {

script "/usr/local/src/check_nginx_pid.sh" #心跳执行的脚本,检测nginx是否启动

interval 2 #(检测脚本执行的间隔,单位是秒)

weight 2 # 权重

}

#vrrp 实例定义部分

vrrp_instance VI_1 {

state MASTER # 指定keepalived的角色,MASTER为主,BACKUP为备

interface ens33 # 用ifconfig查看你具体的网卡

virtual_router_id 66 # 虚拟路由编号,主从要一直

priority 100 # 优先级,数值越大,获取处理请求的优先级越高

advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数)

#授权访问

authentication {

auth_type PASS #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信

auth_pass 1111

}

track_script {

chk_http_port #(调用检测脚本)

}

virtual_ipaddress {

192.168.54.100 # 定义虚拟ip(VIP),可多设,每行一个

}

}

192.168.31.43 备机配置

编辑/etc/keepalived/keepalived.conf配置文件

! Configuration File for keepalived

global_defs {

router_id LVS_DEVEL #

}

#检测脚本

vrrp_script chk_http_port {

script "/usr/local/src/check_nginx_pid.sh" #心跳执行的脚本,检测nginx是否启动

interval 2 #(检测脚本执行的间隔)

weight 2 #权重

}

#vrrp 实例定义部分

vrrp_instance VI_1 {

state BACKUP # 指定keepalived的角色,MASTER为主,BACKUP为备

interface ens33 # 用ifconfig查看你具体的网卡

virtual_router_id 66 # 虚拟路由编号,主从要一直

priority 99 # 优先级,数值越大,获取处理请求的优先级越高

advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数)

#授权访问

authentication {

auth_type PASS #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信

auth_pass 1111

}

track_script {

chk_http_port #(调用检测脚本)

}

virtual_ipaddress {

192.168.54.100 # 定义虚拟ip(VIP),可多设,每行一个

}

}

9.4.4 编写脚本检测nginx

主机和备机配置

在/usr/local/src/check_nginx_pid.sh编写检测脚本

chmod 777 check_nginx_pid.sh

#!/bin/bash

A=`ps -C nginx --no-header | wc -l`

if [ $A -eq 0 ];then

/usr/local/nginx/sbin/nginx #尝试重新启动nginx

sleep 2

if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then

echo "comein!!" >> /etc/keepalived/exec.log

systemctl stop keepalived #启动失败,将keepalived服务杀死

fi

fi

9.4.5 启动keepalived

# 启动nginx

# 启动keepalived

systemctl start keepalived

9.4.6 单点故障演示

# 停止主机keepalived

systemctl stop keepalived

好文链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: