nginx学习笔记

一 概述

基本概念

Nginx是一个具有高性能的http和反向代理的web服务器

正向代理:为客户端提供服务

反向代理:为服务端提供服务

优点

  • 速度快,并发高

  • 配置简单,扩展性强

  • 高可靠

  • 热部署

  • 成本低

常用功能

  • 静态资源部署

  • Rewrite地址重写

  • 反向代理

  • 负载均衡

  • 缓存

  • 环境部署

二 安装

通过yum安装

  1. 安装yum-utils

    sudo yum install yum-utils
    
  2. 添加/etc/yum.repos.d/nginx.repo文件

    [nginx-stable]
    name=nginx stable repo
    baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
    gpgcheck=1
    enabled=1
    gpgkey=https://nginx.org/keys/nginx_signing.key
    module_hotfixes=true
    
    [nginx-mainline]
    name=nginx mainline repo
    baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
    gpgcheck=1
    enabled=0
    gpgkey=https://nginx.org/keys/nginx_signing.key
    module_hotfixes=true
    
  3. 安装nginx(稳定版)

    sudo yum install -y nginx
    

安装后输入启动nginx

cd /usr/sbin
./nginx

然后在浏览器输入服务器ip,看到Welcome to nginx则表示安装成功

默认安装位置:/etc/nginx

参考https://nginx.org/en/linux_packages.html#RHEL

三 基本使用

目录结构

二进制文件:/usr/sbin/nginx
安装目录:/etc/nginx
配置文件:/etc/nginx/nginx.conf   /etc/nginx/conf.d/xxx.conf
日志:/var/log/nginx/access.log   /var/log/nginx/error.log
进程id:/var/run/nginx.pid
mime类型:/etc/nginx/mime.types
静态资源:/usr/share/nginx/html/xxx.html

启停控制

信号控制

nginx包括一个master进程和多个worker进程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NwKe4KlC-1673192371779)(image/2022-11-23-23-15-17-image.png)]

获取master进程id:

  • 查看nginx所有进程

    ps -ef |grep nginx
    
  • 查看nginx进程id

    cat /var/run/nginx.pid
    

信号调用命令

# signal为信号,PID为master进程id
kill -signal PID

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3VRlksDy-1673192371781)(image/2022-11-23-23-23-00-image.png)]

命令行控制

查看nginx所有命令

./nginx -h

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QZRhIIbd-1673192371783)(image/2022-11-23-23-43-45-image.png)]

