1. Nginx简介
流行的Nginx的版本有:
安装
配置好虚拟机的静态ip后解压tar包:
1
| tar -zxvf nginx-1.25.1.tar.gz
|
安装依赖:
1 2 3
| yum install -y gcc yum install -y pcre pcre-devel yum install -y zlib zlib-devel
|
进入解压的文件夹后编译安装:
1 2 3
| ./configure --prefix=/usr/local/nginx make make install
|
关闭防火墙后启动服务我们就可以直接通过浏览器访问:
1 2 3 4 5 6
| //进入安装好的目录 cd /usr/local/nginx/sbin ./nginx 启动 ./nginx -s stop 快速停止 ./nginx -s quit 优雅关闭,在退出前完成已经接受的连接请求 ./nginx -s reload 重新加载配置
|
安装为系统服务:
1
| vi /usr/lib/systemd/system/nginx.service
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| [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
|
重新加载服务:
1 2 3 4 5
| systemctl daemon-reload //启动服务 systemctl start nginx.service //开机启动 systemctl enable nginx.service
|
目录结构
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 2 3 4 5 6 7 8 9 10 11 12
| server { listen 80; #监听端口号 server_name localhost; #主机名 location / { #匹配路径 root html; #文件根目录 index index.html index.htm; #默认页名称 } error_page 500 502 503 504 /50x.html; #报错编码对应页面 location = /50x.html { root html; } }
|
可以配置多个server(端口号和主机名不能都相同),但需要注意的servername匹配分先后顺序,Nginx会直接响应最先匹配的server。
可以在同一servername中匹配多个域名:
1
| server_name vod.mmban.com www1.mmban.com;
|
通配符匹配:
1 2
| server_name *.mmban.com #实现多用户二级域名 server_name vod.*;
|
短网址和多用户二级域名的实现有些类似,都是服务端在数据库中查询数据
正则匹配:
1
| server_name ~^[0-9]+\.mmban\.com$;
|
反向代理

这里的代理服务器其实就是网关。

这种网络的传输速度有代理服务器的带宽限制,称为隧道式代理
若在返回数据时直接返回给用户,称为DR模型,由LVS实现
传统公司系统架构

但在一些互联网项目,需要传输音频等大体积的静态资源时,Nginx就会成为网络瓶颈,此时就需要创建多个Nginx组,引入负载均衡器。
配置反向代理
1 2 3 4 5 6 7
| location / { proxy_pass http://www.atguigu.com/; #或 #proxy_pass http://192.168.3.100:8080; #root html; #index index.html index.htm; }
|
ip地址和域名是一对多的关系。一个ip地址可以有多个域名,一个域名只能有一个ip地址。
配置负载均衡
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| upstream temp { server 192.168.64.102:80; server 192.168.64.103:80; } server { listen 80; server_name localhost; location / { proxy_pass temp; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
|
负载均衡策略
配置好负载均衡后,默认使用的负载均衡策略是轮询,逐一转发,这种方式适用于无状态请求。
weight(权重):指定轮询几率,用于后端服务器性能不均的情况
1 2 3 4 5 6
| upstream httpd { #默认为80端口可以不指定 server 127.0.0.1:8050 weight=10 down; server 127.0.0.1:8060 weight=1; server 127.0.0.1:8060 weight=1 backup; }
|
- down:表示当前的server暂时不参与负载
- weight:默认为1.weight越大,负载的权重就越大。
- backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。
ip_hash:根据客户端的ip地址转发同一台服务器,可以保持回话(定向用户转发)
least_conn:优先向最少连接访问的服务器发起请求
url_hash:需要第三方组件,根据用户访问的url定向转发请求(定向流量转发)
fair:需要第三方组件,根据后端服务器响应时间转发请求
动静分离
将静态的资源放到Nginx中,Tomcat专门处理动态请求
1 2 3 4 5 6 7 8 9 10 11 12
| location /css { root /usr/local/nginx/static; index index.html index.htm; } location /images { root /usr/local/nginx/static; index index.html index.htm; } location /js { root /usr/local/nginx/static; index index.html index.htm; }
|
我们也可以使用正则表达式:
1 2 3 4
| location ~*/(css|img|js) { root /usr/local/nginx/html; index index.html index.htm; }
|
/通用匹配,任何请求都会匹配到;=精准匹配,不是以指定模式开头;~正则匹配,区分大小写;~*正则匹配,不区分大小写;^~非正则匹配,匹配以指定模式开头的location。
除了root,alias也可以指定路径:
1 2 3 4
| location /css { alias /usr/local/nginx/static/css; index index.html index.htm; }
|
alias在接受请求的时候在路径上不会加上location;有bug不建议使用
UrlRewrite
rewrite语法格式及参数语法:
1 2 3 4 5 6 7 8 9 10 11 12 13
| rewrite是实现URL重写的关键指令,根据regex (正则表达式)部分内容,重定向到replacement,结尾是flag标记。
rewrite <regex> <replacement> [flag]; 关键字 正则 替代内容 flag标记
rewrite参数的标签段位置: server,location,if
flag标记说明: last #本条规则匹配完成后,继续向下匹配新的location URI规则 break #本条规则匹配完成即终止,不再匹配后面的任何规则 redirect #返回302临时重定向,浏览器地址会显示跳转后的URL地址 permanent #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
|
301和302仅面向爬虫和浏览器,用户体验无差
实例:
1 2 3 4
| location /css { rewrite ^/([0-9]+).html$ /index.jsp?pageNum=$1 break; proxy_pass http://192.168.44.100:8080; }
|
网关服务器
综合负载均衡器和反向代理服务器等功能。
首先开启应用服务器的防火墙:
1 2 3 4 5 6 7 8 9 10
| #重启防火墙 systemctl restart firewalld #重载规则 firewall-cmd --reload #指定端口和ip访问 firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.44.101" port protocol="tcp" port="8080" accept" #查看已配置规则 firewall-cmd --list-all #移除规则 firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.44.101" port port="8080" protocol="tcp" accept"
|
网关配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| upstream httpds { server 192.168.44.102 weight=8 down; server 192.168.44.103:8080 weight=2; server 192.168.44.104:8080 weight=1 backup; } location / { #UrlRewrite rewrite ^/([0-9]+).html$ /index.jsp?pageNum=$1 redirect; #反向代理+负载均衡 proxy_pass http://httpds ; } #动静分离 location ~*/(css|img|js) { root /usr/local/nginx/html; index index.html index.htm; }
|
配置防盗链
为了防止其它网站随意引用我们页面的资源,可以使用Nginx进行url过滤。
使用规则:
1
| valid_referers none | blocked | server_names | ....;
|
- none, Referer 头域不存在时允许访问。
- blocked,检测 Referer 头域的值被防火墙或者代理服务器删除或伪装的情况。这种情况该头域的值不以 “http://” 或 “https://” 开头。
- server_names ,可以允许多个ip或域名访问,优先使用域名(如果域名下有外链图片只能用域名)
Referer 是请求头的一部分,显示来源地址。
外链图片就是非项目本地服务器的资源,通过网络使用其他网站图片
实例:
1 2 3 4 5 6 7
| location ~*/(css|img|js) { valid_referers 192.168.44.101; if ($invalid_referer) { return 403; } root html; }
|
返回错误页面:
1 2 3 4 5 6 7 8 9 10 11 12
| location ~*/(css|img|js) { valid_referers 192.168.44.101; if ($invalid_referer) { return 401; #return /401.html; 这个不用额外配置,更简洁 } root html; } error_page 401 /401.html location = /401.html{ root html; }
|
结合rewrite返回报错图片:
1 2 3 4 5 6 7 8
| location ~*/(css|img|js) { valid_referers 192.168.44.101; if ($invalid_referer) { #图片在html/img目录下 rewrite ^/ /img/x.png break; } root html; }
|
curl
一个非常实用的、用来与服务器之间传输数据的工具。
可以使用curl测试Nginx是否配置成功:
1 2
| #-e表示带引用,即设置Rerferer,-I表示显示响应头信息 curl -e "http://baidu.com" -I http://192.168.44.101/img/logo.png
|
配置高可用
手动安装Keepalived:
[下载地址](Keepalived for Linux);使用 ./configure 编译安装
如报错需要安装依赖:
1
| yum install openssl-devel
|
yum安装:
1
| yum install -y keepalived
|
使用yum安装后配置文件在/etc/keepalived/keepalived.conf
最小配置(两台Nginx):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| ! Configuration File for keepalived global_defs { #组中的id router_id lb111 } #名字随意 vrrp_instance atguigu { state MASTER #配置网卡信息,通过ip addr查看 interface ens33 virtual_router_id 51 #优先级 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { #虚拟ip(vip)用于接收请求 192.168.44.200 } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| ! Configuration File for keepalived global_defs { router_id lb110 } #名字随意 vrrp_instance atguigu { state BACKUP interface ens33 virtual_router_id 51 priority 50 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.44.200 } }
|
Keepalived根据检测到多台机器上的Keepalived进程来判断机器是否宕机,不能查看Nginx是否出异常,我们可以写脚本将Nginx和Keepalived关联起来。
Https证书
服务器和CA机构以及https的关系:
- 服务器首先向CA机构提交资料,被承认后服务器返回客户端的公钥会被CA机构使用私钥进行加密包装为证书
- 客户端收到证书后会用操作系统绑定的CA公钥进行解锁,取得服务器发送的公钥
- 然后客户端使用服务器的公钥加密对称加密的密钥,之后服务器拿私钥解密,最终服务器与客户端便使用对称加密进行数据传输。
使用阿里云配置实践可以参照
配置环境可以使用OneinStack
BBS系统就是网络论坛,网上有许多优秀的开源项目。