nginx从入门到精通

一、nginx功能

1.nginx 是什么

高性能的Http和反向代理的服务器,占用内存少,处理并发能力强

特点:支持热部署,启动容易并且可以长时间不间断运行,在不间断服务时可以进行版本升级

2. 反向代理

正向代理: 客户访问服务器通过代理服务器,就是正向代理(在客户端配置代理服务器)

反向代理:客户端不需要任何配置,将请求发送到代理服务器,然后代理服务器选择目标服务器获取数据之后,在返回给客户端,这个时候代理服务器和服务器就是一个整体,暴露的是代理服务器地址,隐藏了服务器地址同时客户端对代理是无感知的。

总结:

正向代理即是客户端代理, 代理客户端, 服务端不知道实际发起请求的客户端.

反向代理即是服务端代理, 代理服务端, 客户端不知道实际提供服务的服务端

3. 负载均衡

增加服务器的数量,将之前向一个服务器发送多个请求的过程改进为将多个请求分发到多个服务器上

总结:通过nginx或者代理服务器将请求分发到多个服务器上

4. 动静分离

为了加快网站的解析速度,将原来的动态资源和静态资源分别发到不同的服务器上来解析,降低服务器的压力

二、nginx安装,命令和配置文件

1. Linux 的安装

一键安装依赖:

yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel

安装nginx:

//进入目录

cd nginx-1.13.7

//执行命令 考虑到后续安装ssl证书 添加两个模块

./configure --with-http_stub_status_module --with-http_ssl_module

//执行make命令

make

//执行make install命令

make install

安装完成之后,自动生成一个文件夹:

在/usr/local/nginx/sbin/nginx

命令: /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

或者进入/usr/local/nginx/sbin目录,使用./nginx

配置配置文件:

/usr/local/nginx/conf 下的nginx.conf

默认端口是80

2.nginx 常用命令

查看版本号: 进入安装目录 usr/local ./nginx -v

启动:./nginx

关闭:./nginx -s stop

查看启动:ps -ef | grep nginx

重新加载nginx:./nginx -s reload

3.nginx 配置文件

在usr/local/nginx/conf/ 下的nginx.conf

1)全局块 设置一些影响nginx服务器整体运行的配置指令

如:第一行的 worker_processes 1; --值越大,处理并发量越大,但受到设备限制

2)events块 影响nginx服务器与用户的网络的链接

如:

events {

worker_connections 1024; ---表示支持的最大连接数

}

3)http块

a.http全局块

包括文件引入,日志自定义,链接超时时间,单链接请求书上限,MIME-TYPE定义等等

b.server块

和虚拟主机密切相关,每个server块相当于一个虚拟主机

包含全局server块和location块

举例:前后端分离项目,用nginx部署:

后端配置文件:

#服务端口号

server.port=8001

#服务环境上下文路径

server.servlet.context-path=/ybgpt