-t:测试配置文件内容是否正确(常用

-s stop类似TERM/INT信号

-s quit类似QUIT信号

-s reopen类似USR1信号

-s reload类似HUP信号(重新加载配置文件,常用

-p:设置安装目录

-e:设置错误日志

-c:设置配置文件

-g:启动时指定配置内容,如./nginx -g "pid logs/abc.pid;"

版本升级

实现平滑升级,不需要重启nginx

信号方式

  1. 将旧版本的nginx二进制文件备份为nginxold

  2. 将新版本的nginx二进制文件拷贝到sbin目录下

  3. kill -USR2 旧版本的nginx的master进程id

  4. kill -QUIT 旧版本的nginx的master进程id

命令方式

  1. 将旧版本的nginx二进制文件备份为nginxold

  2. 将新版本的nginx二进制文件拷贝到sbin目录下

  3. 退回到新版本nginx安装目录,执行make upgrade

nginx.conf配置文件

包括全局块、events块、http块

http块配置多个server块,每个server块配置多个location块

全局块

user指令

配置运行nginx的worker进程的用户和用户组

user user [group];

查看运行worker进程的用户:ps -ef |grep nginx

master_process指令

指定是否开启worker进程

master_process on | off;
worker_processes指令

配置生成worker进程数量

worker_processes num/auto;
daemon指令

设定nginx是否以守护进程方式启动,默认on

daemon on | off;
pid指令

配置master进程id存储的文件路径

pid file;
error_log指令

配置错误日志存放路径

error_log file [日志级别];

日志级别有debug | info | notice | warn |error |crit |alert |emerg

建议不要设置成info以下级别,会导致大量磁盘IO消耗

include指令

引入其它配置文件

include file;

events块

accept_mutex指令

设置nginx网络连接序列化

accept_mutex on | off;
multi_accept指令

是否允许同时接收多个网络连接

multi_accept on | off;
worker_connections指令

设置单个worker进程最大连接数,默认512

worker_connections number;
use指令

设置nginx选择哪种事件驱动处理网络消息,可选select/poll/epoll/kqueue

use method;

http块

定义MIME-Type
include       /etc/nginx/mime.types;
# 配置nginx响应前端请求默认的mime类型
default_type  application/octet-stream;
自定义服务日志

access.log: 访问请求日志

error.log: 错误日志

指定access.log路径

access_log path[format[buffer=size]];

指定日志输出格式

log_format name [escape=default|json|none] string...;
sendfile

设置是否使用sendfile()传输文件,可以提高处理静态资源的性能

sendfile on | off;
keepalive_timeout

设置长连接的超时时间

keepalive_timeout time;
keepalive_requests

设置一个长连接使用的次数

keepalive_requests number;

server块和location块

listen指令

配置监听端口

#default_server:将虚拟主机设置成默认主机,如果不指定默认用第一个server_name
listen address[:port] [default_server];
listen port [default_server];
server_name指令

设置虚拟主机服务名称

server_name name;
#name可以提供多个,用空格分隔

精准匹配:server_name 127.0.0.1;

通配符匹配:server_name www.baidu.*;

通配符只能在首部或尾部

正则表达式匹配:以开始,后面不能有空格

可以使用$1获取第一个括号内的值

匹配顺序:

  1. 精准匹配

  2. 通配符在首部

  3. 通配符在尾部

  4. 正则表达式

location指令

设置请求的uri

location [= | ~ | ~* | ^~ | @] uri;
# =:精准匹配
# ~:正则表达式匹配,*表示不区分大小写
# ^~:如果模式匹配,就停止搜索其它模式
root指令

设置请求的根目录

root path;
alias指令

设置请求的路径别名

alias path;

root和alias区别

  • root: 最终访问路径是root路径+location路径

  • alias: 最终访问路径是alias路径

注意location路径以/结尾,alias路径也要以/结尾

index指令

设置网站默认首页

index file1 file2;

可以设置多个文件,以空格分开

error_page指令

设置网站错误页面

error_page code [=[response]] uri;
# error_page 404 http://www.baidu.com;
# error_page 404 /404.html;
# error_page 404 @jump_to_error;

# 修改状态码为200
# error_page 404 =200 /404.html;
sendfile指令

开启高效的文件传输模式(减少用户态的文件拷贝和用户态内核态的进程切换)

sendfile on | off;
tcp_nopush指令

需要设置sendfile on,提升网络包传输效率(数据装满缓存区再发)

tcp_nopush on | off;
tcp_nodelay指令

需要设置keepalive,提高网络包传输实时性(数据直接发)

tcp_nodelay on | off;

静态资源压缩

以下配置可以抽取到nginx_gzip.conf,在nginx.conf引入即可

gzip指令

开启或关闭gzip功能

gzip on | off;

gzip_types指令

根据响应页的MIME类型选择性开启gzip功能

gzip_types mime-type ...;
# mime-type默认为text/html
# mime-type可以设置为*,代表全部类型

mime-type可以去mime.types查找

gzip_comp_level指令

设置压缩程度,级别从1-9,1表示压缩程度最低

gzip_comp_level level;
# level默认为1

gzip_vary指令

设置压缩发送是否携带“Vary:Accept-Encoding”响应头

gzip_vary on | off;
# 默认为on

gzip_buffers指令

设置压缩的缓冲区数量和大小

gzip_buffers number size;
# number默认32.4k,size默认16.8k

gzip_disable指令

根据客户端的浏览器标志(user-agent)指定开启或关闭gzip

gzip_disable regex;
# regex可使用正则表达式

gzip_http_version指令

根据http版本指定开启或关闭gzip

gzip_http_version 1.0 | 1.1;
# 默认为1.1

gzip_min_length指令

根据传输数据大小(响应头Content-Length)指定开启或关闭gzip

gzip_min_length length;
# length默认为20(字节)
# length可以带上k,m单位

gzip_proxied指令

设置是否对服务端返回的结果进行压缩

gzip_proxied off | expired | no-cache | no-store | private
 | no_last_modified | no_etag | auth | any;

gzip_static指令

解决gzip和sendfile共存问题

检查与访问资源同名的.gz文件,响应中以gzip相关的header返回.gz文件的内容

gzip_static on | off | always;
# 默认为off
# on的话会检查浏览器是否支持gzip

需要添加http_gzip_static_module模块

执行gzip file可以压缩为file.gz

2023-05-07更新

五 缓存

浏览器缓存

http协议和页面缓存相关的字段
在这里插入图片描述
浏览器缓存流程
在这里插入图片描述
强缓存:直接从缓存取数据

弱缓存:先发送请求给服务端判断ETag, Last-Modified,服务端判断数据没变化,再从缓存取数据

缓存配置

expires指令

用来控制页面缓存的作用

expires [modified] time
expires epoch | max | off;
# 默认为expires off

在这里插入图片描述

add_header指令

添加指定的响应头信息

add_header name value [always];

在这里插入图片描述

六 跨域和防盗链

同源策略

协议、域名(IP)、端口相同

跨域问题

两台服务器A、B,A的页面发送异步请求到B,如果不满足同源策略,则会出现跨域问题

跨域配置

add_header Access_Control_Allow_Origin ip1,ip2;
add_header Access_Control_Allow_Methods GET,POST;

静态资源防盗链

资源盗链:将别人的内容绕过限制放到自己页面上展示

valid_referers指令

配置防盗链,$invalid_referer=1表示不匹配

valid_referers none | blocked | server_names | string

if ($invalid_referer) {
    return 403
}

在这里插入图片描述

七 Rewrite

概述

主要用来实现URL重写

依赖PCRE的支持,编译安装nginx服务器前,需要安装PCRE库

set指令

设置新的变量

# variable为变量名称(不要与nginx服务器预设的全局变量同名),value为变量值
set $variable value;

Rewrite全局变量
在这里插入图片描述
在这里插入图片描述

if指令

条件判断

if (condition) {}
# condition支持以下格式
# 变量名
# 用=,!=比较变量和字符串是否相等
# 正则表达式:
  ~:区分大小写
  ~*:不区分大小写
  !~:区分大小写,返回值相反
  !~*:不区分大小写,返回值相反
# 请求文件是否存在
  -f:存在返回true
  !-f:返回与-f相反
# 请求目录是否存在:-d,!-d
# 请求目录或文件是否存在:-e,!-e
# 请求文件是否可执行:-x,!-x

break指令

与break指令处于同一作用域的nginx配置中,位于它前面的指令配置有效,位于后面的指令配置无效。

终止当前的匹配并把当前URI在本location进行重定向访问处理

# 访问/testbreak?1时会访问html下面testbreak目录的index.html

location /testbreak {
    default_type text/plain;
    set $name a;
    if ($args) {
        set $name b;
        break;
        set $name c;
    }
    add_header name $name;
    return 200 $name;
}

return指令

向客户端返回

return后的所有配置都是无效

return code [text];
return code URL;
return URL;

rewrite指令

通过正则表达式的使用来改变URI

rewrite regex replacement [flag];
# replacement如果以http://或https://开头,则不会继续向下匹配,直接返回地址给客户端
# flag:
# last:将重写的uri查找其它location块匹配
# break:将重写的uri在当前location块去访问html/xxx/index.html
# redirect:将重写的uri查找其它location块匹配,状态码为302临时重定向
# permanent:将重写的uri查找其它location块匹配,状态码为301永久重定向
location /rewrite {
    rewrite ^/rewrite/url\w*$ https://www.baidu.com;
    rewrite ^/rewrite/(test)\w*$ /$1;
}
location /test {
    default_type text/plain;
    return 200 test;
}
# 访问/rewrite/url123,跳转到百度
# 访问/rewrite/test123,返回200 test
# .*表示任意0个或多个字符
rewrite ^(.*) https://www.baidu.com/$1;

rewrite_log指令

是否开启url重写日志的输出

以notice级别输出到error_log指令配置的日志文件

rewrite_log on | off;
# 默认off
error_log logs/error.log notice;

目录自动加斜杠

如果不加斜杠,nginx会自动做301重定向

server_name_in_redirect on | off;

# on:重定向地址为http://server_name:port/目录名/
# off:重定向地址为http://url的域名:port/目录名/
# location块中
# 如果访问的是目录
if (-d $request_filename) {
    rewrite ^(.*)([^/])$ http://$host:$server_port$1$2/ permanent;
}

防盗链

if ($invalid_referer) {
    rewrite ^/  /images/xxx.png break;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值