Nginx学习笔记
通过视频写出的自己的笔记。适用Nginx初学者。
文章目录
- Nginx学习笔记
- 文章大致内容
- 一、Nginx是什么?
- 1、公司产品出现瓶颈?
- 2、什么是Nginx?
- 3、Nginx作用?
- 4、正向代理和反向代理
- 5、负载均衡
- 6、动静分离
- 二、安装
- 二、Nginx常用命令
- 三、nginx.conf 配置文
- 1、配置文件目录
- 2、 配置文件中的内容。
- 2.1、全局块
- 2.2、events 块
- 2.3、http 块
- 1、http全局块
- 2、 server块
- 2.1、proxy块反向代理模块
- 2.4、配置文件案例(可供参考)
- 1、基本部署:
- 2、server1的配置文件
- 3、nginx_gzip.conf的配置文件
- 4、解决跨域问题
- 5、 解决静态资源防盗链
- 6、Rewrite域名跳转
- 7、 配置SSL
- 四、Nginx 配置实例-反向代理实例 1
- 五、Nginx 配置实例-反向代理实例 2
- 六、Nginx 配置实例-负载均衡
- 1、案例
- 2、nginx 分配服务器策略
- 3、负载均衡状态
- 4、负载均衡配置(供参考)
- 七、Nginx 配置实例-动静分离
- 八、Nginx 配置高可用的集群
- 九、Nginx 的原理
文章大致内容
学习所需的软件链接:
https://pan.baidu.com/s/1wB4xQ2RfwhufXWeAu_FAqA 提取码: euj4
1、 nginx 简介
(1) 什么是 nginx 和可以做什么事情
(2) 正向代理
(3) 反向代理
(4) 动静分离
2、 Nginx 的安装
3、 Nginx 的常用命令和配置文件
4、 Nginx 配置实例 1 反向代理
5、 Nginx 配置实例 2 负载均衡
6、 Nginx 配置实例 3 动静分离
7、 Nginx 的高可用集群
(1) nginx 配置主从模式
(2) nginx 配置双主模式
一、Nginx是什么?
1、公司产品出现瓶颈?
- 我们公司项目刚刚上线的时候,并发量小,用户使用的少,所以在低并发的情况下,一个jar包启动应用就够了,然后内部tomcat返回内容给用户。
- 但是慢慢的,使用我们平台的用户越来越多了,并发量慢慢增大了,这时候一台服务器满足不了我们的需求了。
- 于是我们横向扩展,又增加了服务器。这个时候几个项目启动在不同的服务器上,用户要访问,就需要增加一个代理服务器了,通过代理服务器来帮我们转发和处理请求。
- 我们希望这个代理服务器可以帮助我们接收用户的请求,然后将用户的请求按照规则帮我们转发到不同的服务器节点之上。这个过程用户是无感知的,用户并不知道是哪个服务器返回的结果,我们还希望他可以按照服务器的性能提供不同的权重选择。保证最佳体验!所以我们使用了Nginx。
2、什么是Nginx?
- 百度百科定义:
- Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。2011年6月1日,nginx 1.0.4发布。
- 其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。在全球活跃的网站中有12.18%的使用比率,大约为2220万个网站。
- Nginx 是一个安装非常的简单、配置文件非常简洁(还能够支持perl语法)、Bug非常少的服务。Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够不间断服务的情况下进行软件版本的升级。
- Nginx代码完全用C语言从头写成。官方数据测试表明能够支持高达 50,000 个并发连接数的响应。
3、Nginx作用?
- 是一个高性能的HTTP和反向代理web服务器。
- 提供的服务:
- 动静分离(web 服务)
- 负载均衡 (反向代理)
- web 缓存
- 内存少,并发能力强(支持50,000 个并发)
4、正向代理和反向代理
-
正向代理:如果把局域网外的 Internet (外网)想象成一个巨大的资源库,则局域网中的客户端要访问 Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理需。要在客户端配置代理服务器进行指定网站访问
-
反向代理:其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。
5、负载均衡
- 含义:增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡
6、动静分离
- 含义:在我们的软件开发中,有些请求是需要后台处理的,有些请求是不需要经过后台处理的(如:css、html、jpg、js等等文件),这些不需要经过后台处理的文件称为静态文件。让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作。提高资源响应的速度。即可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。
二、安装
-
下载地址:http://nginx.org/en/download.html
-
nginx 在 linux 系统中如何进行安装。
-
1、安装gcc:安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装。
[root@localhost ~]# yum install gcc-c++
-
2、PCRE pcre-devel 安装:PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库,pcre-devel 是使用 pcre 开发的一个二次开发库。nginx也需要此库。
[root@localhost ~]# yum install -y pcre pcre-devel
-
3、zlib 安装:zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip ,所以需要在 Centos 上安装 zlib 库。
[root@localhost ~]# yum install -y zlib zlib-devel
-
4、OpenSSL 安装:OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要在 Centos 安装 OpenSSL 库。
[root@localhost ~]# yum install -y openssl openssl-devel
-
5、去官网下载安装包:手动下载.tar.gz安装包。下载完毕上传到服务器上。
-
6、解压
[root@localhost opt]# tar -zxvf nginx-1.18.0.tar.gz [root@localhost opt]# cd nginx-1.18.0/
-
7、配置:使用默认配置,在nginx根目录下执行。(默认安装到了:/usr/local/nginx目录下)
[root@localhost nginx-1.18.0]# ./configure [root@localhost nginx-1.18.0]# make [root@localhost nginx-1.18.0]# make install #查找安装目录 [root@localhost nginx-1.18.0]# whereis nginx nginx: /usr/local/nginx
-
进入Nginx安装目录,启动测试。
[root@localhost nginx-1.18.0]# cd /usr/local/nginx/ #conf 配置目录 #html页面 #logs 日志 #sbin 命令目录 [root@localhost nginx]# ls conf html logs sbin [root@localhost nginx]# cd sbin/ [root@localhost sbin]# ls nginx #启动Nginx 启动是没有输出就是好结果。 [root@localhost sbin]# ./nginx [root@localhost sbin]#
-
检查nginx是否启动成功。
#访问Nginx 打出页面信息 证明访问成功。 [root@localhost sbin]# curl localhost <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
-
注意:如何连接不上,检查阿里云安全组是否开放端口,或者服务器防火墙是否开放端口!(也可直接关闭防火墙)。
# 开启防火墙 service firewalld start # 重启防火墙 service firewalld restart # 关闭防火墙 service firewalld stop # 查看防火墙开放规则 firewall-cmd --list-all # 查询端口是否开放 firewall-cmd --query-port=8080/tcp # 开放80端口 firewall-cmd --permanent --add-port=80/tcp # 移除端口 firewall-cmd --permanent --remove-port=8080/tcp #重启防火墙(修改配置后要重启防火墙) firewall-cmd --reload # 参数解释 1、firwall-cmd:是Linux提供的操作firewall的一个工具; 2、--permanent:表示设置为持久; 3、--add-port:标识添加的端口;
-
-
Windows 如何安装
-
1、解压下载的安装包,目录结构如下:
-
2、进入配置文件查看默认的配置(现在主要查看默认监控的端口号)。
- 3、通过cmd运行 nginx.exe 程序(双击会直接闪过)。
- 4、检查nginx是否启动成功。直接在浏览器地址栏输入网址 http://localhost:80 回车,出现以下页面说明启动成功!
- 5、关闭nginx
- 如果使用cmd命令窗口启动nginx, 关闭cmd窗口是不能结束nginx进程的,可使用两种方法关闭nginx。
- (1)输入nginx命令 nginx -s stop(快速强制停止nginx) 或 nginx -s quit(完整有序安全的停止nginx)。
- (2)使用taskkill taskkill /f /t /im nginx.exe。
-
-
当我们修改了nginx的配置文件nginx.conf 时,不需要关闭nginx后重新启动nginx,只需要执行命令 nginx -s reload 即可让改动生效.
-
卸载Nginx.
# 关闭nginx进程 ./nginx -s stop #删除Nginx目录 rm -rf /user/local/nginx #清除配置 make clean
二、Nginx常用命令
-
查看 nginx 版本命令
[root@localhost sbin]# ./nginx -v nginx version: nginx/1.18.0
-
启动命令:在/usr/local/nginx/sbin 目录下执行 ./nginx
cd /usr/local/nginx/sbin/ ./nginx 启动
-
关闭命令
./nginx -s stop 停止 ./nginx -s quit 安全退出
-
重新加载命令
./nginx -s reload 重新加载配置文件 ps aux|grep nginx 查看nginx进程
-
设置nginx开机启动。
vim /etc/rc.local 然后在底部增加 /usr/local/nginx/sbin/nginx
三、nginx.conf 配置文
1、配置文件目录
- nginx 安装目录下,其默认的配置文件都放在这个目录的 conf 目录下,而主配置文件nginx.conf 也在其中,后续对 nginx 的使用基本上都是对此配置文件进行相应的修改。
2、 配置文件中的内容。
- 配置文件中默认有三大块:全局块、events块、http块,大多数的都是注释。
- 查看配置文件内容。
[root@localhost conf]# cat nginx.conf 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 localhost; location / { root html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } } ```
2.1、全局块
- 配置服务器整体运行的配置指令。比如 worker_processes 1:处理并发数的配置。
- user指令:用于配置运行Nginx服务器的worker进程的用户和用户组(配置允许运行Nginx工作进程的用户和用户组)。我们最开始创建Nginx时,执行./configure --user=user --group=group,在配置文件添加。
user 用户名;
- work process指令:
- nginx是进程模型,分为主进程、工作进程。
- master_process:用来指定是否开启工作进程。
- worker_processes:配置Nginx生成工作进程的数量,一般与CPU的内核数-1数保存一致。
# 设置工作进程 worker_processes 2;
2.2、events 块
- 影响 Nginx 服务器与用户的网络连接。
- accept_mutex指令:配置:accept_mutex on|off ;用来设置Nginx网络连接序列化。
- worker_connections指令:默认是 worker_commections 512;用来配置单个worker进程最大的连接数;(单个worker进程最大的连接数 * N个worker线程),这个值不能大于操作系统支持打开的最大文件句柄数量。(Linux一般是65535)
#支持的最大连接数为 1024。 worker_connections 1024
2.3、http 块
1、http全局块
-
include指令:包含和导入外部文件,进行模块化的划分。
include mime.types; default_type application/octet-stream;
-
sendfile指令:启用文件的高效传输,打开有利于文件传输的性能。
sendfile on; # 启用高效传输,与tcp_nopush联合使用 tcp_nopush on; # 当请求累积一定大小的时候,在进行发送
-
keepalive_requests指令:用来设置一个keep-alive连接使用的次数,客户端连接服务的超时时间。
-
gzip指令:开启它有利于文件和请求数据的传输。
gzip on
2、 server块
-
listen指令:用来配置监听端口。
-
server_name指令:用来设置虚拟主机服务名称。
server { listen 80; server_name www.xx1.cn www.xx2.cn; # 可以配置多个,也可以通配符进行配置 *.itcast.cn www.itcast.* 注意*只能在首尾部分 }
-
location指令:用来设置请求的URI。
server { ... server_name xxx.cn # 可以在location后面加=(精确匹配)~(支持正则)~*(支持正则,支持大写) location /abc{ default_type text/plain; return 200 "access success"; } }
-
error_page指令:设置网站的错误页面。
server { error_page 404 http://www.404.cn; } 或者 server{ error_page 404 /50x.html; error_page 500 502 503 504 /50x.html; location =/50x.html{ root html; } }
-
gzip_static指令:解决Gzip和sendfile共存问题,需要添加ngx_http_gzip_static_module模块,才能使用gzip_static指令。
2.1、proxy块反向代理模块
-
proxy_pass指令:令用来设置被代理服务器地址。
-
proxy_set_header指令:该指令可以更改Nginx服务器接收到的客户端请求的请求头信息,然后 将新的请求头发送给代理的服务器。
server { listen 8080; server_name localhost; # 设置DNS的IP,用来解析proxy_pass域名 resolver 8.8.8.8; location /server { proxy_pass http://192.168.xx.xx:8080/; proxy_set_header username TOM; } }
2.4、配置文件案例(可供参考)
- 具体可查看:https://www.kuangstudy.com/bbs/1440305839884795906#header19
1、基本部署:
```
# 全局块
# 配置允许运行Nginx工作进程的用户和用户组
user www;
# 一般是CPU核数-1
worker_processes 2;
# 配置Nginx服务器运行对错误日志存放的路径
error_log logs/error.log;
pid logs/nginx.pid;
# 全局块
events{
accept_mutex on;
multi_accept on;
# 设置Nginx的worker进程最大的连接数
worker_connections 1024;
}
# http块
http{
include mime.types;
default_type application/octet-stream;
# 配置允许使用sendfile方式运输,开启高效的文件传输
sendfile on;
tcp_nopush on;
tcp_nodelay on;
# 配置连接超时时间
keepalive_timeout 65;
# Gzip压缩功能配置
include /home/www/gzip/nginx_gzip.conf;
# 配置请求处理日志格式
log_format server1 '===>server1 access log';
# log_format server2 '===>server2 access log';
# server块 开始 #
include /home/www/conf.d/*.conf;
# server块 结束 #
}
```
2、server1的配置文件
server{
listen 8081;
# 设置虚拟主机服务名称,可以用域名,多个空格隔开,也可以通配符"*“例子:*.good.cn
server_name localhost;
# 配置请求处理日志存放路径
access_log /home/www/myweb/server1/logs/access.log server1;
location /server1/location1{
root /home/www/myweb;
index server1.html;
}
location /server1/location2{
root /home/www/myweb;
index server2.html;
}
# 配置错误页面转向
location = /404.html {
root /home/www/myweb;
index 404.html;
}
}
3、nginx_gzip.conf的配置文件
# 开启gzip功能
gzip on;
# 压缩源文件类型,例 application/javascript application/html;在mine.types里查看。
gzip_types *;
# 压缩级别 1-9
gzip_comp_level 6;
# 进行压缩响应页面的最小长度,小于这个数不进行压缩
gzip_min_length 1024k;
# 缓存空间大小,使用默认就好
gzip_buffers 4 16K;
# 指定压缩响应所需要的最低HTTP请求版,使用默认就好
gzip_http_version 1.1;
# 往头信息中添加压缩标识,默认是off
gzip_vary on;
# 对IE6以下的版本都不进行压缩
gzip_disable "MSIE [1-6]\.";
4、解决跨域问题
- 用add_header指令,该指令可以用来添加一些头信息
location /xxx{ add_header ‘Access-Control-Allow-Origin’ *; add_header ‘Access-Control-Allow-Credentials’ 'true'; add_header ‘Access-Control-Allow-Methods’ GET,POST,PUT,DELETE; add_header ‘Access-Control-Allow-Headers’ *; root /home/www/myweb; index server1.html; }
5、 解决静态资源防盗链
-
用valid_referers指令,如果在添加上域名或者IP地址,如果该值为1就返回403。
location /xxx { valid_referers none blocked www.baidu.* 127.0.0.1; if ($invalid_referer){ # 返回403 return 403 # 如果让该图片显示其他默认图片 rewrite ^/ /images/图片名.png break; } root /usr/local/nginx/html; } # 如果不算这个域名,会重定向403 valid_referers *.goodysr.cn if($invalid_referer){ return 403 }
6、Rewrite域名跳转
- 访问xxx1、xxx2域名 会跳转到zong的域名下。
server { listen 80; server_name www.xxx1.com www.xxx2.cn; rewrite ^(.*) http://www.zong.cn$1; # 也可以某个路径下进行跳转 location /user { rewrite ^/user(.*)$ http://www.user.cn$1; } }
7、 配置SSL
- 生成证书:使用阿里云等平台购买: 或者使用openssl。购买证书,然后创建证书,进行绑定域名,然后审核通过,下载证书。在服务器上某文件下(nginx/conf下),创建cert目录,存放所下载的证书文件。
server { listen 80; server_name 域名; # 将http请求重定向https上 rewrite ^(.*)$ https://$host$1; location / { root html; index index.html index.htm; } } server { listen 443 ssl; server_name 域名; root html; index index.html index.htm; # 证书文件 ssl_certificate cert/xxx.pem; ssl_certificate_key cert/xxx.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; # 加密规则 ssl_ciphers HIGH:!aNULL:!MD5; # 表示使用TLS协议类型 ssl_protocols TLSv1 TLSv1.1 TLSv1.2 ssl_prefer_server_ciphers on; location / { root html; index index.html index.htm; } }
四、Nginx 配置实例-反向代理实例 1
- 实现效果:打开浏览器,在浏览器地址栏输入地址 www.123.com,跳转到 liunx 系统 tomcat 主页面中。
- 准备工作
- 1、在 liunx 系统安装 tomcat,使用默认端口 8080。
- 2、tomcat 安装文件放到 liunx 系统中,解压。
[root@localhost opt]# tar -zxvf apache-tomcat-9.0.1.tar.gz
- 3、进入 tomcat 的 bin 目录中,./startup.sh 启动 tomcat 服务器。
[root@localhost opt]# cd apache-tomcat-9.0.1/ #进入bin目录 [root@localhost apache-tomcat-9.0.1]# cd bin/ [root@localhost bin]# ls bootstrap.jar catalina-tasks.xml configtest.bat digest.bat setclasspath.sh startup.bat tomcat-native.tar.gz version.bat catalina.bat commons-daemon.jar configtest.sh digest.sh shutdown.bat startup.sh tool-wrapper.bat version.sh catalina.sh commons-daemon-native.tar.gz daemon.sh setclasspath.bat shutdown.sh tomcat-juli.jar tool-wrapper.sh #启动tomcat [root@localhost bin]# ./startup.sh Using CATALINA_BASE: /opt/apache-tomcat-9.0.1 Using CATALINA_HOME: /opt/apache-tomcat-9.0.1 Using CATALINA_TMPDIR: /opt/apache-tomcat-9.0.1/temp Using JRE_HOME: /opt/java/jre Using CLASSPATH: /opt/apache-tomcat-9.0.1/bin/bootstrap.jar:/opt/apache-tomcat-9.0.1/bin/tomcat-juli.jar Tomcat started.
- 4、查看对外开放访问的端口,开放8080端口
#开放8080端口 firewall-cmd --add-port=8080/tcp --permanent #重新加载 firewall-cmd –reload #查看已经开放的端口号 firewall-cmd --list-all
- 5、在 windows 系统中通过浏览器访问 tomcat 服务器。(LinuxIp:8080)
- 访问过程的分析
- 具体配置
- 1、第一步 在 windows 系统的 host 文件进行域名和 ip 对应关系的配置
- 2、在 nginx 进行请求转发的配置(反向代理配置)。修改了配置文件,一定要重新加载,才能生效。
[root@localhost sbin]# ./nginx -s reload
- 最终测试
- 1、第一步 在 windows 系统的 host 文件进行域名和 ip 对应关系的配置
五、Nginx 配置实例-反向代理实例 2
- 实现效果:使用 nginx 反向代理,根据访问的路径跳转到不同端口的服务中
nginx 监听端口为 9001面中。
访问 http://169.254.118.173:9001/edu/ 直接跳转到 127.0.0.1:8080
访问 http://169.254.118.173:9001/vod/ 直接跳转到 127.0.0.1:8081 - 准备工作
- 1、准备两个 tomcat 服务器,一个 8080 端口,一个 8081 端口
#拷贝一个tomcat 到 tomcat8081文件夹下 [root@localhost opt]# cp -r apache-tomcat-9.0.1 tomcat8081/ [root@localhost opt]# cd tomcat8081/ [root@localhost tomcat8081]# cd apache-tomcat-9.0.1/conf/ #修改一个tomcat的访问端口号 [root@localhost conf]# vim server.xml
- 2、创建文件和页面
同样,进入8081端的tomcat下webapps,创建vod和a.html。#进入8080端口的tomcat [root@localhost opt]# cd apache-tomcat-9.0.1/ #进入webapps目录 [root@localhost apache-tomcat-9.0.1]# cd webapps/ [root@localhost webapps]# ls docs examples host-manager manager ROOT #创建 edu目录 [root@localhost webapps]# mkdir edu 进入edu目录 [root@localhost webapps]# cd edu/ #创建 a.html [root@localhost vod]# vim a.html <h1>8080</h1>
- 3、测试两个tomcat的访问页面
- 1、准备两个 tomcat 服务器,一个 8080 端口,一个 8081 端口
- 具体配置
-
1、找到 nginx (/usr/local/nginx/conf/)配置文件,进行反向代理配置。修改配置后,记得重新重新加载配置。
-
2、开放对外访问的端口号 9001 8080 8081,依次开放。
#开放9001端口 firewall-cmd --add-port=9001/tcp --permanent #重新加载 firewall-cmd –reload #查看已经开放的端口号 firewall-cmd --list-all
-
- 最终测试
六、Nginx 配置实例-负载均衡
1、案例
-
实现效果:浏览器地址栏输入地址 http://169.254.118.173:9001/edu/a.html,负载均衡效果,平均访问8080和 8081 端口中的a.html页面(两个服务器平均访问,一次一个的来)。
-
准备工作
- 1、准备两台 tomcat 服务器,一台 8080,一台 8081
- 2、在两台 tomcat 里面 webapps 目录中,创建名称是 edu 文件夹,在 edu 文件夹中创建页面 a.html,用于测试(8080端口的tomcat通过上面步骤已经加了edu文件夹,可不用再次添加)。
#拷贝 vod 到当前目录下 改名为 edu [root@localhost webapps]# cp -r vod/ /opt/tomcat8081/apache-tomcat-9.0.1/webapps/edu [root@localhost webapps]# ls docs edu examples host-manager manager ROOT vod [root@localhost webapps]# cd e [root@localhost webapps]# cd edu/ [root@localhost edu]# ls a.html [root@localhost edu]# cat a.html <h1>8081</h1>
-
在 nginx 的配置文件中进行负载均衡的配置。修改配置后,记得重新重新加载配置(上面配置的记得注释掉,否则看不到当前的效果)。
-
测试,如果使用谷歌浏览器,记得开启禁用缓存。
2、nginx 分配服务器策略
-
第一种 轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。 -
第二种 weight
weight 代表权重默认为 1,权重越高被分配的客户端越多,处理的请求更多。指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。upstream server_pool{ server 192.168.5.21 weight=10; server 192.168.5.22 weight=10; }
-
第三种 ip_hash
每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session共享 的问题。upstream server_pool{ ip_hash; server 192.168.5.21:80; server 192.168.5.22:80; }
-
第四种 fair
按后端服务器的响应时间来分配请求,响应时间短的优先分配。upstream server_pool{ server 192.168.5.21:80; server 192.168.5.22:80; fair; }
-
least_conn 根据最少连接方式 ,适合请求处理时间长短不一造成服务器过载。
-
url_hash 根据URL分配方式 ,hash &request_uri;
3、负载均衡状态
- down 不参与负载均衡
- backup 备份服务器,不执行,当主服务挂的时候才执行
- max_fails 允许请求失败的次数,max_fails =3
- fail_timeout 经过max_fails失败后,服务暂停时间,fail_timeout=15
- max_conns 限制最大的接收连接数,当这台机器最大并发是100,也就是值为100
4、负载均衡配置(供参考)
upstream backend {
server 127.0.0.1:9091 down;
server 127.0.0.1:9092 max_conns=100 weight=1;
server 127.0.0.1:9093 weight=2;
}
upstream backend2{
hash &request_uri;
server 127.0.0.1:9091;
server 127.0.0.1:9091;
}
server {
listen 80;
server_name localhost;
location / {
#root html;
#index index.html index.htm;
proxy_pass http://backend;
}
location /backend2/ {
proxy_pass http://backend2;
}
}
七、Nginx 配置实例-动静分离
- 什么是动静分离。
- Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用 Nginx 处理静态页面,Tomcat 处理动态页面。动静分离从目前实现角度来讲大致分为两种。
- 1、一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;
- 2、另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用 Expires 来缓存),我这里设置 3d,表示在这 3 天之内访问这个 URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码 304,如果有修改,则直接从服务器重新下载,返回状态码 200。
- 1、一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;
- Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用 Nginx 处理静态页面,Tomcat 处理动态页面。动静分离从目前实现角度来讲大致分为两种。
- 准备工作
- 1、在 liunx 系统中准备静态资源(创建data目录,放入动态资源和静态资源),用于进行访问。
- 1、在 liunx 系统中准备静态资源(创建data目录,放入动态资源和静态资源),用于进行访问。
- 具体配置
- 1、在 nginx 配置文件中进行配置。(需要重新加载配置)
- 1、在 nginx 配置文件中进行配置。(需要重新加载配置)
- 4、最终测试
- 访问静态资源。
- 访问静态资源的目录,会显示所有的静态资源。
- 访问动态资源。
- 访问静态资源。
八、Nginx 配置高可用的集群
-
什么是 nginx 高可用。
-
配置高可用的准备工作
- 1、需要两台服务器 192.168.17.129 和 192.168.17.131
- 2、在两台服务器安装 nginx
- 3、在两台服务器安装 keepalived
-
在两台服务器安装 keepalived
- 1、使用 yum 命令进行安装。 命令:yum install keepalived –y
[root@localhost sbin]# yum install keepalived -y
- 2、安装之后,在 etc 里面生成目录 keepalived,有文件 keepalived.conf
- 1、使用 yum 命令进行安装。 命令:yum install keepalived –y
-
完成高可用配置(主从配置)
- 1、修改/etc/keepalived/keepalivec.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 LVS_DEVEL } vrrp_script chk_http_port { script "/usr/local/src/nginx_check.sh" interval 2 #(检测脚本执行的间隔) weight 2 } vrrp_instance VI_1 { state MASTER # 备份服务器上将 MASTER 改为 BACKUP interface ens33 //网卡 virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同 priority 100 # 主、备机取不同的优先级,主机值较大,备份机值较小 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.17.50 // VRRP H 虚拟地址 } }
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 LVS_DEVEL } 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 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.17.50 // VRRP H 虚拟地址 } }
- 2、在/usr/local/src 添加检测脚本
#!/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
- 1、修改/etc/keepalived/keepalivec.conf 配置文件
-
把两台服务器上 nginx 和 keepalived 启动
- 启动 nginx:./nginx
- 启动 keepalived:systemctl start keepalived.service
-
最终测试
- 1、在浏览器地址栏输入 虚拟 ip 地址 192.168.17.50
- 2、把主服务器(192.168.17.129)nginx 和 keepalived 停止,再输入 192.168.17.50
- 1、在浏览器地址栏输入 虚拟 ip 地址 192.168.17.50
九、Nginx 的原理
- mater 和 worker进程。
- Nginx启动或会产生两个进程 。
- Nginx启动或会产生两个进程 。
- worker 如何进行工作的。通过mater接收各个请求,多个worker进程会去争抢,抢到后通过反向代理发送到对应的服务器上。
- 一个 master 和多个 woker 有好处
- 1、可以使用 nginx –s reload 热部署(更改配置文件),利用 nginx 进行热部署操作。没有任务的worker,会直接更新配置,有任务的worker在执行完任务后,在更新配置。
- 2、每个 woker 是独立的进程,,不需要加锁,所以省掉了锁带来的开销,如果有其中的一个 woker 出现问题,其他 woker 独立的,继续进行争抢,实现请求过程,不会造成服务中断。
- 设置多少个 woker 合适
- Nginx 同 redis 类似都采用了 io 多路复用机制,每个 worker 都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求, 即使是千上万个请求也不在话下。每个 worker 的线程可以把一个 cpu 的性能发挥到极致。所以 worker 数和服务器的 cpu数相等是最为适宜的。设少了会浪费 cpu,设多了会造成 cpu 频繁切换上下文带来的损耗。
- 连接数 worker_connection
- 第一个:发送请求,占用了 woker 的几个连接数?答案:2 (客户端访问静态资源,Nginx可以直接请求响应)或者 4 个(客户端访问动态资源,请求访问后Nginx后,通过反向代理,还需给tomcat服务器发送请求,在响应给Nginx,在响应给客户端)
- 第二个:nginx 有一个 master,有四个 woker,每个 woker 支持最大的连接数 1024,支持的最大并发数是多少?
- 普通的静态访问(静态资源)最大并发数是: worker_connections * worker_processes /2,处理静态资源:4*1024/2
- 而如果是 HTTP 作 为反向代理(动态资源)来说,最大并发数量应该是:worker_connections * worker_processes/4,处理动态资源:4*1024 /4