返回

Nginx学习笔记

Nginx安装

版本区别

常用版本分为四大阵营

Linux配置

  • 虚拟机:VMware workstation 16
  • 操作系统:CentOS 7

配置网卡

查看IP

1
ip addr

查看网卡配置文件:

1
cat /etc/sysconfig/network-scripts/ifcfg-ens33

ONBOOT=no,则改成yes,开机自启动网卡,重启网络服务:

1
systemctl restart network

编译安装

  1. 打开Nginx开源版官网下载nginx安装包,并解压
1
tar zxvf nginx-1.22.1.tar.gz
  1. 进入解压后目录,编译安装与依赖检查
1
2
3
./configure --prefix=/usr/local/nginx
make
make install

遇到错误

ERROR1

1
2
3
4
checking for OS
+ Linux 3.10.0-693.el7.x86_64 x86_64
checking for C compiler ... not found
./configure: error: C compiler cc is not found

解决:安装GCC

1
yum install -y gcc

ERROR2

1
2
3
4
/configure: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using --with-pcre=<path> option.

解决:安装perl库

1
yum install -y pcre pcre-devel

ERROR3

1
2
3
4
./configure: error: the HTTP gzip module requires the zlib library.
You can either disable the module by using --without-http_gzip_module
option, or install the zlib library into the system, or build the zlib library
statically from the source with nginx by using --with-zlib=<path> option.

解决:安装zlib库

1
yum install -y zlib zlib-devel

启动Nginx

进入安装好的目录 /usr/local/nginx/sbin

启动:

1
./nginx

关闭防火墙:

1
systemctl stop firewalld.service

禁止防火墙开机启动:

1
systemctl disable firewalld.service

查看IP:

1
ip addr

可以在虚拟机浏览器访问本地环回地址127.0.0.1,也可以在宿主机浏览器访问虚拟机IP,看到Nginx的欢迎页面:

快速停止:

1
./nginx -s stop

优雅关闭,在退出前完成已经接受的连接请求:

1
./nginx -s quit

重新加载配置:

1
./nginx -s reload

将nginx安装成系统服务

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
systemctl daemon-reload

以后就可以使用systemctl命令来启动nginx了

查看当前进程:

1
ps -ef | grep nginx

关闭之前启动的nginx进程:

1
./nginx -s stop

启动nginx:

1
systemctl start nginx

查看nginx服务状态:

1
systemctl status nginx

设置nginx开机自启:

1
systemctl enable nginx.service

重启机器:

1
reboot

Nginx基础使用

目录结构

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

  • client_body_temp
  • conf:用来存放配置文件相关
  • fastcgi_temp
  • html:用来存放静态文件的默认目录 html、css等
  • logs:存放日志文件
  • proxy_temp
  • sbin:nginx的主程序(二进制启动文件)
  • scgi_temp
  • uwsgi_temp

其中后缀名为_temp的文件夹是用来存放运行过程中的临时文件

运行原理

  • Master是主进程,Worker是子进程

配置文件

打开nginx.conf

  • worker_processes 1;:默认为1,表示开启一个业务进程,一般设置为与内核数一致
  • worker_connections 1024; :单个业务进程可接受连接数
  • include mime.types;:引入http mime类型,告诉浏览器响应的数据类型,方便浏览器解析服务器的响应数据
  • default_type application/octet-stream;:如果mime类型没匹配上,默认使用二进制流的方式传输。
  • sendfile on;: 使用linux的 sendfile(socket, file, len) 高效网络传输,也就是数据0拷贝。

未开启sendfile

开启sendfile

  • keepalive_timeout 65;:心跳机制

虚拟主机

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

虚拟主机技术在nginx中的具体实现可以通过在nginx.conf文件中定义多个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;
	}
}

servername匹配规则

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

  • 完整匹配

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

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

反向代理

反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。

反向代理服务器架设在服务器端,通过缓冲经常被请求的页面来缓解服务器的工作量。

反向代理中,外部网络对于内部网络具体的情况是不可见的,而代理服务器来代理内部网络来返回所要的数据(当然静态文件可以放在Nginx,这个静动分离再说),客户端不知道内部网络上的服务器的实际地址,而服务端知道客户端请求的来源以及数据。反向代理代理的是服务端

正向代理

正向代理是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。

正向代理,架设在客户机与目标主机之间,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中。

正向代理是客户端知道目的服务器在哪里,然后通过代理服务器去访问客户端不能直接访问的目标服务器,而目标服务器并不知道客户端通过什么来访问的。 即正向代理代理的是客户端

配置反向代理

1
2
3
location / {
	proxy_pass http://baidu.com/; #将访问nginx服务器的请求发到baidu
}

基于反向代理的负载均衡

