文章目录
一 概述
基本概念
Nginx是一个具有高性能的http和反向代理的web服务器
正向代理:为客户端提供服务
反向代理:为服务端提供服务
优点
-
速度快,并发高
-
配置简单,扩展性强
-
高可靠
-
热部署
-
成本低
常用功能
-
静态资源部署
-
Rewrite地址重写
-
反向代理
-
负载均衡
-
缓存
-
环境部署
二 安装
通过yum安装
-
安装yum-utils
sudo yum install yum-utils
-
添加/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
-
安装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
信号方式
-
将旧版本的nginx二进制文件备份为nginxold
-
将新版本的nginx二进制文件拷贝到sbin目录下
-
kill -USR2 旧版本的nginx的master进程id
-
kill -QUIT 旧版本的nginx的master进程id
命令方式
-
将旧版本的nginx二进制文件备份为nginxold
-
将新版本的nginx二进制文件拷贝到sbin目录下
-
退回到新版本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获取第一个括号内的值
匹配顺序:
-
精准匹配
-
通配符在首部
-
通配符在尾部
-
正则表达式
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;
}