一、Nginx概述
Nginx是一个高性能的HTTP和反向代理服务器,占用内存少,并发能力强;支持热部署。
- 正向代理【偏向客户端】:客户端主动改变请求地址。示例:国内访问需要代理服务访问谷歌。
- 反向代理【偏向服务端】:服务端自动改变请求地址。示例:服务端的负载均衡。
- 负载均衡 :负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
- Nginx的动静分离:动态网页和静态网页由不同的服务器来解析,加快解析速度,降低单个服务的压力。
二、Nginx配置
配置文件路径:/usr/local/nginx/conf/nginx.conf
#################第一部分:全局块#################
##影响Nginx服务器整体运行的配置
#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块#################
##影响Nginx服务器与用户的网络链接
events {
worker_connections 1024; #最大连接数
}
#################第三部分:http块#################
##3.1常用配置:文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单连接请求数上限……
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;
##3.2 每个http块可以包含多个server块,每个server相当于一个虚拟主机;而每个server块也分为全局server块以及同时包含多个location块
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;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
三、Nginx实例配置:反向代理
实例1:在浏览器中输入网址:www.123.com,跳转到tomcat的主页。
1.修改hosts文件
192.168.88.88 www.123.com
2.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.88.88;
location / {
root html;
proxy_pass http://127.0.0.1:8080;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
3.结果
结果实例2:根据路径不同跳转到不同服务中:
1.部署两套Tomcat: 参考:https://www.jb51.net/article/159521.htm
2.在两套Tomcat中,部署静态页面作为测试 8080
9090
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 8060;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
}
server {
listen 8061;
server_name 192.168.88.88;
location ~ /path80/ {
proxy_pass http://192.168.88.88:8080;
}
location ~ /path90/ {
proxy_pass http://192.168.88.88:9090;
}
}
}
4.测试结果
8080
9090
四、Nginx实例配置:负载均衡
常用策略
- 轮询:每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
- 权重:指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
- ip_hash:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
- fair(第三方):按后端服务器的响应时间来分配请求,响应时间短的优先分配。
- url_hash(第三方):按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法。
1.在两台tomcat中各自准备相同的页面,内容不一样的HTML。
8080 9090
2.nginx配置负载均衡
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream demo{
server 192.168.88.88:8080;
server 192.168.88.88:9090;
}
server {
listen 8060;
server_name localhost;
location / {
root html;
index index.html index.htm;
proxy_pass http://demo/docs/demo.html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
3.效果展示:轮询策略访问。
8080 9090五、Nginx实例配置:动静分离
1.准备环境
jsp动态资源 html静态资源2.nginx配置
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream demo{
server 192.168.88.88:8080;
server 192.168.88.88:9090;
}
server {
listen 8060;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
proxy_pass http://demo/docs/demo.html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 8061;
server_name 192.168.88.88;
location ~ /path80/ {
proxy_pass http://192.168.88.88:8080;
}
location ~ /path90/ {
proxy_pass http://192.168.88.88:9090;
}
}
upstream nostaticServer {
server 192.168.88.88:8080;
}
upstream staticServer {
server 192.168.88.88:9090;
}
server {
listen 8062;
server_name 192.168.88.88;
access_log logs/access.log;
#匹配到静态资源时,交由后台tomcat9090处理静态资源
location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma|css) {
proxy_pass http://staticServer;
proxy_set_header X-Real-IP $remote_addr;
}
#匹配到动态资源时,交由后台tomcat8080处理动态资源
location ~ .*\.jsp$ {
proxy_pass http://nostaticServer;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
3.结果
tomcat8080处理动态资源 tomcat9090处理静态资源六、Nginx实例配置:高可用集群
摘抄:https://www.cnblogs.com/wenxuehai/p/15013654.html
1.安装keepalived
keepalived 是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。keepalived 需要绑定一个虚拟地址 vip (Virtual IP Address ) ,这个虚拟 ip 地址绑定在哪台服务器上请求就会发送到哪台服务器,一开始会绑定在主服务器上。
2.配置keepalived
首先需要修改 keepalived 的配置文件,keepalived 的配置文件在 /etc/keepalived 目录下。
2.1主配置:
global_defs {
notification_email { # keepalived服务宕机异常出现的时候,发送通知邮件 可以是多个
acassen@firewall.loc # 收件人邮箱1
failover@firewall.loc # 收件人邮箱2
sysadmin@firewall.loc # 收件人邮箱3
}
notification_email_from Alexandre.Cassen@firewall.loc #邮件发件人
smtp_ server 192.168.32.128 #主服务器的ip地址。邮件服务器地址
smtp_connect_timeout 30 # 超时时间
router_id LVS_DEVEL # 机器标识 局域网内唯一即可。 LVS_DEVEL这字段在/etc/hosts文件中看;通过它访问到主机
}
vrrp_script chk_http_ port {
script "/usr/local/src/nginx_check.sh" #检测脚本存放的路径
interval 2 # 检测脚本执行的间隔,即检测脚本每隔2s会自动执行一次
weight 2 #权重,如果这个脚本检测为真,服务器权重+2
}
vrrp_instance VI_1 {
state MASTER # 指定keepalived的角色,MASTER为主,BACKUP为备。备份服务器上需将MASTER 改为BACKUP
interface ens33 # 通信端口 通过ip addr可以看到,根据自己的机器配置
virtual_router_id 51 # vrrp实例id keepalived集群的实例id必须一致,即主、备机的virtual_router_id必须相同
priority 100 #优先级,数值越大,获取处理请求的优先级越高。主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1 #心跳间隔,默认为1s。keepalived多机器集群 通过心跳检测当前服务器是否还正常工作,如果发送心跳没反应,备份服务器就会立刻接管;
authentication { # 服务器之间通信密码
auth type PASS #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
auth pass 1111
}
virtual_ipaddress { # 自定义虚拟IP。自定义的虚拟ip得根据真实ip设置。比如真实ip是192.168.91.138,那么虚拟ip可以设置为192.168.91.139~255,前面三个数得一致
192.168.32.50 # 定义虚拟ip(VIP),可多设,每行一个
}
}
2.2备配置:
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_ server 192.168.32.130 #备份服务器的ip地址
smtp_connect_timeout 30
router_id LVS_DEVEL # LVS_DEVEL这字段在/etc/hosts文件中看;通过它访问到主机
}
vrrp_script chk_http_ port {
script "/usr/local/src/nginx_check.sh" #检测脚本
interval 2 # (检测脚本执行的间隔)2s
weight 2 #权重,如果这个脚本检测为真,服务器权重+2
}
vrrp_instance VI_1 {
state BACKUP # 指定keepalived的角色,MASTER为主,BACKUP为备。备份服务器上需将MASTER 改为BACKUP
interface ens33 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡
virtual_router_id 51 # 虚拟路由编号,主、备机的virtual_router_id必须相同
priority 90 #优先级,数值越大,获取处理请求的优先级越高。主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数),每隔1s发送一次心跳
authentication { # 校验方式, 类型是密码,密码1111
auth type PASS #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
auth pass 1111
}
virtual_ipaddress { # 虛拟ip
192.168.32.50 # 定义虚拟ip(VIP),可多设,每行一个
}
}
2.3 nginx_check.sh配置
主备服务器的 /usr/local/src 目录下分别创建一个 nginx_check.sh 脚本文件。
#! /bin/bash
#检测nginx是否启动了
A=`ps -C nginx -no-header | wc - 1`
if [ $A -eq 0];then #如果nginx没有启动就启动nginx
/usr/local/nginx/sbin/nginx #通过Nginx的启动脚本来重启nginx
sleep 2
if [`ps -C nginx --no-header| wc -1` -eq 0 ];then #如果nginx重启失败,则下面就会停掉keepalived服务,进行VIP转移
killall keepalived
fi
fi
3.启动nginx和keepalived
七、Nginx原理
Nginx原理
Nginx进程模型 master和worker工作机制Nginx的连接数:
- worker_processes work数量:work数和服务器的CPU数量相等比较适宜。
- worker_connections work的连接数:一个Nginx能建立的最大连接数,应该是worker_processes * worker_connections。这
个最大连接数,对与HTTP请求本地资源来说,能够支持的最大并发数量是worker_processes * worker_connections;如果是支持http1.1的浏览器每次访问要占两个连接,所以普通的静态访问最大并发数是(worker_processes * worker_connections)/2;而如果是HTTP作为反向代理来说,最大并发数是(worker_processes * worker_connections)/4。
Nginx组成部分
由内核和模块组成。摘抄:https://www.cnblogs.com/xiangsikai/p/8438772.html
ngnix组成Nginx本身做的工作实际很少,当它接到一个HTTP请求时,它仅仅是通过查找配置文件将此次请求映射到一个location block,而此location中所配置的各个指令则会启动不同的模块去完成工作,因此模块可以看做Nginx真正的劳动工作者。
通常一个location中的指令会涉及一个handler模块和多个filter模块(当然,多个location可以复用同一个模块)。handler模块负责处理请求,完成响应内容的生成,而filter模块对响应内容进行处理。用户根据自己的需要开发的模块都属于第三方模块。正是有了这么多模块的支撑,Nginx的功能才会如此强大。
Nginx的模块从结构上分为核心模块、基础模块和第三方模块:
- 核心模块:HTTP模块、EVENT模块和MAIL模块
- 基础模块:HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块,
- 第三方模块:HTTP Upstream Request Hash模块、Notice模块和HTTP Access Key模块。
Nginx的模块从功能上分为如下三类:
- Handlers(处理器模块):此类模块直接处理请求,并进行输出内容和修改headers信息等操作。Handlers处理器模块一般只能有一个。
- Filters (过滤器模块):此类模块主要对其他处理器模块输出的内容进行修改操作,最后由Nginx输出。
- Proxies (代理类模块):此类模块是Nginx的HTTP Upstream之类的模块,这些模块主要与后端一些服务比如FastCGI等进行交互,实现服务代理和负载均衡等功能。
网友评论