Nginx
2022-08-15 22:06:21 星期一
2022-09-03 18:23:18 星期六
安装部署nginx
操作系统安装:
- centos7 mini版,修改网络配置文件,重启网络服务,查看ip命令
ip addr
常用版本:
- 开源版本,http://nginx.org/
- nginx plus商业版本,https://www.nginx.com
- openResty,将Nginx和lua脚本整合,http://openresty.org/cn/ ,中文网站
- Tengine,对原始nginx做了增强,如果不做二次开发的话,开源使用,http://tengine.taobao.org/
安装nginx
- 下载源码:http://nginx.org/en/download.html
- 安装依赖库
yum install -y gcc
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
- 源码安装,在解压后的目录下执行
./configure --prefix=/usr/local/nginx # --prefix是安装目录
make
make install
yum更新太慢,更换yum源
cd /etc/yum.repos.d
mv Centos-Base.repo Centos-Base.repo.bak # 备份原有的
wget -O Centos-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo # 下载阿里的
yum makecache # 对yum源生成缓存
yum -y install update # 更新yum源
进入安装好的目录/usr/local/nginx/sbin,启动nginx,前端进入http://localhost102/
./nginx # 启动
./nginx -s stop # 快速停止
./nginx -s quit # 优雅关闭,在退出前完成已经接受的连接请求
./nginx -s reload # 重新加载配置
如果无法进入前端,查看是否关闭了防火墙
systemctl stop firewalld.service
systemctl disable firewalld.service
firewall-cmd --zone=public --add-port=80/tcp --permanent # 放行端口
firewall-cmd --reload # 重启防火墙,一般执行上面两个关闭就可以了
安装成系统服务,方便调用
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了
systemctl start nginx.service
systemctl stop nginx.service
systemctl enable nginx.service
基本使用
目录与基本运行原理:
nginx目录结构:conf,html,logs,sbin
,conf是配置文件,html是静态页,logs存放日志,其中access.log是访问日志,error.log是错误日志,sbin只有一个nginx文件,是nginx的主进程文件
基本请求原理:nginx启动后会启动master进程和worker进程,master进程主要是协调各个worker进程工作的,worker进程在启动时会读取配置文件,请求进来时根据自身的配置查找资源并返回
更改默认页:修改html下的index即可,默认访问也是可以修改nginx的配置文件
nginx基础配置
最小配置文件:nginx.conf
- worker_processer:表示worker的进程数
- http:关于http的配置,
- include表示把别的配置文件包含进来
- server表示虚拟主机的配置,监听端口,监听的域名,站点位置。server可以配置多个,只要域名+端口不冲突即可,修改后可以使用前面配置的
systemctl reload nginx.service
重新加载配置
虚拟主机与域名解析
域名、dns、ip地址的关系:访问域名时,先向dns查询该域名的ip地址,再访问该ip地址
- 可以配置自己的hosts文件模拟多个域名,也可以在阿里云买一个域名,配置该域名解析的ip地址
虚拟主机原理:所有请求访问都需要经过linux的网卡,由网卡转发请求(数据报文)给指定的进程
server name匹配规则
域名解析实战:修改nginx的配置文件,配置多个server,访问不同站点(不同目录的资源),可以使用通配符
- 应用:多用户二级域名、短网址、httpdns
- 一个server_name中可以配置多个域名、可以完全匹配、通配符、通配符结束匹配、正则匹配
反向代理
网关、代理、反向代理本质上都是代理,只是从不同的角度理解,对于公司内用户访问外网,可以配置一个代理,只能访问指定网址,这个就是正向代理。用户上网需要先访问网关(路由器),本质上也是代理。从服务提供方考虑,使用nginx接收用户请求,将请求转发给其他业务服务器,nginx起到了代理的作用,但是因为是为用户提供的代理而不是用户自己提供代理,所以称为是反向代理。
配置:location配置proxy_pass,注意如果没有写www,会直接redirect,之后的所有请求都不会经过nginx了。不支持https
基于反向代理的负载均衡:在server同一级别配置upstream xxx { server a;}
,proxy_pass后面使用xxx,这样访问该nginx时就会跳转到xxx别名配置的服务器上,默认轮询
负载均衡策略:
- weight,可以为每台服务器配置权重,
upstream xxx { server a weight=8;}
- down,可以直接让服务器下线,
upstream xxx { server a weight=8 down;}
- backup,正常情况不会使用,当其他服务都不可使用时使用,
upstream xxx { server a weight=8 backup;}
backup和down在实际中的用处不大,因为当正常服务器出现故障时,即使使用backup应该也会出故障。
轮询无法保持会话,ip_hash根据客户端ip地址转发同一台服务器,可以保持会话,但当前互联网下,比如移动端,ip也经常会变。
动静分离:静态资源直接访问nginx返回,配置多个location
可以配置防火墙,只允许某个ip、某个端口访问
URLRewrite:nginx在代理请求时,修改url,这样前端真实访问的地址就可以隐藏了
防盗链:配置某些资源只允许自己访问,不允许外部直接访问,可以使用验证reference
使用curl测试
高可用
配置keepalived:使用一个虚拟ip,keepalived只是互相检测keepalived进程是否还在,如果不在了,将虚拟ip漂移到另外一个主机上。如果要实现监控nginx或者redis,可以写一个脚本,定时检测要监控的进程,当进程不在时,kill调keepalived的进程
Https证书配置
- 对称加密:客户端和服务器端使用相同的加密和解密算法,算法都必须内置。(保证算法安全)
- 非对称加密:客户端第一次请求先下载公钥,使用公钥+算法加密发送,服务器使用私钥+算法解密,服务器响应数据使用私钥+算法加密,客户端使用公钥+算法解密。还要满足公钥加密,公钥无法解开。(私钥安全)
https:服务器端向ca提交公钥,ca使用非对称加密公钥,下发证书,证书是内嵌到操作系统和浏览器中的,使用操作系统或浏览器时,通过内置的证书解密获得公钥,客户端使用公钥加密数据请求服务器。
自签名:openssl、图形化xca
oneinstack.com安装nginx
安装discuz
Nginx高级:扩容
nginx是一个高性能的http服务器和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。2004年10月4日公开0.1.0版本。其源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、简单的配置文件和低系统资源消耗而闻名。2011年6月1日发布1.0.4版本。
特点:占用内存少,并发能力强,在同类型的网页服务器中表现较好。
扩容方式:
- 单机垂直扩容:增加硬件资源
- 云服务资源增加、使用更好的主机、更换主流的CPU/主板、使用更高速的网卡
- 磁盘(HDD机械、HHD混合、SSD,SSD多副本机制/系统盘/热点数据/数据库存储,HDD冷存储)
- 水平扩容:集群化
- 细粒度拆分
- 数据分区
- 上游服务soa化(原生支持水平扩容/垂直扩容)
- 入口细分:浏览器、移动端原生app、H5嵌入式应用
- 数据异构化:多级缓存
- 客户端缓存
- CDN缓存
- 异地多活
- nginx缓存
- 服务异步化
- 拆分请求
- 消息中间件
扩容原则:无状态原则、弹性原则
上游服务器:数据响应,业务处理服务器
nginx配置参考官方文档
会话管理:
- nginx高级负载均衡
- ip_hash(在
upstream
中直接使用ip_hash;
),相同ip就会转发给相同的服务器。问题:ip集中,后端服务器一旦宕机,会话数据丢失,适合中小型项目 - 其他hash,
hash $request_uri
,hash $cookie_jsessionid
,适合不支持cookie的情况、资源倾斜的情况。request head里面的都可以hash - 使用lua逻辑定向分发
- ip_hash(在
- redis + springSession,系统复杂,需要改代码
upstream httpds { # httpds表示的一组服务完全
ip_hash; # 使用ip_hash
server 192.168.44.102 ;
server 192.168.44.103 ;
}
server {
listen 80; # 监听80端口
server_name localhost;
location / {
proxy_pass http://httpds; # 代理转发到httpds
}
location ~*/(css|img|js) {
root /usr/local/nginx/html;
}
可以以最简单的方式,调整机器数据,不用修改代码,只需要调整nginx的配置就可以极大的提高系统的性能
第三方模块使用
- 升级nginx,将sticky模块编译进去,编译后只复制nginx命令即可(不要make install)
- 在upstream里面配置
stick;
,会下发route,也可以配置名称,失效时间,注意不要与jsessionid相同会冲突,
- 在upstream里面配置
keepalive:浏览器和服务器都可以支持keepalive,一般有下一步操作会将上一次连接keepalive,其他一些静态资源加载一般缓存在浏览器端
nginx关闭keeplive只需要把keeplive_timeout 0;
超时时间设置为0即可。(客户端相关的都在http模块下)
- 使用charles工具抓包检测
- 什么时候使用keepalive?需要后续继续使用连接做一些操作的时候
- 对客户端配置
- 对上游服务器配置,ab测试
反向代理核心流程:
- upstream proxy_pass工作流程
- 内存与文件缓冲区
- 对客户端的限制
获取用户真实ip:
- 上游服务器获取用户真实ip:使用http协议中有用的header
- nginx proxy_set_header,nginx转发时将用户真实ip设置到请求头里
gzip压缩:
- gzip原理
- 使用gzip的站点:京东
- gzip动态压缩:
- gzip静态压缩
- 使用第三方zip模块:brotli,压缩效率高,内置了很大的字典
合并请求:淘宝网
- 压缩请求数,但是压缩后的数据不能使用send_file了
资源静态化:
- 高并发系统资源静态化方案
- 一致性问题
- 合并文件输出,nginx的ssi模块合并服务器端文件
- 集群文件同步:rsync命令(同步文件)、inotify命令(检测本机目录或文件变化)
多级缓存:让数据尽可能的靠近用户
- 静态资源缓存
- 浏览器缓存
- CDN缓存,内容分发网络
- 正向代理与反向代理缓存
- nginx默认缓存
- 外置内存缓存
- 上游服务器应用缓存
- 强制缓存与协商缓存,etag,last-modified
- 浏览器强制缓存
- proxy缓存
geoip获取用户ip区域信息
高效
缓存文件元数据信息提高sendfile性能
- strace -p PID追踪内核执行过程,查看nginx发送文件过程,open_file_cache配置优化
nginx外置缓存
- error_page的使用
- 匿名location,只供内部使用
- memcached使用
- redis的使用
nginx stream代理
- mysql透明化多主高可用,负载均衡配置
服务器端qps限制,漏桶算法
带宽限制,令牌桶算法
并发数限制,计数器算法
日志
- 日志缓冲、日志格式,如json
- 错误日志
- 日志分割,logrotate
上游服务健康检查
- 重试机制
- 状态检查,tengine主动检查模块
使用lua读inginx二次开发
- lua、luajit、nginx、openresty关系
- lua开发环境
- lua基础语法
openresty
- 安装
- 测试lua脚本
- 获取系统变量
openresty常用模块
- nginx进程缓存
- 连接redis
- 连接mysql
- 模板引擎
- 基于openresty的开源项目
本文来自博客园,作者:Bingmous,转载请注明原文链接:https://www.cnblogs.com/bingmous/p/16589926.html