xcom.servlet.url-patterns=/api/*

3、nginx配置实例1-反向代理

该实例要实现的效果:

输入www.123.com 跳转到linux上面的tomcat启动页

具体配置:

1.在windows的host文件配置:

文件路径: C:\Windows\System32\drivers\etc\hosts‬‬‬

添加:

192.168.223.129 www.123.com

2.在nginx的配置文件中修改配置:

当我们访问192.168.223.129:80 时,++++会(请求转发)跳转到location 127.0.0.1:8080++++

3.测试

浏览器输入

www.123.com

界面:

反向代理实例二:

使用反向代理,根据访问的路径跳转到不同端口的服务中,nginx监听端口9001

访问http://192.168.223.129:9001/edu/a.html 跳转到127.0.0.1:8081

这里,将tomcat的端口改为8081,同时在tomcat的webapp目录下添加文件夹edu ,在其中添加a.html文件

然后再nginx的配置文件中设置监听的端口为9001,当我们在浏览器访问192.168.223.129:9001时,

就会跳转到tomcat的8081端口的页面,如果访问路径中添加文件名,就会访问放置在tomcat服务器上的

相应的文件。

修改nginx的配制文件:

server {

listen 9001;

server_name 192.168.223.129;

location ~/edu/ {

proxy_pass http://127.0.0.1:8081;

}

}

location的配置:

参见 https://zhuanlan.zhihu.com/p/137146854

4、nginx配置实例2-负载均衡

浏览器输入 http://192.168.223.129/test/a.html ,负载均衡,平均到8080,8081两个服务器。

配置两台服务器,分别在两个服务器的webapps文件夹下添加文件夹test,下面添加文件a.html

然后,

修改配置文件:

在http块添加:

upstream myserver{

server 192.168.223.129:8080;

server 192.168.223.129:8081;

}

修改server:

server{

listen 80;

server_name 192.168.223.129;

location / {

proxy_pass http://myserver;

root html;

index index.html index.htm;

}

}

解释:http://192.168.223.129/test/a.html 这个请求具体含义是

访问192.168.223.129 的80 端口,然后由于在nginx的监听端口为80,同时访问该端口会转发到

配置文件中设置好的tomcat的ip地址和端口去,该请求后边的文件访问路径就是部署在tomcat上的文件及其路径

这样,从浏览器访问到nginx服务器的80端口,然后该端口转发到tomcat1的8080端口,tomcat2的8081

端口,然后分别访问这两个服务器的test/html 文件,如果有多个请求发送过来,就可以由这两个服务器分担请求,实现负载均衡

nginx服务提供的负载均衡的分配策略:

1.默认-轮询

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

2.weight

weight和访问比率成正比,用于后端服务器性能不均的情况,权重越高,请求访问的几率就越高

3.ip_hash

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

4.fair(第三方

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

5.url_hash(第三方)

按访问url的hash结果来分配请求,使每个url定向到同一个(对应的)后端服务器,后端服务器为缓存时比较有效。

5、nginx配置实例3-动静分离

严格意义上说,动静分离就是把动态请求和静态请求分离,Tomcat处理动态请求,Nginx处理静态请求。

而不是简单的把动态资源和静态资源分离开

处理方法:

1.将静态资源单独放在静态资源服务器中(常见),有独立的域名。

2.动态,静态文件混合,通过nginx来区分。

具体:通过location 指定不同的后缀名实现不同的请求转发

注意: 设置expires参数来设置浏览器缓存过期时间

也就是可以让该文件缓存在浏览器,在缓存过期时间内,访问特定的URL就不会再去访问服务器,直接访问缓存,如果文件有更新就会从服务器重新下载,(不适用于经常修改的文件),例子如下:

6、nginx配置高可用集群

问题:当nginx宕机之后,请求无法实现

解决:配置处Nginx的高可用主备模式:

产生一个虚拟IP,使用一个软件keepalived检测MASTER是否宕机 ,主服务器可以用就将虚拟IP绑定在MASTER上。

如果MASTER宕机,就将虚拟IP绑定在 BACKUP上。

具体配置高可用:

两台服务器分别安装nginx和keepalived

三、nginx的keepalived

1. 安装 keepalived

yum -y install keepalived

若出现缺少依赖,使用下面两条命令下载并安装相关依赖:

wget https://repo.mysql.com/yum/mysql-5.7-community/el/7/x86_64/mysql-community-libs-compat-5.7.32-1.el7.x86_64.rpm

rpm -vih mysql-community-libs-compat-5.7.32-1.el7.x86_64.rpm

查看keepalived的安装版本:

rpm -q -a keepalived

2. 安装之后

etc 里面生成 keepalived/keepalived.conf 配置文件

3. 修改配置文件:(主备服务器都需要修改,只需要修改下面的红色部分)

! Configuration File for keepalived

global_defs {

notification_email {

acassen@firewall.loc

failover@firewall.loc

sysadmin@firewall.loc

}

notification_email_from Alexandre.Cassen@firewall.loc

smtp_server 192.168.223.129 #发送邮件通知的SMTP服务器,不用管

smtp_connect_timeout 30

router_id LVS_DEVEL #在etc/hosts 文件中修改主机的名称,后边的是标识主机的字符串,可以不是主机

vrrp_skip_check_adv_addr

vrrp_strict

vrrp_garp_interval 0

vrrp_gna_interval 0

}

vrrp_script chk_http_port{

scripts "/usr/local/src/nginx_check.sh" #检测的脚本的路径

interval 2 #检测脚本执行间隔,s为单位

weight 2 #权重

}

vrrp_instance VI_1 {

state MASTER #备份服务器改为BACKUP

interface ens33 #网卡

virtual_router_id 51 #主机和备份机的虚拟id必须一致

priority 100 #主备机去不同的优先级,主机值较大,备份机值小

advert_int 1 #隔一秒发送一个心跳,检测主服务器还存活

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

192.168.223.50 #虚拟IP地址

}

}

4. 添加 keepalived 的检测脚本,要放到下面路径:(主备服务器都需要脚本)

#!/bin/bash

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

if [ $run -eq 0 ];then

/usr/local/nginx/sbin/nginx -s stop

/usr/local/nginx/sbin/nginx

sleep 3

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

Kill all keepalived

fi

fi

//默认每隔3秒钟执行一次检测脚本,检查nginx服务是否启动,如果没启动就把nginx服务启动起来,如果启动不成功,就把keepalived服务down掉,让漂浮到备keepalived上

5. 启动 keepalived

systemctl start keepalived.service

查看是否启动:

ps -ef | grep keepalived

6. 效果:

访问配置的虚拟IP,可以实现,关闭主服务器的nginx,仍然可以访问到我们的虚拟IP地址,这表示,我们写的keepalived脚本文件起作用,检测到主服务器宕机之后,自动将虚拟IP地址绑定到备份服务器上,仍然可以访问到。

四、nginx执行原理

1.nginx中两个进程:

master,worker

2.worker怎么工作:

master首先收到请求,然后worker进行争抢请求,在通过反向代理,借助tomcat等其他服务器实现请求。

3.一个master和多个worker的好处:

可以使用 nginx -s reload 热部署

每个worker都是独立的,不需要加锁,节省开销,并且能够保证服务不会中断,降低风险

4.如何合理设置worker的数量:

Nginx同redis使用了多路IO复用机制,每个进程中只有一个主线程,通过异步非阻塞方式实现,每个worker都可以把cpu发挥到极致,因此,worker和cpu的数量相等是最合适的。

5.连接数 work_connection

1) 发送一个请求,占用几个worker的连接数? 2/4个

请求传到worker,如果是静态请求,worker之间返回值,两个连接数,如果是动态请求,在前边的基础上还要访问tomcat和从tomcat中获取值 ,共四个连接数

2) 一个nginx,四个worker,每个worker支持最大的连接数是1024,支持的最大并发数是多少?

1024*4 总的worker的最大连接数

最大并发数 1024*4 /2 或者 4

普通静态访问,最大并发数:work_connection * work_processes/2

做HTTP反向代理,最大并发数:work_connection * work_processes /4

五、nginx的常见问题

1.平滑升级以及降级

2.nginx请求转发(HTTP转发HTTPS)

3.nginx解决跨域问题

相关推荐
hsjcjh2 小时前
Nodemailer使用教程:在Node.js中发送电子邮件
linux·运维·node.js
没有梦想的咸鱼185-1037-16633 小时前
北斗高精度数据解算:破解城市峡谷/长基线/无网区难题,从毫米级定位到自动化交付——(GAMIT/GLOBK底层核心解算技术方法)
运维·arcgis·数据分析·自动化
不怕犯错,就怕不做3 小时前
linux 如何查看自己的帐号密码及samba的帐号和密码
linux·运维·服务器
实在智能RPA3 小时前
Agent 在物流行业能实现哪些自动化?——深度拆解 AI Agent 驱动的智慧物流新范式
运维·人工智能·ai·自动化
张3234 小时前
Linux 启动过程
linux·运维
李彦亮老师(本人)4 小时前
Rocky Linux 9.x 新特性详解
linux·运维·服务器·centos·rocky linux
芳草萋萋鹦鹉洲哦5 小时前
【windows】nginx如何注册为开机自启的服务(WinSW实现)
运维·windows·nginx
猩猩—点灯6 小时前
部署远程利器-RustDesk
运维·服务器·网络
biubiubiu07067 小时前
Linux 中 `source` 和 `systemctl daemon-reload` 的区别与踩坑点
linux·运维·服务器