Nginx尚硅谷基础篇笔记


nginx基本运行原理图

image-20230618145224781

Nginx配置与应用场景

最小配置

worker_processes

worker_processes 1; 默认为1,表示开启一个业务进程

worker_connections

worker_connections 1024; 单个业务进程可接受连接数

include mime.types;

include mime.types; 引入http mime类型

default_type application/octet-stream;

default_type application/octet-stream; 如果mime类型没匹配上,默认使用二进制流的方式传输。

sendfifile on;

sendfile on; 使用linux的 sendfile(socket, file, len) 高效网络传输,也就是数据0拷贝。

未开启sendfifile时:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x9o5Q2kM-1688308727044)(image\nginx.assets/image-20230618151150474.png)]

开启后:(nginx减少一次目标文件的复制

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K9pCRfdD-1688308727045)(image\nginx.assets/image-20230618151244976.png)]

keepalive_timeout 65;

keepalive_timeout 65;

server

虚拟主机配置

	#虚拟主机 vhost
    server {
        listen       80;
        server_name  localhost;	#域名、主机名

        # location用于匹配uri
        location / {
            #匹配目录:nginx根目录下的文件夹 这里是/nginx/index
            root   html;

            #默认页
            index  index.html index.htm;
        }

        #错误页
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }

虚拟主机

原本一台服务器只能对应一个站点,通过虚拟主机技术可以虚拟化成多个站点同时对外提供服务

servername匹配规则

我们需要注意的是servername匹配分先后顺序,写在前面的匹配上就不会继续往下匹配了。

完整匹配

我们可以在同一servername中匹配多个域名

server_name vod.mmban.com www1.mmban.com;

通配符匹配

server_name *.mmban.com

通配符结束匹配

server_name vod.*;

正则匹配

server_name ~^[0-9]+\.mmban\.com$;

配置多台虚拟主机

  • listen端口相同,server_name不能相同

  • server_name相同,listen端口不能相同

    #虚拟主机 vhost1
    server {
    listen 80;
    server_name www1.test.com; #域名、主机名

    # location用于匹配uri
    location / {
        #匹配目录:nginx根目录下的文件夹 这里是/nginx/index
        root   html;
    
        #默认页
        index  index.html index.htm;
    }
    
    #错误页
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
    

    }

    #虚拟主机 vhost2
    server {
    listen 80;
    server_name www2.test.com; #域名、主机名

    # location用于匹配uri
    location / {
        #匹配目录:nginx根目录下的文件夹 这里是/nginx/index
        root   html;
    
        #默认页
        index  index.html index.htm;
    }
    
    #错误页
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
    

    }

反向代理基础配置

proxy_pass http://baidu.com;
location / {

	proxy_pass http://atguigu.com/;

}

域名解析

多用户二级域名和短网址

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LtMtK9mE-1688308727045)(image\nginx.assets/image-20230618225732811.png)]

用户访问缩短后的URL时,通常将会重定向到原来的URL。

利用键值对应方式,将网址对应成被缩短的代码来散布使用。 使用时,系统先查询出原本的网址,再以网址重导向(URL redirection)来将缩短后的地址重定向到原来的URL。

xxx.test.com/xxxxxxxx

xxx:二级域名

xxxxxxxx:短网址、短链

一句话:二级域名截前面查库,短链截后面查数据库

httpdns

HTTPDNS 利用 HTTP 协议与 DNS 服务器交互,代替了传统的基于 UDP 协议的 DNS 交互,绕开了运营商的 Local DNS,有效防止了域名劫持,提高域名解析效率。另外,由于 DNS 服务器端获取的是真实客户端 IP 而非 Local DNS 的 IP,能够精确定位客户端地理位置、运营商信息,从而有效改进调度精确性。

正是由于传统的DNS存在诸多的缺点,所以现在稍微有点规模的公司都会自己搭建HTTPDNS服务器。HTTPDNS 的原理很简单,将 DNS 这种容易被劫持的协议,转为使用 HTTP 协议请求 Domain <-> IP 映射。 获得正确 IP 之后,Client 自己组装 HTTP 协议,从而避免 ISP 篡改数据。它的架构图也比较简单,如下图所示。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EJyjXKo3-1688308727045)(image\nginx.assets/image-20230618231052692.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jMPdXz4I-1688308727046)(image\nginx.assets/image-20230618231106954.png)]

