Nginx

2022-08-15 22:06:21 星期一
2022-09-03 18:23:18 星期六

操作系统安装:

  • centos7 mini版,修改网络配置文件,重启网络服务,查看ip命令 ip addr

常用版本:

安装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是一个高性能的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_urihash $cookie_jsessionid,适合不支持cookie的情况、资源倾斜的情况。request head里面的都可以hash
  • 使用lua逻辑定向分发
  • 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相同会冲突,

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的开源项目

Original: https://www.cnblogs.com/bingmous/p/16589926.html
Author: Bingmous
Title: Nginx

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/565449/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球