Nginx学习笔记一
Nginx是一个高性能的HTTP和反向代理web服务器,特点是内存占用少,并发能力强,专为性能优化而开发,支持高达50000个并发连接数。
一、Nginx相关概念
反向代理、负载均衡、动静分离
1、反向代理
正向代理
在客户端(服务器)配置代理服务器,通过代理服务器访问。
反向代理
客户端不需要进行配置,客户端发送请求给反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端。此时目标服务器和反向代理服务器对外就是一个服务器,暴露的是代理服务器的ip,隐藏了真实服务器的ip。
2、负载均衡
单个服务器解决不了,就增加服务器的数量,然后将请求分发到各个服务器上,将负载分发到不同的服务器上,就是负载均衡。
3、动静分离
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,降低原来单个服务器的压力
二、Nginx安装
1、安装相关依赖
# 方法一:在线一键安装(有网)
yum -y install gcc gcc-c++ zlib zlib-devel pcre-devel openssl openssl-devel
# 方法二:离线安装
# 先下载包:从网上下载方法一的依赖包,或者在有网的机子上执行以下命令下载(下载目录/home/rpm)
yumdownloader gcc gcc-c++ zlib zlib-devel pcre-devel openssl openssl-devel --resolve --destdir=/home/rpm
# 然后再拷贝到没有网的机器上,执行安装命令
rpm -ivh /home/rpm/*.rpm --force --nodeps
--force 即使覆盖属于其它包的文件也强迫安装
--nodeps 如果该RPM包的安装依赖其它包,即使其它包没装,也强迫安装。
2、下载nginx
# 官网下载地址 nginx.org/download
# wget下载 yum -y install wget
wget nginx.org/download/nginx-1.23.3.tar.gz
# 解压
tar -zxvf nginx-1.23.3.tar.gz
# 语法高亮显示nginx配置的vim
cp -r /root/nginx-1.23.3/contrib/vim/* /usr/share/vim/vimfiles/
# 编译安装
./configure
make && make install
# 安装完nginx所在的目录
/usr/local/nginx
# 启动
cd /usr/local/nginx/sbin
./nginx
# 开启防火墙端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload
# 关防火墙
systemctl stop firewalld
systemctl disable firewalld
# 浏览器访问,nginx默认端口80
安装成系统服务
vi /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx - web server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecQuit=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
重新加载系统服务
systemctl daemon-reload
开机启动
systemctl enable nginx
免编译安装
将以上编译安装完的nginx目录打包后即可解压使用
cd /usr/local/
tar -zcvf nginx-1.23.3免编译.tar.gz nginx
conf 存放配置文件
html 存放静态页面
logs 存放日志
access.log 访问日志
error.log 报错日志
nginx.pid nginx进程
sbin nginx可执行文件
三、常用命令
# 查找nginx
whereis nginx
# 设置软连接
ln -s /usr/local/nginx /usr/bin/nginx
# 查看nginx版本
nginx -v
# 启动nginx
nginx start
# 停止nginx
nginx -s stop
# 重加载配置文件
nginx -s reload
四、配置文件
cd /usr/local/nginx/conf
vim nginx.conf
第一部分 全局块
从配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进 PID 存放路径、日志存放路径和类型以及配置文件的引入等。
比如上面第一行配置的 :
worker processes 1; # 值越大,支持的并发处理量也越多,但是这是 Nginx 服务器并发处理服务的关键配置会受到硬件、软件等设备的制约。
第二部分 events块
events块涉及的指令主要影响nginx服务器与用户的网络连接,
worker_connections 1024; # 单个进程允许和外部建立的最大连接数
第三部分 http块
代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里
需要注意的是:http 块包括 http全局块
、server块
1、http 全局块
http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义连接超时时间、单链接请求数上限等
2、server 块
这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。
每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。
而每个 server 块也分为全局 server 块,以及可以同时包含多个 location 块。
全局 server 块
最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。
location 块
一个 server 块可以配置多个 location 块。
这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
五、示例一:反向代理1
1、实现效果
浏览器访问www.123.com,跳转到Linux系统的tomcat主页
2、准备工作
启动tomcat,开放相关端口或关闭防火墙,能在 windows 系统中通过浏览器访问 tomcat 服务器。
3、具体配置
第一步 在 windows 系统的 host 文件进行域名和 ip 对应关系的配置
C:\Windows\System32\drivers\etc\hosts
在文末添加行
192.168.17.129 www.123.com
第二步 在 nginx 进行请求转发的配置(反向代理配置)
server {
listen 80;
server_name 192.168.17.129;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
nginx -s reload
最终可以通过www.123.com访问tomcat主页
六、示例二:反向代理2
1、实现效果
使用 nginx 反向代理,根据访问的路径跳转到不同端口的服务中
nginx 监听端口为 9001,
访问 http://192.168.17.129:9001/edu/ 直接跳转到 127.0.0.1:8080
访问 http://192.168.17.129:9001/vod/ 直接跳转到 127.0.0.1:8081
2、准备工作
(1)准备两个 tomcat 服务器,一个 8080 端口,一个 8081 端口
(2)创建文件夹和测试页面
3、具体配置
(1)修改 nginx 配置文件
server {
listen 80;
server_name 192.168.17.129;
location ~ /edu/ {
proxy_pass http://127.0.0.1:8080;
}
location ~ /vod/ {
proxy_pass http://127.0.0.1:8081;
}
}
七、示例三:负载均衡
1、实现效果
(1)浏览器地址栏输入地址 http://192.168.17.129/edu/a.html,负载均衡效果,平均 8080 和 8081 端口中
2、准备工作
(1)准备两台 tomcat 服务器,一台 8080,一台 8081
(2)在两台 tomcat 里面 webapps 目录中,创建名称是 edu 文件夹,在 edu 文件夹中创建页面 a.html,用于测试
修改 nginx 配置文件
upstream server {
server 192.168.17.100:8080 weight=2;
server 192.168.17.101:8080 weight=4;
}
server {
listen 80;
server_name 192.168.17.129;
location / {
proxy_pass http://server;
}
}
负载均衡策略
第一种 轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。逐一转发,适用于无状态请求。
第二种 weight
weight 代表权重默认为 1,权重越高被分配的客户端越多。用于后端服务器性能不均。
第三种 ip_hash
每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器。
第四种 fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
第五种 least_conn
最少连接访问
第六种 url_hash(第三方)
根据用户访问的url定向转发请求
八、示例四:高可用
两台nginx服务器,都安装keepalived
服务,
yum -y install keepalived
在/etc/中生成keepalived文件,修改conf配置文件
systemctl start keepalived
keepalived启动后,使用ip addr命令在对应网卡里可以看到虚拟ip
keepalived.conf如下:
! Configuration File for keepalived
global_defs {
script_user root
enable_script_security
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id 192.168.192.248 #(重点参数)局域网keppalived主机身份标识信息(每台唯一)
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_http_port {
script "/etc/keepalived/chk_nginx.sh"
interval 3 # 脚本执行的间隔, 需大于脚本中的sleep时间
weight 2
}
vrrp_instance VI_1 {
state MASTER # 备份服务器上改成BACKUP
interface enp0s8 # 网卡
virtual_router_id 51 # 主备机这相这个id必须相同
priority 100 # 优先级,主机比备机大
advert_int 1 # 心跳检测 1s
authentication { # 主备主机之间的认证表示信息
auth_type PASS #采用明文认证机制
auth_pass 1111 #编写明文密码`
}
virtual_ipaddress {
192.168.192.16 # 虚拟地址
}
track_script {
chk_http_port #调用执行脚本
}
}
nginx启动检查脚本:
# 当nginx进程不存在时,会启动nginx;再次检查nginx进程,如果不存在,就停止keepalived服务,然后NGINX_BACKUP主机会自动接替NGINX_MASTER的工作。
A=`ps -C nginx --no-header | wc -l`
if [ $A -eq 0 ];then
echo 'nginx进程不存在,重启nginx'
systemctl start nginx
sleep 2
if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
echo 'nginx已启动,关闭keepalived'
kill keepalived
fi
fi
关闭nginx后,keepalived执行启动脚本但未成功启动nginx,查看日志
tail -f /var/log/message
报错一:chk_nginx.sh exited due to signal 15
keepalived.conf里vrrp_script 里的 interval 脚本执行的间隔, 需大于脚本中的sleep时间
报错二:chk_nginx.sh exited due to signal 1
关闭selinux
- 检查,selinux3个状态enforcing (执行中)、permissive (不执行但产生警告)、disabled(关闭)。
方式一 getenforce
方式二 /usr/sbin/sestatus -v
- 临时关闭,重启失效
setenforce 0
- 永久关闭
vi /etc/selinux/config
把SELINUX=enforce 改成disabled,reboot重启生效
其他
nginx启动后会有一个master主进程,和n个worker子进程。master来协调紫禁城,它不处理业务;worker根据nginx.conf配置文件解析用户的请求;reload会kill掉worker子进程,然后创建新的worker去根据配置文件解析请求来读取文件。
需要设置多少个 worker
Nginx 同redis 类似都采用了 io,多路复用机制,每个 worker 都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求, 即使是千上万个请求也不在话下。每个 worker 的线程可以把一个 cpu的性能发挥到极致。所以 worker 数和服务器的 cpu数相等是最为适宜的
。设少了会浪费 u,设多了会造成 cpu 频繁切换上下文带来的损耗。
#设置 worker 数量。
worker processes 4
#work 绑定 cpu(4 work 绑定 4cpu)。
worker cpuaffinity 0001 0010 0100 1000
#work 绑定 cpu (4 work绑定 8cpu 中的 4个)。
worker cpu affinity 0000001 00000010 00000100 00001000
普通的静态访问最大并发数是:worker_connections * worker_processes / 2 .
而如是HTTP 作为反向代理来说,最大并发数量应该是worker_connections * worker_processes / 4.
其他nginx版本
openresty.org
tengine.taobao.org