使用HttpDns,可以有效解决传统DNS的DNS劫持、访问时间延迟等问题。 - 避免Local DNS 劫持:由于 HttpDns 是通过 IP 直接请求 HTTP 获取服务器 A 记录地址,不存在向本地运营商询问 domain 解析过程,所以从根本避免了劫持问题。 - 平均访问延迟下降:由于是 IP 直接访问省掉了一次 domain 解析过程,通过智能算法排序后找到最快节点进行访问。 - 用户连接失败率下降:通过算法降低以往失败率过高的服务器排序,通过时间近期访问过的数据提高服务器排序,通过历史访问成功记录提高服务器排序。

基于反向代理的负载均衡

代理与负载均衡的概念

正向代理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V4Rw4rrS-1688308727046)(image\nginx.assets/image-20230619213804802.png)]

用户和代理服务器是一家的,是用户主动配置的服务器,用于能够访问外网(A能ping通B,A不能ping通C,但是B能ping通C,A借助B访问C)

反向代理:由服务提供方方向提供的服务器,让用户能够访问到应用服务器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i11HUaeZ-1688308727047)(image\nginx.assets/image-20230619214246279.png)]

隧道式代理

负载均衡

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hzSOtAgt-1688308727048)(image\nginx.assets/image-20230619220304390.png)]

这里是轮询算法,为了避免一台微服务承受不住压力,于是相同微服务为一个集群,将他们的压力分配在集群各台主机上

配置反向代理


前提注意:本机ip是192.168.111.100,浏览器输入本机ip或者hosts文件中配置的主机名,或者域名解析的地址

注意:配置反向代理后,不会配置root路径,故改台主机将无法提供网页服务


1、反向代理到其他服务器网址——url不改变

    location / {
        #反向代理
        proxy_pass http://www.atguigu.com;

        #root   /www/www;
        #index  index.html index.htm;
    }

2、反向代理到其他服务器网址——url改变为真实网址

location / {
    #反向代理
    proxy_pass http://atguigu.com;	#相比上条没输入www

    #root   /www/www;
    #index  index.html index.htm;
}

3、反向代理到其他虚拟机

location / {
    #反向代理
    proxy_pass 192.168.111.101;		

    #root   /www/www;
    #index  index.html index.htm;
}

配置负载均衡

    #定义集群
    upstream cluster {
        server 192.168.111.101:80;
        server 192.168.111.102:80;
    }

    server {
        listen       80;
        server_name  localhost;

        location / {

            #反向代理到集群,配置负载均衡		用到上面定义的集群
            proxy_pass http://cluster;		#不要忘记写http://

            #root   /www/www;
            #index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

负载均衡策略

轮询

默认情况下使用轮询方式,逐一转发,这种方式适用于无状态请求

weight(权重)

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

	upstream cluster {
        server 192.168.111.101:80 weight=4 down;
        server 192.168.111.102:80 weight=8 backup;
    }
  • down:表示当前的server暂时不参与负载
  • weight:默认为1.weight越大,负载的权重就越大。
  • backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。

down和backup不常用

以下负载均衡算法均不常用:

ip_hash

根据客户端的ip地址转发同一台服务器,可以保持回话。

least_conn

最少连接访问

url_hash

根据用户访问的url定向转发请求

fair

根据后端服务器响应时间转发请求

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Z4EwLcP-1688308727048)(image\nginx.assets/image-20230620195424300.png)]

动静分离

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uDbNji6u-1688308727048)(image\nginx.assets/image-20230620203844511.png)]

只适合小型网站,静态资源较少,能起到系统加速的作用

将静态资源前置,网页请求静态资源时就不会把太多静态资源的请求打在后端tomcat服务器上,让后端服务器专心响应动态请求

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0Dsx9MIr-1688308727049)(image\nginx.assets/image-20230620204544669.png)]

动静配置配置

需要有一台虚拟机在tomcat上运行一个war包

1 配置反向代理:

location / {
    proxy_pass http://192.168.111.102:8080;
}

2 配置静态资源路径

方式一:通用匹配:需要增加很多个location

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

location ~*/(css|js|img) {		#~*表示正则匹配不区分大小写
    root /usr/local/nginx/static;
    index index.html index.htm;
}

需要注意:正则匹配优先级大于通用匹配

location前缀

  • / 通用匹配,任何请求都会匹配到。

  • = 精准匹配,不是以指定模式开头

  • ~ 正则匹配,区分大小写

  • ~* 正则匹配,不区分大小写

