Nginx
- 0、Nginx中文文档及版本选择
- 1、Nginx概念
- 1、正向代理
- 2、反向代理
- 3、负载均衡
- 4、动静分离
- 2、源码安装Nginx
- 3、Nginx常用命令
- 4、Nginx配置文件
- 第一部分:全局块
- 第二部分:events块
- 第三部分:http块
- http全局块:
- upstream模块
- server块:
- 1.全局server块
- 2.location块
- (1)proxy_pass模块
- 5、Nginx配置高可用集群
- 6、Nginx原理
- 7、Nginx优化
- 优化思路
- 1、socket层面优化
- 1.Nginx层面优化
- (1)优化worker_processes
- (2)优化worker_connections
- (3)优化keepalive_timeout 0;
- 2.系统层面优化
- (1)优化somaxconn
- (2)优化tcp_tw_recycle
- (3)优化tcp_tw_reuse
- (4)优化tcp_syncookies
- 2、文件方面优化
- 1.优化worker_rlimit_nofile
- 2.优化ulimit -n
- 8、httpd-tools压力测试
- 1.安装httpd-tools
0、Nginx中文文档及版本选择
1.13.x、1.15.x、1.17.x系列是开发版本
1.12.x、1.14.x、1.16.x系列是稳定版本
2016-04-26
nginx-1.10.0稳定版本已经发布
2017-04-12
nginx-1.12.0已经发布了稳定的版本
2018-04-17
nginx-1.14.0已经发布了稳定的版本
2019-04-23
nginx-1.16.0已经发布了稳定的版本
2020-04-21
nginx-1.18.0已经发布了稳定的版本
1、Nginx概念
nginx是一个高性能http和反向代理web服务器。
占有内存少、并发能力强。
最高支持50000并发数。
1、正向代理
在客户端(浏览器)配置代理服务器。通过代理服务器进行互联网访问。
2、反向代理
请求发送到代理服务器,由代理服务器去选择目标服务器获取数据后,返回给客户端。只暴露代理服务器地址,隐藏真是服务器地址。
proxy_pass #反向代理
server {
linsten 80;
server_name www.wy.com;
location ~ /wy/ {
proxy_pass http://127.0.0.1:8080;
}
location ~ /dyp/ {
proxy_pass http://127.0.0.1:8081;
}
}
#匹配到URL中含有wy的转发至8080端口。含有dyp的转发到8081端口。
3、负载均衡
单台服务器解决不了,增加服务器数量搭建web集群,将原单台服务器上的请求分发到集群中各个服务器上。
Nginx负载均衡几种策略
1、轮询
http {
...
upstream server-name {
server 10.0.0.7:8080;
server 10.0.0.7:8081;
}
...
server {
location / {
proxy_pass http://server-name;
proxy_connect_timeout 10; #超时时间
}
}
}
2、weight 权重
默认为1。权重越高分配的客户端越多。
http {
...
upstream server-name {
server 10.0.0.1:8080 weight=1;
server 10.0.0.2:8080 weight=2;
server 10.0.0.3:8080 weight=3;
}
...
server {
location / {
proxy_pass http://server-name;
proxy_connect_timeout 10; #超时时间
}
}
}
3、ip_hash
采用IP HASH算法,每个ip固定访问一个后端服务器,可以解决session的问题
http {
...
upstream server-name {
ip_hash;
server 10.0.0.1:8080;
server 10.0.0.2:8080;
server 10.0.0.3:8080;
}
...
server {
location / {
proxy_pass http://server-name;
proxy_connect_timeout 10; #超时时间
}
}
}
4、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的有限分配。
http {
...
upstream server-name {
server 10.0.0.1:8080;
server 10.0.0.2:8080;
server 10.0.0.3:8080;
fair;
}
...
server {
location / {
proxy_pass http://server-name;
proxy_connect_timeout 10; #超时时间
}
}
}
4、动静分离
动态页面和静态页面分别有不同的服务器进行解析。加快解析速度,降低原戴个服务器压力。
http {
...
server {
...
location /www {
root /data/;
index index.html;
}
location /image{
root /data/;
autoindex on;
}
...
}
...
}
2、源码安装Nginx
Nginx官方下载 需要依赖:
- pcre
pcre官方下载
curl -O ftp://ftp.pcre.org/pub/pcre/pcre-8.44.zip
解压
unzip pcre-8.44.zip
cd pcre-8.44
yum -y install gcc-c++
./configure
make && make install #安装
pcre-config --version #查看版本号
- openssl
- zlib
yum install -y make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
- nginx
curl -O http://nginx.org/download/nginx-1.18.0.tar.gz
tar -xzvf nginx-1.18.0.tar.gz
cd nginx-1.18.0
./configure
make && make install
cat >>/etc/profile <<EOF
export PATH=$PATH:/usr/local/nginx/sbin
EOF
. /etc/profile
nginx
ps -ef | grep nginx
pkill -9 nginx
编译安装nginx并使用systemctl方式管理
cat >/usr/lib/systemd/system/nginx.service <<EOF
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
[Unit]:服务的说明
Description:描述服务
After:描述服务类别
[Service]服务运行参数的设置
Type=forking是后台运行的形式
ExecStart为服务的具体运行命令
ExecReload为重启命令
ExecStop为停止命令
PrivateTmp=True表示给服务分配独立的临时空间
[Install]运行级别下服务安装的相关设置,可设置为多用户,即系统运行级别为3
3、Nginx常用命令
cd /usr/local/nginx/sbin/
#启动
./nginx
#停止
./nginx -s stop
#重新加载
./nginx -s reload
4、Nginx配置文件
/usr/local/nginx/conf/nginx.conf #默认配置文件
第一部分:全局块
从配置文件开始到events块之间的内容。 设置一些影响nginx服务器整体运行的配置指令。
第二部分:events块
nginx服务器与用户的网络连接
第三部分:http块
http全局块:
文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单连接请求书上限等。
upstream模块
server:负载均衡后端服务器的IP或域名,不写端口的话默认是80。高并发场景用域名,再通过DNS进行负载均衡
weight:后端服务器权重,默认为1,权重越大接收的请求越多。例:weight=5
max_fails:检查节点的健康状态并允许请求失败的次数,达到该次数就将节点下线。默认为1,0表示禁止失败尝试。例:max_fails=2
fail_timeout:max_fails失败次数达到限制后暂停该节点服务的时间,默认是10秒。例:fail_timeout=10s
backup:热备配置,当服务池中所有服务器均出现问题后会自动上线backup服务器
down:标志服务器不可用,不参与负载均衡。这个参数通常配合IP_HASH使用
max_conns:限制最大连接数,通常对后端服务器硬件不一致的情况进行配置
http {
...
upstream server-name {
ip_hash;
server 10.0.0.7:8080 weight=1;
server 10.0.0.7:8081 weight=1;
}
...
server {
location / {
proxy_pass http://server-name;
proxy_connect_timeout 10; #超时时间
}
}
}
server块:
1.全局server块
2.location块
(1)proxy_pass模块
5、Nginx配置高可用集群
安装keepalived
yum install -y keepalived
MATER配置keeplaived
cat >/etc/keepalived/keepalived.conf <<EOF
global_defs {
router_id lvs01
}
vrrp_script check_nginx {
script "/scripts/check_nginx.sh"
nterval 5
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.4
}
track_script {
check_nginx
}
}
EOF
cat /scripts/check_nginx.sh
#!/usr/bin/bash
#1.检查nginx进程数量
Nginx_Process_Number=$(ps -C nginx --no-header|wc -l)
#2.判断nginx进程数量
if [ $Nginx_Process_Number -lt 2 ];then
#3.如果进程小于2,则尝试重新启动一次Nginx,并等待2s
systemctl restart nginx &>/dev/null
sleep 2
Nginx_Process_Number=$(ps -C nginx --no-header|wc -l)
#4.如果再次执行进程还是小于2,则直接kill掉keeplaived
if [ $Nginx_Process_Number -lt 2 ];then
pkill keepalived
fi
fi
chmod +x /scripts/check_nginx.sh
BACKUP配置keeplaived
cat >/etc/keepalived/keepalived.conf <<EOF
global_defs {
router_id lvs02
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 90
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.4
}
}
EOF
6、Nginx原理
1.nginx启动会产生两个进程MATSER和WORKER。
2.可以产生一个MASTER和多个WORKER进程。
一个master和多个worker优势
(1)可是使用nginx -s reload热部署
(2)每个worker是一个独立进程。如果其中一个worker出现问题,其他worker继续进行争抢,实现请求过程不会造成服务中断。
(3)WORKER进程数量和CPU数量设置相等
发送一个请求会造成2个或4个进程
最大并发数:
普通静态页面访问:worker最大连接数*worker进程数/2
反向代理页面访问:worker最大连接数*worker进程数/4
7、Nginx优化
优化思路
nginx响应请求
1.建立socket连接
需要内存支持
2.进程数
一个work进程最多支持1024个进程数
1、socket层面优化
1.Nginx层面优化
(1)优化worker_processes
/usr/local/nginx/conf/nginx.conf
worker_processes #worker进程数量。根据CPU进程优化。
(2)优化worker_connections
/usr/local/nginx/conf/nginx.conf
worker_connections #一个worker进程最大连接数。根据内存进行优化
(3)优化keepalive_timeout 0;
/usr/local/nginx/conf/nginx.conf
keepalive_timeout 0; #一种无状态协议,客户端向服务器发送一个TCP请求,服务端响应完毕后断开连接。控制在2秒以内。
2.系统层面优化
(1)优化somaxconn
该内核参数默认值一般是128(定义了系统中每一个端口最大的监听队列的长度),对于负载很大的服务程序来说大大的不够。一般会将它修改为2048或者更大。
#临时添加
echo 2048 > /proc/sys/net/core/somaxconn
#永久添加
/etc/sysctl.conf
net.core.somaxconn = 2048 #添加
sysctl -p #执行
(2)优化tcp_tw_recycle
加快TCP连接的回收
#临时添加
echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
#永久添加
/etc/sysctl.conf
tcp_tw_recycle = 1
sysctl -p
(3)优化tcp_tw_reuse
空的TCP是否允许回收利用
#临时添加
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
#永久添加
/etc/sysctl.conf
tcp_tw_reuse = 1
sysctl -p
(4)优化tcp_syncookies
1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击。
默认为0,表示关闭
#临时添加
echo 0 > /proc/sys/net/ipv4/tcp_syncookies
#永久添加
/etc/sysctl.conf
tcp_syncookies=0
sysctl -p
2、文件方面优化
1.优化worker_rlimit_nofile
优化worker进程最大打开文件数
/usr/local/nginx/conf/nginx.conf
worker_rlimit_nofile 65535; #添加
2.优化ulimit -n
当前的最大打开文件数
#临时
ulimit -n 65535
#永久
/etc/security/limits.conf
* soft nofile 65535 #添加
* hard nofile 65535
8、httpd-tools压力测试
1.安装httpd-tools
yum install httpd-tools
ab -n 1000 -c 1000 http://www.wy.com/
-n 总的请求数
-c 并发数
-k 是否开启长连接
./configure --prefix=/usr/local/nginx --with-http_stub_status_module
make
/usr/local/nginx/conf/nginx.conf
location /status {
stub_status on;
access_log off;
}
http://www.wy.com/status