1. Nginx简介
流行的Nginx的版本有:
- nginx:Nginx的官方开源版本
- nginx plus:Nginx发型的付费版本,在整合第三方模块、运营监控以及技术支持上有很大的优势
- Tengine:阿里基于nginx的开发版本
- OpenResty:如需开发API服务器或防火墙可选
安装
配置好虚拟机的静态ip后解压tar包:
1 | tar -zxvf nginx-1.25.1.tar.gz |
安装依赖:
1 | yum install -y gcc |
进入解压的文件夹后编译安装:
1 | ./configure --prefix=/usr/local/nginx |
关闭防火墙后启动服务我们就可以直接通过浏览器访问:
1 | //进入安装好的目录 |
安装为系统服务:
1 | vi /usr/lib/systemd/system/nginx.service |
1 | [Unit] |
重新加载服务:
1 | systemctl daemon-reload |
目录结构
nginx的主目录:/usr/local/nginx
其中以_temp结尾的都是第一次运行时生成的用于存放临时文件的
- conf:用来存放配置文件相关
- html:用来存放静态文件的默认目录 html、css等
- logs:用于存放日志文件
- sbin:nginx的主程序
2. 基本使用
运行流程:
当我们reload进程时,Nginx会通知worker不再接收请求,并在处理完当前请求后销毁,同时创建新的worker接收请求。
最小配置
- worker_processes:默认为1,表示开启一个业务进程
- worker_connections 1024; 单个业务进程可接受连接数
- include mime.types; 引入http mime类型
- default_type application/octet-stream; 如果mime类型没匹配上,默认使用二进制流的方式传输。
- sendfile on; 使用linux的 sendfile(socket, file, len) 高效网络传输,也就是数据0拷贝。
- keepalive_timeout 65;
未开启sendfile:
开启:
HTTPDNS
传统的DNS(也称LocalDNS)原理:
HTTPDNS是使用HTTP协议向DNS服务器的进行请求,代替传统的DNS协议使用UDP协议向DNS服务器的进行请求,绕开了运营商的Local DNS,简化了请求的复杂性,避免了使用运营商Local DNS造成的劫持和跨网问题。
虚拟主机
通过虚拟主机技术可以虚拟化成多个站点同时对外提供服务,一个server就是一个虚拟主机:
1 | server { |
可以配置多个server(端口号和主机名不能都相同),但需要注意的servername匹配分先后顺序,Nginx会直接响应最先匹配的server。
可以在同一servername中匹配多个域名:
1 | server_name vod.mmban.com www1.mmban.com; |
通配符匹配:
1 | server_name *.mmban.com #实现多用户二级域名 |
短网址和多用户二级域名的实现有些类似,都是服务端在数据库中查询数据
正则匹配:
1 | server_name ~^[0-9]+\.mmban\.com$; |
反向代理
- 正向代理:
这里的代理服务器其实就是网关。
- 反向代理:
这种网络的传输速度有代理服务器的带宽限制,称为隧道式代理
若在返回数据时直接返回给用户,称为DR模型,由LVS实现
传统公司系统架构
但在一些互联网项目,需要传输音频等大体积的静态资源时,Nginx就会成为网络瓶颈,此时就需要创建多个Nginx组,引入负载均衡器。
配置反向代理
1 | location / { |
ip地址和域名是一对多的关系。一个ip地址可以有多个域名,一个域名只能有一个ip地址。
配置负载均衡
1 | upstream temp { |
负载均衡策略
配置好负载均衡后,默认使用的负载均衡策略是轮询,逐一转发,这种方式适用于无状态请求。
weight(权重):指定轮询几率,用于后端服务器性能不均的情况
1 | upstream httpd { |
- down:表示当前的server暂时不参与负载
- weight:默认为1.weight越大,负载的权重就越大。
- backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。
ip_hash:根据客户端的ip地址转发同一台服务器,可以保持回话(定向用户转发)
least_conn:优先向最少连接访问的服务器发起请求
url_hash:需要第三方组件,根据用户访问的url定向转发请求(定向流量转发)
fair:需要第三方组件,根据后端服务器响应时间转发请求
动静分离
将静态的资源放到Nginx中,Tomcat专门处理动态请求
1 | location /css { |
我们也可以使用正则表达式:
1 | location ~*/(css|img|js) { |
/
通用匹配,任何请求都会匹配到;=
精准匹配,不是以指定模式开头;~
正则匹配,区分大小写;~*
正则匹配,不区分大小写;^~
非正则匹配,匹配以指定模式开头的location。
除了root,alias也可以指定路径:
1 | location /css { |
alias在接受请求的时候在路径上不会加上location;有bug不建议使用
UrlRewrite
rewrite语法格式及参数语法:
1 | rewrite是实现URL重写的关键指令,根据regex (正则表达式)部分内容,重定向到replacement,结尾是flag标记。 |
301和302仅面向爬虫和浏览器,用户体验无差
实例:
1 | location /css { |
网关服务器
综合负载均衡器和反向代理服务器等功能。
首先开启应用服务器的防火墙:
1 | 重启防火墙 |
网关配置:
1 | upstream httpds { |
配置防盗链
为了防止其它网站随意引用我们页面的资源,可以使用Nginx进行url过滤。
使用规则:
1 | valid_referers none | blocked | server_names | ....; |
- none, Referer 头域不存在时允许访问。
- blocked,检测 Referer 头域的值被防火墙或者代理服务器删除或伪装的情况。这种情况该头域的值不以 “http://” 或 “https://” 开头。
- server_names ,可以允许多个ip或域名访问,优先使用域名(如果域名下有外链图片只能用域名)
Referer 是请求头的一部分,显示来源地址。
外链图片就是非项目本地服务器的资源,通过网络使用其他网站图片
实例:
1 | location ~*/(css|img|js) { |
返回错误页面:
1 | location ~*/(css|img|js) { |
结合rewrite返回报错图片:
1 | location ~*/(css|img|js) { |
curl
一个非常实用的、用来与服务器之间传输数据的工具。
可以使用curl测试Nginx是否配置成功:
1 | #-e表示带引用,即设置Rerferer,-I表示显示响应头信息 |
配置高可用
手动安装Keepalived:
[下载地址](Keepalived for Linux);使用 ./configure 编译安装
如报错需要安装依赖:
1 | yum install openssl-devel |
yum安装:
1 | yum install -y keepalived |
使用yum安装后配置文件在
/etc/keepalived/keepalived.conf
最小配置(两台Nginx):
1 | ! Configuration File for keepalived |
1 | ! Configuration File for keepalived |
Keepalived根据检测到多台机器上的Keepalived进程来判断机器是否宕机,不能查看Nginx是否出异常,我们可以写脚本将Nginx和Keepalived关联起来。
Https证书
服务器和CA机构以及https的关系:
- 服务器首先向CA机构提交资料,被承认后服务器返回客户端的公钥会被CA机构使用私钥进行加密包装为证书
- 客户端收到证书后会用操作系统绑定的CA公钥进行解锁,取得服务器发送的公钥
- 然后客户端使用服务器的公钥加密对称加密的密钥,之后服务器拿私钥解密,最终服务器与客户端便使用对称加密进行数据传输。
使用阿里云配置实践可以参照
配置环境可以使用OneinStack
BBS系统就是网络论坛,网上有许多优秀的开源项目。