location匹配顺序

  • 多个正则location直接按书写顺序匹配,成功后就不会继续往后面匹配
  • 普通(非正则)location会一直往下,直到找到匹配度最高的(最大前缀匹配)
  • 当普通location与正则location同时存在,如果正则匹配成功,则不会再执行普通匹配
  • 所有类型location存在时,“=”匹配 > “^~”匹配 > 正则匹配 > 普通(最大前缀匹配)
//location大致可以分为三类
精准匹配:location = /{}
一般匹配:location /{}
正则匹配:location ~/{}

//location常用的匹配规则:
= :进行普通字符精确匹配,也就是完全匹配。
^~ :表示前缀字符串匹配(不是正则匹配,需要使用字符串),如果匹配成功,则不再匹配其它 location。
~ :区分大小写的匹配(需要使用正则表达式)。
~* :不区分大小写的匹配(需要使用正则表达式)。
!~ :区分大小写的匹配取非(需要使用正则表达式)。
!~* :不区分大小写的匹配取非(需要使用正则表达式)。

//正则规则:
() :表达式的开始和结束位置
| :或运算符  //例(js|img|css)

//优先级
首先精确匹配 =
其次前缀匹配 ^~
其次是按文件中顺序的正则匹配 ~~*
然后匹配不带任何修饰的前缀匹配
最后是交给 / 通用匹配

alias与root

location /css {
    alias /usr/local/nginx/static/css;
    index index.html index.htm;
}

root用来设置根目录,而alias在接受请求的时候在路径上不会加上location。

1)alias指定的目录是准确的,即location匹配访问的path目录下的文件直接是在alias目录下查找的; 2)root指定

的目录是location匹配访问的path目录的上一级目录,这个path目录一定要是真实存在root指定目录下的; 3)使用

alias标签的目录块中不能使用rewrite的break(具体原因不明);另外,alias指定的目录后面必须要加上"/"符

号!! 4)alias虚拟目录配置中,location匹配的path目录如果后面不带"/",那么访问的url地址中这个path目录后

面加不加"/“不影响访问,访问时它会自动加上”/“; 但是如果location匹配的path目录后面加上”/",那么访问的url地

址中这个path目录必须要加上"/“,访问时它不会自动加上”/“。如果不加上”/",访问就会失败! 5)root目录配置

中,location匹配的path目录后面带不带"/",都不会影响访问。

UrlRewrite

优点:掩藏真实的url以及url中可能暴露的参数,以及隐藏web使用的编程语言,提高安全性便于搜索引擎收录

缺点:降低效率,影响性能。如果项目是内网使用,比如公司内部软件,则没有必要配置。

rewrite语法格式及参数语法:

rewrite是实现URL重写的关键指令,根据regex (正则表达式)部分内容,
重定向到replacement,结尾是flag标记。

rewrite <regex> <replacement> [flag];
关键字 正则 替代内容 flag标记

关键字:其中关键字error_log不能改变
正则:perl兼容正则表达式语句进行规则匹配
替代内容:将正则匹配的内容替换成replacement
flag标记:rewrite支持的flag标记

rewrite参数的标签段位置:
server,location,if

flag标记说明:
last #本条规则匹配完成后,继续向下匹配新的location URI规则
break #本条规则匹配完成即终止,不再匹配后面的任何规则
redirect #返回302临时重定向,浏览器地址会显示跳转后的URL地址
permanent #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址

实例:

location / {
    
	rewrite ^/([0-9]+).html$ /index.jsp?pageNum=$1 break;
    
    #反向代理到集群,配置负载均衡
    proxy_pass http://cluster;
}

解释:

正则:^/([0-9]+).html$
^表示正则表达式开头
$表示正则表达式结尾
()表达式的开始和结束位置
+表示匹配一次或多次

替代内容:/index.jsp?pageNum=$1
服务器解析uri时将正则匹配到的内容替换成/index.jsp?pageNum=$1
$1表示正则表达式匹配到的第一个

flag标记:break
本条规则匹配完成即终止,不再匹配后面的任何规则

内网可访问防火墙配置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wQw5kyLP-1688308727049)(image\nginx.assets/image-20230621144550679.png)]

目前nginx已经可以实现反向代理、负载均衡、动静分离、UrlRewrite,因此我们将nginx服务器叫做网关服务器

