Nginx基础

准备

下载

四个常用版本

  • Nginx开源版 http://nginx.org/
  • Nginx plus 商业版 https://www.nginx.com
  • openresty http://openresty.org/cn/
  • Tengine http://tengine.taobao.org/

安装

解压

tar zxvf nginx-1.21.6.tar.gz

进入目录

cd nginx-1.21.6

选择编译安装

./configure --prefix=/usr/local/nginx
make
make install

测试

进入/usr/local/nginx/sbin

cd /usr/local/nginx/sbin

测试

./nginx 启动
./nginx -s stop 快速停止
./nginx -s quit 优雅关闭,在退出前完成已经接受的连接请求
./nginx -s reload 重新加载配置

验证启动

通过 ip addr 查询IP地址

image-20220405203300812

浏览器访问

image-20220405203322212

防火墙可能会导致访问超时

关闭防火墙

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 start nginx.service 

开机启动

systemctl enable nginx.service

基础使用

目录结构

进入Nginx的主目录我们可以看到这些文件夹

client_body_temp conf fastcgi_temp html logs proxy_temp sbin scgi_temp uwsgi_temp

其中这几个文件夹在刚安装后是没有的,主要用来存放运行过程中的临时文件

client_body_temp fastcgi_temp proxy_temp scgi_temp

conf 用来存放配置文件相关

html 用来存放静态文件的默认目录 html、css等

sbin nginx的主程

基本运行原理

image-20220405204356348

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类型没匹配上,默认使用二进制流的方式传输。

sendfile on;

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

未开启sendfile

image-20220405204812763

开启后

image-20220405204839550

keepalive_timeout 65;

keepalive_timeout 65;

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

最简单的测试是把修改本机的 hosts 文件,添加本机域名解析,把配置的虚拟主机的server_name与虚拟主机的ip地址相联系,然后本机的浏览器就可以通过域名(server_name)访问了

如果希望外网也能访问,可以在阿里云购买一个域名,对于购买的域名我们可以设置多个二级域名(即实现多用户二级域名系统,涉及到下面讲的反向代理),这样就能体现虚拟主机设置server_name 的作用了,当我们为不同的虚拟主机设置不同的 server_name 后,外网通过不同的二级域名就可以从同一个ip地址 获取不同的响应

servername匹配规则

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

完整匹配

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

server_name vod.mmban.com www1.mmban.com;
通配符匹配
server_name *.mmban.com
通配符结束匹配
server_name vod.*;
正则匹配
server_name ~^[0-9]+\.mmban\.com$;

反向代理

image-20220406165235500

概念

重点在于代理 ,Nginx 为用户请求提供 代理,即为用户转发请求给应用服务器,在互联网和应用服务器之间建立沟通的桥梁

反向正向 是相对而言的,对于用户来说 Nginx是由 服务方 提供的,因此是反向。当用户由 网关 向外网获取消息时,网关起到的的就是正向代理的作用,因为这是客户自己提供的

配置

修改配置文件中的 虚拟主机server ,这时就实现了代理的功能

location / {
	proxy_pass http://atguigu.com/;
}	

传统公司系统架构

image-20220406170651879

image-20220406170708187

image-20220406170740746

Nginx在其中发挥请求中转的作用

负载均衡

基本配置,在配置文件中添加

upstream httpd {
	server 192.168.44.102:80;
	server 192.168.43.103:80;
}

概念

顾名思义,当一台服务器不可用(如,负载达到上限或者一定值)时,Nginx可以把业务分配给其他服务器(大概就这个意思)

策略

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

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

