一、安装
环境:centos7.6、xshell6
安装PCRE库
PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库,pcre-devel 是使用 pcre 开发的一个二次开发库。nginx也需要此库。命令:
cd /usr/local/src wget https://ftp.pcre.org/pub/pcre/pcre-8.44.tar.gz
tar -zxvf pcre-8.44.tar.gz cd pcre-8.44 ./configure make make install prce -config —version
安装zlib库
zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip
cd /usr/local/src wget http://zlib.net/zlib-1.2.11.tar.gz tar -zxvf zlib-1.2.11.tar.gz cd zlib-1.2.11 ./configure make make install
安装ssl(某些vps默认没装ssl)
OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。
nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http)
cd /usr/local/src wget https://www.openssl.org/source/openssl-1.1.1g.tar.gz tar -zxvf openssl-1.1.1g.tar.gz
安装nginx
cd /usr/local/src wget http://nginx.org/download/nginx-1.18.0.tar.gz tar -zxvf nginx-1.18.0.tar.gz cd nginx-1.18.0 ./configure —sbin-path=/usr/local/nginx/nginx \ —conf-path=/usr/local/nginx/nginx.conf \ —pid-path=/usr/local/nginx/nginx.pid \ —with-http_gzip_static_module \ —with-http_stub_status_module \ —with-file-aio \ —with-http_realip_module \ —with-http_ssl_module \ —with-pcre=/usr/local/src/pcre-8.44 \ —with-zlib=/usr/local/src/zlib-1.2.11 \ —with-openssl=/usr/local/src/openssl-1.1.1g make -j2 make install
—with-pcre = / usr / local / src / pcre-8.44指的是pcre-8.44的源码路径。
—with-zlib = / usr / local / src / zlib-1.2.11指的是zlib-1.2 .11的原始路径。
安装成功后/ usr / local / nginx目录下如下
启动nginx
/usr/local/nginx/nginx
防火墙设置
nginx默认监听80端口
vim /usr/local/nginx/nginx.conf
查看开放的端口号
firewall-cmd —list-all
设置开放的端口号
firewall-cmd —add-service=http -permanent sudo firewall-cmd —add-port=80/tcp —permanent
重启防火墙
firewall-cmd —reload
浏览器访问IP
nginx编译选项
make是用来编译的,它从Makefile中读取指令,然后编译。
make install是用来安装的,它也从Makefile中读取指令,安装到指定的位置。
它定义了系统的各个方面,包括nginx的被允许使用的连接处理的方法,或者它会检测到你不是不是CC或GCC,不一定需要CC或GCC,它是一个shell脚本,执行结束时,它会创建一个Makefile文件。nginx的配置命令支持以下参数:
--prefix=
path` 定义一个目录,存放服务器上的文件,也就是nginx的安装目录。替换使用
/usr/local/nginx。`--sbin-path=
path设置nginx的重置文件的路径,替换为
prefix/sbin/nginx
。--conf-path=
pathnginx允许使用不同的配置文件启动,通过命令行中的-c选项。设置为
prefix/conf/nginx.conf
。--pid-path=
path 设置nginx.pid文件,将存储的主进程的进程号。安装完成后,可以随时改变的文件名 , 在nginx.conf配置文件中使用 PID指令。默认情况下,文件名 为```_prefix_
/logs/nginx.pid`。--error-log-path=
path设置主错误,警告,和诊断文件的名称。安装完成后,可以随时更改的文件名,在nginx.conf配置文件中使用的error_log指令
prefix/logs/error.log
。--http-log-path=
path安装完成后,可以随时更改的文件名,在nginx.conf配置文件中使用的access_log指令。或者在情况下,文件名为
prefix/logs/access.log
。--user=
name`` 设置nginx工作进程的用户。安装完成后,可以随时更改的名称在nginx.conf配置文件中。--group=
name`` 设置nginx工作进程的用户组。安装完成后,可以随时更改的名称在nginx.conf配置文件中。--with-select_module
--without-select_module 启用或禁用构建一个模块来允许服务器使用select()方法。该模块将自动建立,如果平台不支持的kqueue,epoll,rtsig或/dev/poll。
--with-poll_module
--without-poll_module
该模块将自动建立,如果平台不支持的kqueue,epoll,rtsig或/ dev / poll。--without-http_gzip_module
—不编译压缩的HTTP服务器的响应模块。编译并运行此模块需要zlib库。--without-http_rewrite_module
不编译重构模块。编译并运行此模块需要PCRE库支持。--without-http_proxy_module
—不编译http_proxy模块。--with-http_ssl_module
—使用https协议模块。有时情况下,该模块没有被编译。建立并运行此模块的OpenSSL库是必需的。--with-pcre=
path`` —设置PCRE库的二进制路径。PCRE库的二进制文件(版本4.4-8.30)需要从PCRE网站下载并解压缩。其余的工作是Nginx的。/configure和make来完成。正则表达式使用位置指令和ngx_http_rewrite_module模块中。--with-pcre-jit
—编译PCRE包含“即时编译”(1.1.12中,pcre_jit指令)。--with-zlib=
path`` —设置的zlib库的内核路径。要下载从zlib(版本1.1.3-1.2.5)的并解压。其余的工作是Nginx的。/configure和make完成。ngx_http_gzip_module模块需要使用zlib。--with-cc-opt=
parameters` 例如,当您在FreeBSD上使用PCRE库时需要使用:
—with-cc-opt=”-I /usr/local/include。。如需要需要增加
select()支持的文件数量:
—with-cc-opt=”-D FD_SETSIZE=2048”.`--with-ld-opt=
parameters` —设置附加的参数,将用于链接期间。例如,当在FreeBSD下使用该系统的PCRE库时,应指定:
—with-ld-opt=”-L /usr/local/lib”.`
典型实例(以下为了展示需要写在多行,执行时内容需要在同一行)
./configure —sbin-path=/usr/local/nginx/nginx —conf-path=/usr/local/nginx/nginx.conf —pid-path=/usr/local/nginx/nginx.pid —with-http_ssl_module —with-pcre=../pcre-4.4 —with-zlib=../zlib-1.1.3
二、常用命令
1、使用Nginx操作命令前提条件:必须进入到nginx安装目录
cd /usr/local/nginx
2、查看nginx的版本号
./nginx -v
3、启动nginx
./nginx
4、关闭nginx
./nginx -s stop
5、重新加载nginx
./nginx -s reload
三、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 {
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;
}
# 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.conf由三部分组成
全局块
- 从配置文件开始到
event
块之间的内容,主要会设置一些影响nginx服务器整体运行的配置指令,主要包括配置运行Nginx服务器的用户(组)、允许生成的worker process
数,进程PID存放路径、日志存放路径和类型以及配置文件的引入等。 - 比如上面第一行配置的:
worker_processes 1;
- 这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约
- 从配置文件开始到
events块
- events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 wordprocess 可以同时支持的最大连接数等。
events { worker_connections 1024;}
- 上述例子就表示每个 work process 支持的最大连接数为 1024。
- 这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。
http块
- 这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。
- 需要注意的是:http 块也可以包括 http 全局块、server 块。
http 全局块
- http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
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;
- http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
server 块
- 这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。
- 每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。
- 而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。
- 全局 server 块
- 最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。
- location 块
- 一个 server 块可以配置多个 location 块。
- 这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
- location 指令说明
location [= | ~ | ~* | ^~] uri{}
- = :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
- ~:用于表示 uri 包含正则表达式,并且区分大小写。
- ~*:用于表示 uri 包含正则表达式,并且不区分大小写。
- ^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。
- 注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~* 标识。 ```json 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; } }
<a name="fO3ju"></a>
## 四、Nginx配置实例
<a name="l12wo"></a>
### 1、反向代理
<a name="ameHf"></a>
#### 实例1
实现效果:打开浏览器,在浏览器地址栏输入地址 www.123.com ,跳转到 liunx 系统 tomcat 主页<br />准备工作:启动tomcat,开放防火墙端口(与上述开放端口步骤一致,80端口改为tomcat默认端口8080)
> cd /opt/tomcat/apache-tomcat-10.0.2/bin
> ./startup.sh
访问过程分析:<br /><br />具体实现:<br />window下配置host,路径`C:\Windows\System32\drivers\etc`,添加`nginx主机 访问路径`<br /><br />修改nginx.conf
> cd /usr/local/nginx/
> vim nginx.conf
> 
> server_name:nginx的ip
> proxy_pass:tomcat的ip:port
重启nginx:`./nginx -s reload`<br />效果: 
<a name="11iNs"></a>
#### 实例2
实现效果:<br />使用 nginx 反向代理, 根据访问的路径跳转到不同端口的服务中<br />nginx 监听端口为 9001<br />访问 [http://192.168.66.66:9001/edu/](http://127.0.0.1:9001/edu/) 直接跳转到 127.0.0.1:8081<br />访问 [http://1](http://1%2027.0.0.1:9001/vod/)[92.168.66.66](http://127.0.0.1:9001/edu/):[9001](http://127.0.0.1:9001/edu/)[/vod/](http://1%2027.0.0.1:9001/vod/) 直接跳转到 127.0.0.1:8082
准备工作:<br />复制tomcat 目录`cp -r tomcat tomcat8081、cp -r tomcat tomcat8082`<br />进入tomcat的conf目录中的server.xml<br /><br /><br />两个comcat都要修改,一个8015、8081,一个8025、8082,<br />在bin目录下的`startup.sh和shutdown.sh`添加如下
```xml
export JAVA_HOME=/usr/local/java/jdk-15.0.2 #jdk路径
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=$JAVA_HOME/bin
export CATALINA_HOME=/opt/tomcat/tomcat8082 #tomcat安装目录
export CATALINA_BASE=/opt/tomcat/tomcat8082
进入bin目录./startup.sh
启动两个tomcat服务。
在webapp目录下新建edu/vod文件,创建a.html
在usr/local/nginx下的server.xml 添加如下
server {
listen 9001;
server_name 192.168.66.66;
location ~ /edu/ {
proxy_pass http://localhost:8081;
}
location ~ /vod/ {
proxy_pass http://localhost:8082;
}
}
./nginx
启动nginx
效果:
2、负载均衡
随着互联网信息的爆炸性增长,负载均衡(load balance )已经不再是一个很陌生的话题顾名思义,负载均衡即是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响应足够快,给用户很好的体验。快速增长的访问量和数据流量催生了各式各样的负载均衡产品,很多专业的负载均衡硬件提供了很好的功能,但却价格不菲,这使得负载均衡软件大受欢迎,nginx 就是其中的一个,在 linux 下有 Nginx 、 LVS 、 Haproxy 等等服务可以提供负载均衡服务
实例
实现效果:
浏览器地址栏输入地址 http://[1](http://1%2027.0.0.1:9001/vod/)[92.168.66.66](http://127.0.0.1:9001/edu/)[/edu/a.html](http://192.168.%2017.129/edu/a.html) ,负载均衡效果,平均 8081和 8082 端口中
准备工作:
准备两台 tomcat 服务器,一台 8081 ,一台 8082
在两台 tomcat 里面 webapps 目录中,创建名称是 edu 文件夹,在 edu 文件夹中创建
页面 a.html ,用于测试
在 nginx 的配置文件中进行负载均衡的配置:
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; }
- 4、fair(第三方)
- 按后端服务器的响应时间来分配请求,响应时间短的优先分配。 upstream server_pool{ server 192.168.5.21:80; server 192.168.5.22:80; fair; }
3、动静分离
概述:
Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用Nginx 处理静态页面,Tomcat处理动态页面。动静分离从目前实现角度来讲大致分为两种。
一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;
另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。
通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用 Expires 来缓存),我这里设置 3d,表示在这 3 天之内访问这个 URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码 304,如果有修改,则直接从服务器重新下载,返回状态码 200。
准备工作:
在 liunx 系统中准备静态资源,用于进行访问
在 nginx 配置文件中进行配置:
4、高可用集群
什么是 nginx 高可用
rpm -ivh Percona-XtraDB-Cluster-shared-55-5.5.37-25.10.756.el6.x86_64.rpm
2 、配置高可用的准备工作
- 需要两台服务器 192.168.17.129 和 192.168.17.131
- 在两台服务器安装 nginx
- 在两台服务器安装 keepalived
3 、在两台服务器安装 keepalived
1 使用 yum 命令进行安装yum install keepalived y
安装之后,在 etc 里面生成目录 keepalived ,有文件 keepalived.conf
keepalived配置文件
# 全局配置
global_defs {
# 邮件通知信息
notification_email {
# 定义收件人
acassen@firewall.loc
}
# 定义发件人
notification_email_from Alexandre.Cassen@firewall.loc
# SMTP服务器地址
smtp_server 192.168.200.1
smtp_connect_timeout 30
# 路由器标识,一般不用改,也可以写成每个主机自己的主机名
router_id LVS_DEVEL
# VRRP的ipv4和ipv6的广播地址,配置了VIP的网卡向这个地址广播来宣告自己的配置信息,下面是默认值
vrrp_mcast_group4 224.0.0.18
vrrp_mcast_group6 ff02::12
}
# 定义用于实例执行的脚本内容,比如可以在线降低优先级,用于强制切换
vrrp_script SCRIPT_NAME {
}
# 一个vrrp_instance就是定义一个虚拟路由器的,实例名称
vrrp_instance VI_1 {
# 定义初始状态,可以是MASTER或者BACKUP
state MASTER
# 工作接口,通告选举使用哪个接口进行
interface ens33
# 虚拟路由ID,如果是一组虚拟路由就定义一个ID,如果是多组就要定义多个,而且这个虚拟
# ID还是虚拟MAC最后一段地址的信息,取值范围0-255
virtual_router_id 51
# 使用哪个虚拟MAC地址
use_vmac XX:XX:XX:XX:XX
# 监控本机上的哪个网卡,网卡一旦故障则需要把VIP转移出去
track_interface {
eth0
ens33
}
# 如果你上面定义了MASTER,这里的优先级就需要定义的比其他的高
priority 100
# 通告频率,单位为秒
advert_int 1
# 通信认证机制,这里是明文认证还有一种是加密认证
authentication {
auth_type PASS
auth_pass 1111
}
# 设置虚拟VIP地址,一般就设置一个,在LVS中这个就是为LVS主机设置VIP的,这样你就不用自己手动设置了
virtual_ipaddress {
# IP/掩码 dev 配置在哪个网卡
192.168.200.16/24 dev eth1
# IP/掩码 dev 配置在哪个网卡的哪个别名上
192.168.200.17/24 dev label eth1:1
}
# 虚拟路由,在需要的情况下可以设置lvs主机 数据包在哪个网卡进来从哪个网卡出去
virtual_routes {
192.168.110.0/24 dev eth2
}
# 工作模式,nopreempt表示工作在非抢占模式,默认是抢占模式 preempt
nopreempt|preempt
# 如果是抢占默认则可以设置等多久再抢占,默认5分钟
preempt delay 300
# 追踪脚本,通常用于去执行上面的vrrp_script定义的脚本内容
track_script {
}
# 三个指令,如果主机状态变成Master|Backup|Fault之后会去执行的通知脚本,脚本要自己写
notify_master ""
notify_backup ""
notify_fault ""
}
# 定义LVS集群服务,可以是IP+PORT;也可以是fwmark 数字,也就是防火墙规则
# 所以通过这里就可以看出来keepalive天生就是为ipvs而设计的
virtual_server 10.10.10.2 1358 {
delay_loop 6
# 算法
lb_algo rr|wrr|lc|wlc|lblc|sh|dh
# LVS的模式
lb_kind NAT|DR|TUN
# 子网掩码,这个掩码是VIP的掩码
nat_mask 255.255.255.0
# 持久连接超时时间
persistence_timeout 50
# 定义协议
protocol TCP
# 如果后端应用服务器都不可用,就会定向到那个服务器上
sorry_server 192.168.200.200 1358
# 后端应用服务器 IP PORT
real_server 192.168.200.2 1358 {
# 权重
weight 1
# MSIC_CHECK|SMTP_CHEKC|TCP_CHECK|SSL_GET|HTTP_GET这些都是
# 针对应用服务器做健康检查的方法
MISC_CHECK {}
# 用于检查SMTP服务器的
SMTP_CHEKC {}
# 如果应用服务器不是WEB服务器,就用TCP_CHECK检查
TCP_CHECK {
# 向哪一个端口检查,如果不指定默认使用上面定义的端口
connect_port <PORT>
# 向哪一个IP检测,如果不指定默认使用上面定义的IP地址
bindto <IP>
# 连接超时时间
connect_timeout 3
}
# 如果对方是HTTPS服务器就用SSL_GET方法去检查,里面配置的内容和HTTP_GET一样
SSL_GET {}
# 应用服务器UP或者DOWN,就执行那个脚本
notify_up "这里写的是路径,如果脚本后有参数,整体路径+参数引起来"
notify_down "/PATH/SCRIPTS.sh 参数"
# 使用HTTP_GET方法去检查
HTTP_GET {
# 检测URL
url {
# 具体检测哪一个URL
path /testurl/test.jsp
# 检测内容的哈希值
digest 640205b7b0fc66c1ea91c463fac6334d
# 除了检测哈希值还可以检测状态码,比如HTTP的200 表示正常,两种方法二选一即可
status_code 200
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl3/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
# 向哪一个端口检查,如果不指定默认使用上面定义的端口
connect_port <PORT>
# 向哪一个IP检测,如果不指定默认使用上面定义的IP地址
bindto <IP>
# 连接超时时间
connect_timeout 3
# 尝试次数
nb_get_retry 3
# 每次尝试之间间隔几秒
delay_before_retry 3
}
}
real_server 192.168.200.3 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334c
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334c
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
完成高可用配置(主从配置)
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 1 92.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 改为 BA CKUP
interface ens33 // 网卡
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 90 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1
vim /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
3 )把两台服务器上 nginx 和 keepalived 启动
启动 nginx ::./nginx
启动 keepalived systemctl start keepalived.service
nginx 原理与优化参数配置
master-workers 的机制的好处
首先,对于每个worker 进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。其次,采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断, master 进程则很快启动新的worker 进程。当然, worker 进程的异常退出,肯定是程序有 bug 了,异常退出,会导致当前 worker 上的所有请求失败,不过不会影响到所有请求,所以降低了风险。
需要设置多少个worker
Nginx同 redis 类似都采用了 io 多路复用机制,每个 worker 都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求, 即使是千上万个请求也不在话下。每个 worker 的线程可以把一个 cpu 的性能发挥到极致。所以 worker 数和服务器的 cpu数相等是最为适宜的。设少了会浪费 cpu ,设多了会造成 cpu 频繁切换上下文带来的损耗。
#设置 worker 数量。
worker_processes 4
#work绑定 cpu(4 work 绑定 4cpu) 。
worker_cpu_affinity 0001 0010 0100 1000
#work绑定 cpu (4 work 绑定 8cpu 中的 4 个 ) 。
worker_cpu_affinity 0000001 00000010 0000010000001000
连接数worker_connection
这个值是表示每个worker 进程所能建立连接的最大值,所以,一个 nginx 能建立的最大连接数,应该是 worker_connections worker_processes 。当然,这里说的是最大连接数,对于HTTP 请求本地资源来说,能够支持的最大并发数量是 worker_connections worker_processes ,如果是支持 http1.1 的浏览器每次访问要占两个连接,所以普通的静态访问最大并发数是: worker_connections worker_processes /2 ,而如果是 HTTP 作 为反向代理来说,最大并发数量应该是 worker_connections worker_processes/4。因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接。