若要将应用服务器设置为外网无法访问,内网可以访问,需要进行以下防火墙配置:

开启防火墙

systemctl start firewalld

指定端口和ip访问

firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.111.100" port protocol="tcp" port="8080" accept"

若要移除规则:

firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.111.100" port protocol="tcp" port="8080" accept"

重载规则

firewall-cmd --reload

查看已配置规则

firewall-cmd --list-all

反向代理、负载均衡、动静分离、UrlRewrite综合实现:

网关配置

    #定义集群	负载均衡
    upstream cluster {
        server 192.168.111.101:80 weight=4;
        server 192.168.111.102:80 weight=8;
    }

    server {
        listen       80;
        server_name  localhost;

        location / {
			
			#UrlRewrite
            rewrite ^/([0-9]+).html$ /index.jsp?pageNum=$1 break;

            #反向代理到集群,配置负载均衡
            proxy_pass http://cluster;

            #root   /www/www;
            #index  index.html index.htm;
        }
		
		#动静分离
        location ~*/(css|js|img) {

            root   html;
            index  index.html index.htm;
        }
	...
	}

现在访问应用服务器本机,我这里是redis102,将不能访问,

但访问nginx时,可以访问到redis102

防盗链

配置:在需要防盗链的location中配置,一般配置在动静分离location中的前面

valid_referers none | blocked | server_names | strings ....;
  • none, 检测 Referer 头域不存在的情况。
  • blocked,检测 Referer 头域的值被防火墙或者代理服务器删除或伪装的情况。这种情况该头域的值不以“http://” 或 “https://” 开头。
  • server_names ,设置一个或多个 URL ,检测 Referer 头域的值是否是这些 URL 中的某一个。

实例

	location ~*/(css|js|img) {

        valid_referers 192.168.44.100;		#实际中应该配置为域名而不是IP
        if ($invalid_referer) {
            return 403;		#return过后将不会再继续执行
        }

        root   html;
        index  index.html index.htm;
    }

浏览器请求referer中带192.168.44.100,则允许访问,否则返回403

未授权的服务器和直接访问静态资源都不能访问

若配置为:

valid_referers none 192.168.44.100;	 #添加了none

浏览器请求referer中带192.168.44.100或者为空时,允许访问

即自己授权的服务器和直接访问静态资源时可以访问,未授权的服务器不能访问

使用curl测试防盗链

安装curl

yum install -y curl

返回页面代码:

curl http://192.168.44.101/img/logo.png

只返回响应头:

curl -I http://192.168.44.101/img/logo.png

带引用:

curl -e "http://baidu.com" -I http://192.168.44.101/img/logo.png

配置错误提示页面

在nginx.conf配置文件对应server中添加错误页面location:

    error_page   403  /403.html;
    location = /403.html {
        root   html;
    }

在nginx服务器403匹配目录下添加403.html:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oWfwHSTl-1688308727050)(image\nginx.assets/image-20230621154718389.png)]

配置错误返回图片

在匹配图片的localtion的防盗链不匹配中添加rewrite:

    location ~*/(css|js|img) {

        valid_referers 192.168.44.100;
        if ($invalid_referer) {

            rewrite ^/ /img/403.png break;		#返回错误图片
            #return 403;
        }

        root   html;
        index  index.html index.htm;
    }

并在 /usr/local/nginx/html/img中添加图片403.png

高可用keepalived

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wT261mOd-1688308727050)(image\nginx.assets/image-20230621161313025.png)]

nginx间的keepalived可以相互通信,共同虚拟出一个虚拟ip(vip),vip是可以在两台nginx中切换的,根据实际情况漂移vip实现nginx的负载均衡

配置keepalived

先将原本的nginx虚拟机克隆一份,修改ip,保证nginx配置和环境相同

两台虚拟机安装keepalived:

yum install keepalived -y

使用yum安装后配置文件在 /etc/keepalived/keepalived.conf

最小配置:

第一台机器:

! Configuration File for keepalived

global_defs {

   router_id lb100		#该台机器的id,不能重复

}

