注:本文从nginx的环境安装,测试反向代理、负载均衡、动静分离、高可用都是亲自试验之后的结果,可用。linux是centos7
1.首先安装 pcre 依赖
下载命令:wget http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz
将下载好的文件 pcre-8.37.tar.gz 放到 usr/src 目录下
解压:tar -xvf pcre-8.37.tar.gz
进入解压好的文件进行配置检查:cd pcre-8.37
检查:./configure
检查时可能报错提示没有 C++编译器,如果可以联网就安装一个:yum install -y gcc gcc-c++
编译和安装:make && make install
检查版本号:pcre-config --version
2.安装其他的依赖
命令:yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
3.安装 nginx
复制到 usr/src 目录下
解压:tar- xvf nginx-1.24.0.tar.gz
进入目录:cd nginx-1.24.0
检查配置:./configure
编译并安装:make && make install
安装成功后在 usr 文件中会多出一个 local/nginx,在 nginx 中有一个 sbin 文件夹,里面有 nginx 启动脚本
4.启动 nginx
进入/usr/local/nginx/sbin 目录,使用./nginx 命令启动
查看 nginx 启动进程:ps -ef | grep nginx
查看 nginx 配置:进入 usr/local/nginx/conf 查看所有文件 ll 打开 nginx.conf 文件:vi nginx.conf
5.防火墙设置
查看防火墙状态:systemctl status firewalld
暂时关闭防火墙:systemctl stop firewalld
永久关闭防火墙:systemctl disable firewalld
打开防火墙:sudo systemctl start firewalld
允许 HTTP 连接: sudo firewall-cmd --zone=public --add-service=http --permanent
允许 HTTPS 连接: sudo firewall-cmd --zone=public --add-service=https --permanent
对外开放端口:firewall-cmd --add-port=8080/tcp --permanent
重新加载:firewall-cmd --reload
查看已经开放的端口:firewall-cmd --list-all
6.nginx 常用操作命令
前提:使用 nginx 操作命令需要先进入到 usr/local/nginx/sbin 目录中
1.查看 nginx 版本号: ./nginx -v
2.关闭 nginx:./nginx -s stop
3.启动命令:./nginx
4.重加载 nginx(修改配置文件以后重新加载文件):./nginx -s reload
5.查看 nginx 启动进程:ps -ef | grep nginx
7.配置文件组成
位置:usr/local/nginx/conf nginx.conf 打开命令:vi nginx.conf
1.全局块
从配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配置运行 nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。
比如:worker_processes 1;
这个 nginx 服务器处理并发服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是会受硬件、软件等设备的制约
2.events 块
events {
worker_connections 1024;
}
主要是 nginx 服务器与用户的网络的连接。上述例子表示每个 work process 支持的最大连接数为 1024.这部分对 nginx 的性能影响较大,在实际中应该灵活配置
3.http 块
nginx 中配置最频繁的地方,可以包括 http 全局块、server 块
8.nginx 配置实例—反向代理
8.1.实现效果
1.1 打开浏览器,在浏览器地址栏输入地址 www.123.com,跳转到 tomcat 8090 端口页面中
1.2 准备工作
1.安装 nginx
2.安装 tomcat
2.1.将压缩包放在 usr/src 文件夹中
2.2 解压压缩包:tar -xvf apache-tomcat-8.5.96.tar.gz
进入 bin 目录下,执行./startup.sh 启动
查看 tomcat 启动日志:cd …回到 tomcat 目录下,进入 logs 目录,使用 tail -f catalina.out 查看 tomcat 执行日志
3.安装 java 的 jdk
3.1.查看 yum 库中的 JDK 安装包:yum -y list java*
3.2.安装需要版本的 jdk:yun -y install java-1.8.0-openjdk*
3.3.默认安装位置为 /usr/lib/jvm/java-1.8.0-openjdk*/
3.4.查看版本号:java -version
8.2.在电脑 C:\Windows\System32\drivers\etc 修改 hosts 文件,添加 ip 和域名映射(如果直接用 ip 就不要映射)
格式:ip 域名
8.3 在 nginx 中进行请求转发配置(反向代理配置)
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name 192.168.101.109;
charset utf-8;
location /baidu {
proxy_pass http://www.baidu.com;
}
#第二个以及后面的路由后面必须加/ location后面不能像网上教的那样放~,不知道为啥
location /tomcat/ {
proxy_pass http://192.168.101.109:8080/;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
#如果需要监听其他端口可以添加一个server
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
9.nginx 配置实例—负载均衡
1.在 http 中添加 upstream 内容,myserver 是名称,server 里面 http 后面代理的是 myserver 里面的 ip
http {
include mime.types;
default_type application/octet-stream;
upstream myserver{
server 192.168.101.109:8080;
server 192.168.101.10:8089;
}
#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 8089;
server_name 192.168.101.108;
location /aa/ {
proxy_pass http://myserver/;
}
}
}
2.nginx 分配策略
2.1.默认是轮询,
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
2.2.weight
weight 代表权重,默认是 1,权重越高被分配的客户端越多。指定轮询几率,weigth 和访问比率成正比,用于后端服务器性能不均的情况。
upstream myserver{
server 192.168.101.109:8080 weight=1;
server 192.168.101.10:8089 weight=2; #分配到更多的请求
}
2.3.ip_hash
每个请求按访问 ip 的 hash 结果分配,每个访客固定访问一个后端服务器,可以解决 session 的问题。(用户第一次访问的哪个服务器,后面一直都会是哪个)
upstream myserver{
ip_hash;
server 192.168.101.109:8080;
server 192.168.101.10:8089;
}
2.4.fair(第三方)
按后端服务器响应时间来分配请求,响应时间短的优先分配
upstream myserver{
server 192.168.101.109:8080;
server 192.168.101.10:8089;
fair;
}
10.nginx-配置实例–动静分离
通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使浏览器缓存过期时间,减少与服务器之间的请求和流量。具体 Expires 定义:是给一个资源设定过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方式非常适合不经常变动的资源。(如果经常更新的文件,不建议使用 Expires 来缓存),设置 3d,表示 3 天之内访问这个 URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码 304,如果有修改,则直接从服务器重新下载,返回状态码 200.
location / {
root /dist;
try_files $uri $uri/ /index.html; #解决页面刷新404问题
index index.html index.htm;
}
location /prod-api/{
proxy_pass http://192.168.101.10:8080/; # 转发到后端
}
11.nginx-配置实例–高可用
12.1.配置高可用准备工作
(1)需要两台服务器 192.168.101.108 和 192.168.101.109
(2)在两台服务器安装 nginx
(3)在两台服务器安装 keepalived
(命令:yum install keepalived -y
检查是否安装成功:rpm -q -a keepalived
安装目录/etc/keepalived 配置文件:keepalived.conf)
(4)完成高可用的主从配置
keepalived.conf 配置内容替换内容,位置:/etc/keepalived/keepalived.conf
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.17.129
smtp_connect_timeout 30
router_id node1 #服务器的名字
}
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh"
interval 2 #(检测脚本执行的间隔,单位秒)
weight 2 #设置当前服务器的权重
}
vrrp_instance VI_1{
state BACKUP #备份服务器上将MASTER 改为 BACKUP
interface ens33 #网卡
virtual_router_id 51 #主、备机的virtual_router_id必须相同
priority 90 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1 #每隔1秒发送一个心跳,检测这个服务器还活着
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.101.70 //VRRP H虚拟地址
}
}
nginx_check.sh 脚本放置的位置/usr/local/src/nginx_check.sh
#!/bin/bash
A=`ps -C nginx - no-header |wc -l`
if [$A -eq 0];then
/usr/local/nginx/sbin/nginx
sleep 2
if [`ps -C nginx --no-header |wc -l` -eq 0];then
killall keepalived
fi
fi
(5)重新启动 nginx
(6)启动 keepalived:systemctl start keepalived.service
(7)查看启动进程:ps -ef | grep keepalived
测试:浏览器输入:192.168.101.70 即可进入主 nginx,关闭主 nginx,备用 nginx 开始工作(可添加对应路由进行跳转,例如:http://192.168.101.70/tomcat/)
12.nginx 工作原理
1.nginx 启动之后分两块:master 进程和 worker 进程,worker 可以有多个
2.master 和 worker 工作原理
3.一个 master 和多个 worker 的好处
(1)可以使用 nginx -s reload 热部署,利于 nginx 进行热部署操作。
比如上面有 4 个 worker,其中一个正在处理请求,此时进行配置文件重新加载,只有 3 个没有任务的加载,再过来的新请求执行的就是新的配置文件,等工作的 worker 处理完需求以后也会加载新的配置文件
(2)每个 worker 是独立的进程,如果有其中的一个 worker 出现问题,其他 worker 独立的,继续进行争抢,实现请求过程,不会造成服务中断。
(3)worker 的最大数量,最好是 cpu 的数量,即 4 核 4 个 worker
4.连接数 worker_connection
第一个:发送一个请求,占用了 worker 几个连接数
答:两个或者 4 个。当请求的是静态资源的时候是两个,如果需要请求数据库就是 4 个
第二个:nginx 支持的最大并发数
nginx 有一个 master,有 4 个 worker,每个 worker 支持的最大连接数是 1024,支持的最大并发数是多少?
答:普通的静态访问最大并发数是:worker_connections*worker 数/2
如果是反向代理:worker_connections*worker 数/4