1. Nginx
1. Nginx简介
流行的Nginx的版本有:
- nginx:Nginx的官方开源版本
- nginx plus:Nginx发型的付费版本,在整合第三方模块、运营监控以及技术支持上有很大的优势
- Tengine:阿里基于nginx的开发版本
- OpenResty:如需开发API服务器或防火墙可选
安装
配置好虚拟机的静态ip后解压tar包:
tar -zxvf nginx-1.25.1.tar.gz
安装依赖:
yum install -y gcc
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
进入解压的文件夹后编译安装:
./configure --prefix=/usr/local/nginx
make
make install
关闭防火墙后启动服务我们就可以直接通过浏览器访问:
//进入安装好的目录
cd /usr/local/nginx/sbin
./nginx 启动
./nginx -s stop 快速停止
./nginx -s quit 优雅关闭,在退出前完成已经接受的连接请求
./nginx -s 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 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就是一个虚拟主机:
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中匹配多个域名:
server_name vod.mmban.com www1.mmban.com;
通配符匹配:
server_name *.mmban.com #实现多用户二级域名
server_name vod.*;
短网址和多用户二级域名的实现有些类似,都是服务端在数据库中查询数据
正则匹配:
server_name ~^[0-9]+\.mmban\.com$;
反向代理
- 正向代理:

这里的代理服务器其实就是网关。
- 反向代理:

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

但在一些互联网项目,需要传输音频等大体积的静态资源时,Nginx就会成为网络瓶颈,此时就需要创建多个Nginx组,引入负载均衡器。
配置反向代理
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地址。
配置负载均衡
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(权重):指定轮询几率,用于后端服务器性能不均的情况
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专门处理动态请求
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;
}
我们也可以使用正则表达式:
location ~*/(css|img|js) {
    root /usr/local/nginx/html;
    index index.html index.htm;
}
/通用匹配,任何请求都会匹配到;=精准匹配,不是以指定模式开头;~正则匹配,区分大小写;~*正则匹配,不区分大小写;^~非正则匹配,匹配以指定模式开头的location。
除了root,alias也可以指定路径:
location /css {
    alias /usr/local/nginx/static/css;
    index index.html index.htm;
}
alias在接受请求的时候在路径上不会加上location;有bug不建议使用
UrlRewrite
rewrite语法格式及参数语法:
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仅面向爬虫和浏览器,用户体验无差
实例:
location /css {
	rewrite ^/([0-9]+).html$ /index.jsp?pageNum=$1 break;
	proxy_pass http://192.168.44.100:8080;
}
网关服务器
综合负载均衡器和反向代理服务器等功能。
首先开启应用服务器的防火墙:
#重启防火墙
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"
网关配置:
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过滤。
使用规则:
valid_referers none | blocked | server_names | ....;
- none, Referer 头域不存在时允许访问。
- blocked,检测 Referer 头域的值被防火墙或者代理服务器删除或伪装的情况。这种情况该头域的值不以 “http://” 或 “https://” 开头。
- server_names ,可以允许多个ip或域名访问,优先使用域名(如果域名下有外链图片只能用域名)
Referer 是请求头的一部分,显示来源地址。
外链图片就是非项目本地服务器的资源,通过网络使用其他网站图片
实例:
location ~*/(css|img|js) {
	valid_referers 192.168.44.101;
    if ($invalid_referer) {
        return 403;
    }
    root html;
}
返回错误页面:
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返回报错图片:
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是否配置成功:
#-e表示带引用,即设置Rerferer,-I表示显示响应头信息
curl -e "http://baidu.com" -I http://192.168.44.101/img/logo.png
配置高可用
手动安装Keepalived:
[下载地址](Keepalived for Linux);使用 ./configure 编译安装
如报错需要安装依赖:
yum install openssl-devel
yum安装:
yum install -y keepalived
使用yum安装后配置文件在
/etc/keepalived/keepalived.conf
最小配置(两台Nginx):
! 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
    }
}
! 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系统就是网络论坛,网上有许多优秀的开源项目。

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号