vrrp_instance VI_1 {
    state MASTER	#表示主机
    interface ens33		#对方网卡名称,根据真实情况
    virtual_router_id 51
    priority 100	#优先级
    advert_int 1
    authentication {	#身份识别,相同为同一组
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {		#虚拟ip,可配置多个
        192.168.111.200
    }
}

第二台机器:

! Configuration File for keepalived

global_defs {

   router_id lb101		#该台机器的id,不能重复

}

vrrp_instance VI_1 {
    state BACKUP	#表示从机
    interface ens33		#对方网卡名称,根据真实情况
    virtual_router_id 51
    priority 50		#优先级
    advert_int 1
    authentication {	#身份识别,相同为同一组
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {		#虚拟ip,可配置多个
        192.168.111.200
    }
}

启动两台机器的keepalived:

systemctl start keepalived

可以使用ip a 查看ens33网卡的ip,可看到其中一个虚拟机多了一个虚拟ip,若这台虚拟机down掉,vip将漂移到另一台虚拟机

实际应用中,需要写对应的脚本监测本机的keepalived和nginx的服务运行状态,否则可能本机没有down掉,但是nginx服务关闭了,但是keepalived并没有关闭,则不会进行vip漂移,需要脚本监测到nginx down掉后,自动kill掉自己的keepalived

也适用于mysql、redis等其他服务

Https证书配置

不安全的http协议与对称加密

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jBjpyHvj-1688308727051)(image\nginx.assets/image-20230621191710171.png)]

  • http协议不安全,因为采用的是明文方式发送数据
  • 防火墙只能拦截在服务器或客户端主机上的违法操作,但是无法处理网络传输过程中的拦截
  • 于是需要加密算法,比如凯撒加密算法,用户方将明文加密成密文后发送出去,服务方再采用相同的算法解密成明文
  • 像上面的两方使用相同的加密算法叫做对称加密
  • 但是对称加密也不安全,因为对称加密的算法需要内置到服务器端,而例如nginx是开源的,拦截者也能知道内置了哪些加密算法

非对称加密

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nm03Vykt-1688308727051)(image\nginx.assets/image-20230621193226227.png)]

  • 用户先访问443端口下载公钥,再通过公钥发送后续真正的请求
  • 用户 --》 服务端 公钥加密,私钥解密
  • 服务端 --》 用户 私钥加密,公钥解密

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0AIwKp33-1688308727051)(image\nginx.assets/image-20230621194104815.png)]

  • 私钥不传输,一直在服务端,因此私钥安全
  • 公钥加密,但是拦截者拦截公钥后,用公钥解不开
  • 但是,非对称加密也是不安全
  • 因为,虽然不能伪造客户端,但是可以伪造服务端,代替客户端与服务端通信,给客户端假公钥

HTTPS原理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DoBKwoBt-1688308727051)(image\nginx.assets/image-20230621200836558.png)]

  • 引入了CA机构,具有公信度
  • 不再像非对称加密一样,传递服务端的公钥,而是传递证书
  • 服务端将公钥交给CA机构认证,经过检测确实是真实服务器后认证成功,然后CA机构通过自己的私钥+加密算法加密服务器的公钥生成证书,服务端发送给用户证书
  • 证书可以被截取解开,但是截取解开后,没有CA机构的私钥再进行加密,因此会显示是不安全
  • 用户接收到证书后,通过操作系统内置的ca.公钥解开证书得到服务器的公钥,再用服务器的公钥加密数据进行传输,就算拦截者有服务器公钥,也无法解开用户传输的数据,因为公钥加密,公钥解不开,公私对应才能解开

申请配置SSL证书

先购买自己的域名,和ECS云服务器,这里采用阿里云

安装LNMP环境

使用下列网站

OneinStack - 一键PHP/JAVA安装工具

自动安装 --》 若有mysql数据库则取消勾选mysql – 》Nodejs、Pure-FTPd、phpMyAdmin、redis、memcached、iptables全部取消勾选–》 自己决定是否重启

配置云服务器安全组

将80端口和443端口为0.0.0.0开放,此时即可正常访问nginx主页

修改nginx网页默认位置

cd /usr/local/nginx/conf
vim nginx.conf

将server下的root修改为html

  server {
    listen 80;
    server_name _;
    access_log /data/wwwlogs/access_nginx.log combined;
    root html;			#修改这里为html相对路径
    .

本服务器没有完成备案,后续教程查看【初探篇】申请阿里云免费SSL证书并配置https访问实战_ssl证书申请了不用在服务器上配置吗_潮浪之巅的博客-CSDN博客

安装discuz论坛

51-线上实战-安装Discuz与协议自动跳转_哔哩哔哩_bilibili

需要安装好上面的LNMP环境

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值