upstream httpd {
	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机器。

动静分离

概念

把原本属于服务器的静态资源交给Nginx,这样当用户请求静态资源时就不需要Nginx代理从服务器中获取资源再转发。目的是为了减小服务器的压力。但仅适用于静态资源较少的中小型项目

配置

增加每一个资源对应的location(将服务器中的资源删除并移动到Nginx上后)

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 前缀

  • / 通用匹配,任何请求都会匹配到。
  • = 精准匹配,不是以指定模式开头
  • ~ 正则匹配,区分大小写
  • ~* 正则匹配,不区分大小写
  • ^~ 非正则匹配,匹配以指定模式开头的location

location匹配顺序

  • 多个正则location直接按书写顺序匹配,成功后就不会继续往后面匹配
  • 普通(非正则)location会一直往下,直到找到匹配度最高的(最大前缀匹配)
  • 当普通location与正则location同时存在,如果正则匹配成功,则不会再执行普通匹配
  • 所有类型location存在时,“=”匹配 > “^~”匹配 > 正则匹配 > 普通(最大前缀匹配)
location ~*/(css|img|js) {
	root /usr/local/nginx/static;
	index index.html index.htm;
}

UrlRewrite

rewrite语法格式及参数语法

根据regex (正则表达式)部分内容, 重定向到replacement,结尾是flag标记。

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

flag标记说明:

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

实例:

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

反向代理 + 负载均衡 + UrlRewrite

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 / {
	rewrite ^/([0-9]+).html$ /index.jsp?pageNum=$1 redirect;
	proxy_pass http://httpds ;
}

防盗链

概念

反向代理,页面的引用等 都是二次对资源进行请求,所有的二次请求都会带有原来请求的地址,可以帮助Nginx判断这个请求是自己本来就允许的站点,还是非法站点(引用非法)

配置

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

在需要防盗链的location中配置

valid_referers 192.168.44.101;
if ($invalid_referer) {
	return 403;
}

高可用配置

解决问题

我们用负载均衡实现了当一个服务器挂掉时,Nginx可以选择别的服务器发送请求。那么如果Nginx挂掉呢,如果我们仍采用一个新的Nginx来管理该Nginx和他的备份,那么如果新的Nginx挂掉呢?所以这是一个套娃,是行不通的

keepalived

keepalived能够控制一个虚拟地址,使其在主Nginx和备份Nginx之间切换,主和备的真实ip地址保持不变,仅仅是改变虚拟地址。该虚拟地址即是用户所请求的地址,所以keepalived只要保证虚拟地址能够及时的转移到可用的Nginx上就可以了

编译安装

下载地址 https://www.keepalived.org/download.html#

使用 ./configure 编译安装

如遇报错提示

configure: error: 
 !!! OpenSSL is not properly installed on your system. !!! 
 !!! Can not include OpenSSL headers files. !!!

安装依赖

yum install openssl-devel
yum安装
yum install keepalived
配置

使用yum安装后配置文件在

/etc/keepalived/keepalived.conf

最小配置

第一台机器

! Configuration File for keepalived
global_defs {
	router_id lb111
}
vrrp_instance atguigu {
	state MASTER
	interface ens33
	virtual_router_id 51
	priority 100
	advert_int 1
	authentication {
		auth_type PASS
		auth_pass 1111
	}
	virtual_ipaddress {
		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
	}
}

启动服务

systemctl start keepalived

Https证书配置

不安全的http协议

http协议传输过程中不安全

解决:通过加密算法,传输密文

对称加密算法

无论怎么优化,因其对称性永远无法保证安全

image-20220406204835480

非对称加密算法

(满足一个特性,公私能互解,但是公公解不开),即https的底层算法

image-20220406204810257

但也不安全,例如当用户发送获取公钥的请求后,拦截者可以将其拦下,代替其去获取公钥,并返回给用户一个假的公钥。这样用户-拦截者-服务器之间就建立起了连接,显然这样就不安全了。

CA签名

image-20220406210319028

上述问题简单的来说就是 你获得的公钥不可靠

解决

  1. 服务器向CA机构提交包括自己的公钥在内的一系列资料
  2. CA机构通过利用自己的 私钥 + 非对称加密算法将 服务器提交的公钥 加密后生成 证书
  3. 将证书还给服务器
  4. 当用户向服务器申请公钥时,服务器向其发送证书
  5. 因为CA机构是个实实在在的涵盖很广的一个机构,所以你的操作系统可以提前知道CA机构的私钥对应的公钥(即公钥内置在系统里),所以当你收到证书时,如果你可以用内置的公钥解开它,那么它必定是安全的(拦截者无法获得CA机构的私钥,不能伪造证书)
    951420)]

非对称加密算法

(满足一个特性,公私能互解,但是公公解不开),即https的底层算法

[外链图片转存中…(img-77z0IO1M-1649250951421)]

但也不安全,例如当用户发送获取公钥的请求后,拦截者可以将其拦下,代替其去获取公钥,并返回给用户一个假的公钥。这样用户-拦截者-服务器之间就建立起了连接,显然这样就不安全了。

CA签名

[外链图片转存中…(img-V0U7zyb2-1649250951422)]

上述问题简单的来说就是 你获得的公钥不可靠

解决

  1. 服务器向CA机构提交包括自己的公钥在内的一系列资料
  2. CA机构通过利用自己的 私钥 + 非对称加密算法将 服务器提交的公钥 加密后生成 证书
  3. 将证书还给服务器
  4. 当用户向服务器申请公钥时,服务器向其发送证书
  5. 因为CA机构是个实实在在的涵盖很广的一个机构,所以你的操作系统可以提前知道CA机构的私钥对应的公钥(即公钥内置在系统里),所以当你收到证书时,如果你可以用内置的公钥解开它,那么它必定是安全的(拦截者无法获得CA机构的私钥,不能伪造证书)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值