1
2
3
4
upstream httpd {
	server 192.168.44.102:80; # 服务器1
	server 192.168.43.103:80; # 服务器2
}

负载均衡策略

  • 轮询:默认情况下使用轮询方式,逐一转发,这种方式适用于无状态请求。
  • weight(权重):指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
1
2
3
4
5
upstream httpd { 
    server 192.168.44.102 weight=10 down; 
    server 192.168.44.103 weight=1; 
    server 192.168.44.104 weight=1 backup; 
} 
  • down:表示当前的server暂时不参与负载
  • weight:默认为1.weight越大,负载的权重就越大。
  • backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。

下面这几个策略实际生产环境中很少使用:

  • ip_hash:根据客户端的ip地址转发同一台服务器,可以保持回话。
  • least_conn:最少连接访问
  • url_hash:根据用户访问的url定向转发请求
  • fair:根据后端服务器响应时间转发请求

动静分离

localtion前缀类型:

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

location匹配顺序:

  • 多个正则location直接按书写顺序匹配,成功后就不会继续往后面匹配
  • 普通(非正则)location会一直往下,直到找到匹配度最高的(最大前缀匹配)
  • 当普通location与正则location同时存在,如果正则匹配成功,则不会再执行普通匹配
  • 所有类型location存在时,“=”匹配 > “^~”匹配 > 正则匹配 > 普通(最大前缀匹配)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# 不使用正则
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/static;
	index index.html index.htm;
}

alias与root

1
2
3
4
location /css {
	alias /usr/local/nginx/static/css;
	index index.html index.htm;
}

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

  • alias指定的目录是准确的,即location匹配访问的path目录下的文件直接是在alias目录下查找的;
  • root指定的目录是location匹配访问的path目录的上一级目录,这个path目录一定要是真实存在root指定目录下的;
  • 使用 alias标签的目录块中不能使用rewrite的break(具体原因不明);另外,alias指定的目录后面必须要加上"/“符号!!
  • alias虚拟目录配置中,location匹配的path目录如果后面不带”/",那么访问的url地址中这个path目录后面加不加"/“不影响访问,访问时它会自动加上”/"; 但是如果location匹配的path目录后面加上"/",那么访问的url地址中这个path目录必须要加上"/",访问时它不会自动加上"/"。如果不加上"/",访问就会失败!
  • root目录配置中,location匹配的path目录后面带不带"/",都不会影响访问。

UrlRewrite

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

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

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

flag标记说明:

  • last:本条规则匹配完成后,继续向下匹配新的location URI规则
  • break:本条规则匹配完成即终止,不再匹配后面的任何规则
  • redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址
  • permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
1
rewrite ^/([0-9]+).html$ /index.jsp?pageNum=$1 break;

UrlRewrite + 负载均衡

nginx服务器作为服务器内网的网关

开启防火墙

1
systemctl start firewalld 

重启防火墙

1
systemctl restart firewalld

重载规则

1
firewall-cmd --reload

查看已配置规则

1
firewall-cmd --list-all

指定端口和ip访问

1
2
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="只开放给nginx服务器的IP" port protocol="tcp" port="{开放给nginx服务器的端口}" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.44.101" port protocol="tcp" port="8080" accept"

移除规则

1
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
upstream httpds { 
    server 192.168.44.102 weight=8 down; 
    server 192.168.44.103 weight=2; 
    server 192.168.44.104 weight=1 backup; 
} 
location / { 
    rewrite ^/([0-9]+).html$ /index.jsp?pageNum=$1 redirect; 
    proxy_pass http://httpds ; 
}

防盗链配置

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

在需要防盗链的location中配置:

1
2
3
4
valid_referers 192.168.44.101;
if ($invalid_referer) {
	return 403;
}

使用curl测试:

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

带引用:

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

高可用配置

使用keepalived工具,当它启动后,可以检测所在机器的keepalived进程是否结束,若结束,则将IP转移到配置中的另一台权重较低的机器,从而保证一台Nginx服务器宕机后,自动使用另一台Nginx服务器

编译安装

下载地址

使用./configure编译安装

如遇报错提示

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

安装依赖

1
yum install openssl-devel 

yum安装

1
yum install keepalived

配置

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

第一台机器的keepalived配置文件:

 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 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 
	} 
} 

第二台机器keepalived配置文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
! 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 
    } 
} 

启动服务:

1
systemctl start keepalived

Nginx高级使用

Nginx高级使用内容不仅局限于Nginx自身功能讲解、配置、调 优,而且会由一个单一站点向高并发系统逐步演化,在演化的过程中以 Nginx为核心系统化讲解企业级高并发技术解决方案。

等以后接触到以Nginx为核心的高并发技术解决方案再继续学习:传送门

Built with Hugo
Theme Stack designed by Jimmy