目录
一、Nginx概述
Nginx 是一个高性能的 Web 和反向代理服务器,它具有很多非常优越的特性
作为 Web 服务器: 相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。一个Nginx 实例能够轻松支持高达 50 000 个并发连接数的响应。
作为负载均衡服务器: Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP 代理服务器对外进行服务。Nginx用 C编写,不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好得多。
作为邮件代理服务器: Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器),Last.fm 描述了成功并且美妙的使用经验。
Nginx 安装非常简单,配置文件非常简洁(还能够支持 Perl 语法),Bug 非常少。Nginx 启动特别容易,并且几乎可以做到 7x24 不间断运行,即使运行数个月也不需要重新启动。你还能够在不间断服务的情况下进行软件版本的升级。
二、安装Nginx
在虚拟机里安装nginx有编译安装和yum安装两种方式,主要着重介绍编译安装方式,因为编译安装可以自定义下载最新的nginx安装包,而yum安装是在网络仓库源安装,不一定是最新版的nginx
首先安装依赖包
查看最新安装包
新建nginx用户
下载软件包
编译安装
修改nginx权限并查看具体文件信息
各文件作用
-
conf:保存nginx所有的配置文件,其中nginx.conf是nginx服务器的最核心最主要的配置文件,其他的.conf则是用来配置nginx相关的功能的,例如fastcgi功能使用的是fastcgi.conf和fastcgi_params两个文件,配置文件一般都有个样板配置文件,是文件名.default结尾,使用的使用将其复制为并将default去掉即可。
-
html目录中保存了nginx服务器的web文件,但是可以更改为其他目录保存web文件,另外还有一个50x的web文件是默认的错误页面提示页面。
-
logs:用来保存nginx服务器的访问日志错误日志等日志,logs目录可以放在其他路径,比如/var/logs/nginx里面。
-
sbin:保存nginx二进制启动脚本,可以接受不同的参数以实现不同的功能。
启动nginx
三、信号与平滑升级
nginx 命令支持向其发送信号,实现不同功能
-v : show version and exit
小写字母“v”:显示版本并退出
-V : show version and configure options then exit
大写字母“V”:显示版本和配置选项并退出
-t : test configuration and exit
小写字母“t”:测试配置并退出
-T : test configuration, dump it and exit
大写字母“T”:测试配置并将其转储然后退出,一般使用不多,大部分还是使用 “t” 检测配置-q : suppress non-error messages during configuration testing
小写字母“q”:在配置期间抑制非错误消息
-s signal : send signal to a master process: stop, quit, reopen, reload
向主进程发送信号,包括(停止,退出,开启,重新加载等)
-p prefix : set prefix path (default: /etc/nginx/)
设置前缀路径-e filename : set error log file (default: /var/log/nginx/error.log)
设置错误日志文件-c filename : set configuration file (default: /etc/nginx/nginx.conf)
设置配置文件-g directives : set global directives out of configuration file
从配置文件中设置全局指令
分割日志
首先查看原来日志所在位置
将原来成功日志改名后重新新建原来名字日志
设置分割日志
使用另一台服务器访问nginx服务器
新建日志里有最新的访问记录
在旧日志文件里再重新访问看是否生成日志
最新访问时间的日志已经不生成在旧日志文件里了
平滑升级
首先查看原来nginx版本
下载更新版本安装包并解压
编译安装nginx-1.20.2
【注意在编译安装时只要make -j2(两核编译)不要make install】
将原来低版本nginx主程序改名,并将新版本nginx主程序拷贝进去
优雅关闭老版本worker进程
重新查看现在nginx版本
平滑升级结束
四、配置信息
nginx 官方帮助文档:nginx documentation
Nginx的配置文件的组成部分:
主配置文件:nginx.conf
子配置文件: include conf.d/*.conf
全局配置
关闭版本
先查看nginx软件版本
修改配置文件
重启nginx后查看
修改启动进程数
修改配置
worker_processes 1;
#允许的启动工作进程数数量,和你真实的cpu数量有关 1worker_processes auto;
#如果设置为auto 就是你真实的cpu数量
修改后重新加载再查看进程
cpu和work进程绑定
CPU序号:
CPU MASK: 00000001:0号CPU
00000010:1号CPU
................
10000000:7号CPU
worker_cpu_affinity 00000001 00000010 00000100 00001000;第0号---第3号CPU
#序号绑定cpu 亲缘性
pid路径
可以自行设置pid保存位置
nginx进程优先级
当你想将nginx的work进程的优先级调高 可以使用nice设置
nice的优先级是 -20 到 19
先查看默认优先级,一般默认优先级为0
修改配置文件
重新加载后再查看进程优先级
work进程打开的文件的个数
修改配置文件里打开进程数
同时在limit里也修改,不然不会生效
重新加载后查看
event事件
events {
worker_connections 65536; #设置单个工作进程的最大并发连接数
use epoll;
#使用epoll事件驱动,Nginx支持众多的事件驱动,比如:select、poll、epoll,只能设置在events模块中设置。
accept_mutex on;
#on为同一时刻一个请求轮流由work进程处理,而防止被同时唤醒所有worker,避免多个睡眠进程被唤醒的设置,默认为off,新请求会唤醒所有worker进程,此过程也称为"惊群",因此nginx刚安装完以后要进行适当的优化。建议设置为on
multi_accept on;
#ON时Nginx服务器的每个工作进程可以同时接受多个新的网络连接,此指令默认为off,即默认为一个工作进程只能一次接受一个新的网络连接,打开后几个同时接受多个。建议设置为on
}
http设置
http 是一个大的语句块,包含若干个小的语句块(比如server语句块)
类似
http {
...
... #各server的公共配置
server { #每个server用于定义一个虚拟主机,第一个server为默认虚拟服务器
...
}
server {
...
server_name #虚拟主机名
root #主目录
alias #路径别名
location [OPERATOR] URL { #指定URL的特性
...
if CONDITION {
...
}
}
}
}
server块构建虚拟主机
【基于域名】
设置子配置文件的位置
创建并配置好子配置文件
创建配置文件中的主页名
alias别名
server {
listen 80;
server_name www.kgc.com;
location /nwes {
root /data/nginx/html/pc/;
#相当于追加 将 文件夹news追加到/data/nginx/html/pc/news
}
location /study{
alias /mnt/nginx/sports/;
#相当于替换 你访问 study 就是访问/mnt/nginx/sports
}
}
location
在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;ngnix会根据用户请求的URI来检查定义的所有location,按一定的优化级找出一个最佳匹配,而后应用其配置在没有使用正则表达式的时候,nginx会先在server中的多个location选取匹配度最高的一个uri,uri是用户请求的字符串,即域名后面的web文件路径,然后使用该location模块中的正则url和字符串,如果匹配成功就结束搜索,并使用此location处理此请求。
语法规则:
location [ = | ~ | ~* | ^~ ] uri { ... }
= #用于标准url前,需要请求字串与uri精确匹配,大小敏感,如果匹配成功就停止向下匹配并立即处理请求
^~ #用于标准url前,表示包含正则表达式,并且匹配以指定的正则表达式开头,对URI的最左边部分做匹配检查,不区分字符大小写
~ #用于标准url前,表示包含正则表达式,并且区分大小写
~* #用于标准url前,表示包含正则表达式,并且不区分大写
不带符号 #匹配起始于此uri的所有的uri
#\ #用于标准url前,表示包含正则表达式并且转义字符。可以将 . * ?等转义为普通符号
优先级排序
= 【精确查找】
^~【指定开头】
~ 【区分大小写】
~*【不区分大小写】
【不添加服务】
实例
location = / {
[ configuration A ]
}
location / {
[ configuration B ]
}
location /documents/ {
[ configuration C ]
}
location ^~ /images/ {
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
[ configuration E ]
}
访问路径是 /
访问路径是 /index.html
访问路径是 /documents/document.html
访问路径是 /images/1.gif
访问路径是 /documents/1.jpg
验证模块
首先安装加密软件
设置文件密码
查看文件
在虚拟机内置浏览器里访问文件,可以登录账号
自定义错误页面
错误页面格式
error_page code ... [=[response]] uri;
页面错误代码
error_page 固定写法
code 响应码
= 可以将响应码转换
uri 访问连接
检测文件是否存在
try_files会按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如果所有文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。只有最后一个参数可以引起一个内部重定向,之前的参数只设置内部URI的指向。最后一个参数是回退URI且必须存在,否则会出现内部500错误。
语法格式
Syntax: try_files file ... uri;
try_files file ... =code;
Default: —
Context: server, locationwww.baidu.com/test
作为下载服务器
[root@localhost nginx-1.18.0]#./configure --help |grep auto
#自带
--without-http_autoindex_module disable ngx_http_autoindex_module
autoindex on | off;
#自动文件索引功能,默为off
autoindex_exact_size on | off;
#计算文件确切大小(单位bytes),off 显示大概大小(单位K、M),默认on
autoindex_localtime on | off ;
#显示本机时间而非GMT(格林威治)时间,默认off
autoindex_format html | xml | json | jsonp;
#显示索引的页面文件风格,默认html
limit_rate rate;
#限制响应客户端传输速率(除GET和HEAD以外的所有方法),单位B/s,即bytes/second,默认值0,表示无限制,此指令由ngx_http_core_module提供
set $limit_rate
#变量提供 限制 变量优先级高
实例
[root@centos8 ~]# mkdir /opt/download
#注意:download不需要index.html文件
location /download {
autoindex on;
#开启下载服务器
autoindex_exact_size on;
#开启确切大小不建议开启
autoindex_localtime on;
#使用当地时间
limit_rate 1024k;
#所有人限速1024k,默认单位是字节数
set $limit_rate 2M;
#谁先生效
alias /opt/download;
}
直接访问页面
location /download {
autoindex on;
}
location /download {
autoindex on;
autoindex_exact_size on;
autoindex_localtime on;
limit_rate 1024k;
alias /opt/download;
}
用户上传资料
client_max_body_size 1m;
#设置允许客户端上传单个文件的最大值,默认值为1m,上传文件超过此值会出413错误
client_body_buffer_size size;
#用于接收每个客户端请求报文的body部分的缓冲区大小;默认16k;超出此大小时,其将被暂存到磁盘上的由下面client_body_temp_path指令所定义的位置
client_body_temp_path path [level1 [level2 [level3]]];
#设定存储客户端请求报文的body部分的临时存储路径及子目录结构和数量,目录名为16进制的数字,使用hash之后的值从后往前截取1位、2位、2位作为目录名上传文件大于限制 错误代码413
高级配置
网页的状态页
#配置示例:
location /nginx_status {
#stub_status;
auth_basic "auth login";
auth_basic_user_file /apps/nginx/conf/.htpasswd;
allow 192.168.0.0/16;
allow 127.0.0.1;
deny all;
}
while : ;do ab -c 1000 -n 10000 http://192.168.91.100/;sleep 1;done
#压力测试 模拟高链接[root@localhost ~]#curl http://www.kgc.com/nginx_status 2>/dev/null |awk '/Reading/{print $2,$4,$6}'
#
[root@localhost ~]#curl http://用户名:密码@www.kgc.com/nginx_status 2>/dev/null |awk '/Reading/{print $2,$4,$6}'#curl http://www.pc.com/status 2> /dev/null |awk '/Reading/{print $2,$4,$6}'
变量
内置变量
$remote_addr;
//存放了客户端的地址,注意是客户端的公网IP
$proxy_add_x_forwarded_for
//此变量表示将客户端IP追加请求报文中X-Forwarded-For首部字段,多个IP之间用逗号分隔,如果请求中没有X-Forwarded-For,就使用$remote_addrthe “X-Forwarded-For” client request header field with the $remote_addr variable appended to it, separated by a comma. If the “X-Forwarded-For” field is not present in the client request header, the $proxy_add_x_forwarded_for variable is equal to the $remote_addr variable.
客户机 代理1 代理2 nginx服务器
$proxy_add_x_forwarded_for: 在代理1 上存的是 客户机的ip
$proxy_add_x_forwarded_for: 在代理2 上存的是 客户机的ip,代理1的ip 用逗号隔开
$proxy_add_x_forwarded_for: nginx 上存的是 客户机的ip,代理1的ip,代理2的ip$args;
//变量中存放了URL中的参数,例如:http://www.kgc.org/main/index.do?id=20190221&partner=search
//返回结果为: id=20190221&partner=search 存放的就是这个
$document_root;
//保存了针对当前资源的请求的系统根目录,例如:/apps/nginx/html。$document_uri;
//保存了当前请求中不包含参数的URI,注意是不包含请求的指令,比
如:http://www.kgc.org/main/index.do?id=20190221&partner=search会被定义为/main/index.do
//返回结果为:/main/index.do
$host;
//存放了请求的host名称
limit_rate 10240;
echo $limit_rate;
//如果nginx服务器使用limit_rate配置了显示网络速率,则会显示,如果没有设置, 则显示0
$remote_port;
//客户端请求Nginx服务器时随机打开的端口,这是每个客户端自己的端口$remote_user;
//已经经过Auth Basic Module验证的用户名$request_body_file;
//做反向代理时发给后端服务器的本地资源的名称$request_method;
//请求资源的方式,GET/PUT/DELETE等$request_filename;
//当前请求的资源文件的磁盘路径,由root或alias指令与URI请求生成的文件绝对路径,如:/apps/nginx/html/main/index.html$request_uri;
//包含请求参数的原始URI,不包含主机名,相当于:$document_uri?$args,例如:/main/index.do?id=20190221&partner=search$scheme;
//请求的协议,例如:http,https,ftp等$server_protocol;
//保存了客户端请求资源使用的协议的版本,例如:HTTP/1.0,HTTP/1.1,HTTP/2.0等$server_addr;
//保存了服务器的IP地址$server_name;
//请求的服务器的主机名$server_port;
//请求的服务器的端口号$http_<name>
//name为任意请求报文首部字段,表示记录请求报文的首部字段
arbitrary request header field; the last part of a variable name is the field name converted to lower case with dashes replaced by underscores
//用下划线代替横线
//示例: echo $http_User_Agent;$http_user_agent;
//客户端浏览器的详细信息$http_cookie;
//客户端的cookie信息
$cookie_<name>
//name为任意请求报文首部字部cookie的key名$http_<name>
//name为任意请求报文首部字段,表示记录请求报文的首部字段,ame的对应的首部字段名需要为小写,如果有
横线需要替换为下划线
arbitrary request header field; the last part of a variable name is the field
name converted to lower case with dashes replaced by underscores //用下划线代替横线
//示例:
echo $http_user_agent;
echo $http_host;
$sent_http_<name>
//name为响应报文的首部字段,name的对应的首部字段名需要为小写,如果有横线需要替换为下划线,此变量有问题
echo $sent_http_server;$arg_<name>
//此变量存放了URL中的指定参数,name为请求url中指定的参数
//对比 变量 $arg 是全部, 如果 要id 如下
echo $arg_id;
自定义变量
Syntax: set $variable value;
Default: —
Context: server, location, if
自定义访问日志
1、满足特定需求:通过自定义访问日志,你可以选择记录特定的访问信息,如客户端IP地址、访问时间、请求内容、状态码、传输字节数、引用页面、用户代理等。这些信息可以根据你的需求进行自定义,以满足特定的分析、监控或统计需求。
2、减少日志量:默认情况下,Nginx 记录的访问日志较为详细,包含了大量的信息。而自定义访问日志可以让你只记录感兴趣的信息,避免产生过多的日志数据,减少磁盘空间和读写开销。
3、提高性能:自定义访问日志可以减少磁盘的写入操作,从而减小对系统性能的影响。尤其在高访问量的情况下,减少日志量可以提高系统的处理能力和响应速度。
4、日志分析与监控:自定义访问日志可以使日志数据更易于分析和监控。你可以根据自定义的格式,使用各种日志分析工具或脚本,提取有用的信息,进行访问分析、安全审计、性能优化等工作。
http {
# 定义自定义访问日志格式
log_format my_custom_log '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent"';# 配置使用自定义访问日志格式的访问日志文件
access_log /path/to/custom_access.log my_custom_log;# 其他配置项...
}
Nginx压缩
配置指令
#启用或禁用gzip压缩,默认关闭
gzip on | off;
#压缩比由低到高从1到9,默认为1
gzip_comp_level level;
#禁用IE6 gzip功能
gzip_disable "MSIE [1-6]\.";
#gzip压缩的最小文件,小于设置值的文件将不会压缩
gzip_min_length 1k;
#启用压缩功能时,协议的最小版本,默认HTTP/1.1
gzip_http_version 1.0 | 1.1;
#指定Nginx服务需要向服务器申请的缓存空间的个数和大小,平台不同,默认:32 4k或者16 8k;
gzip_buffers number size;
#指明仅对哪些类型的资源执行压缩操作;默认为gzip_types text/html,不用显示指定,否则出错
gzip_types mime-type ...;
#如果启用压缩,是否在响应报文首部插入“Vary: Accept-Encoding”,一般建议打开
gzip_vary on | off;
#预压缩
gzip_static on | off;
#重启nginx并进行访问测试压缩功能
[root@centos8 ~]# cp /apps/nginx/logs/access.log /data/nginx/html/pc/m.txt
[root@centos8 ~]# echo "test" > /data/nginx/html/pc/test.html #小于1k的文件测试是否
会压缩
[root@centos8 ~]# vim /apps/nginx/conf/nginx.conf
gzip on;
gzip_comp_level 5;
gzip_min_length 1k;
gzip_types text/plain application/javascript application/x-javascript text/css
application/xml text/javascript application/x-httpd-php image/gif image/png;
gzip_vary on;
#重启Nginx并访问测试:
[root@centos8 ~]# curl --head --compressed 192.168.91.100/test.html
HTTP/1.1 200 OK
Server: nginx
Date: Fri, 22 Feb 2019 01:52:23 GMT
Content-Type: text/html
Last-Modified: Thu, 21 Feb 2019 10:31:18 GMT
Connection: keep-alive
Keep-Alive: timeout=65
Vary: Accept-Encoding
ETag: W/"5c6e7df6-171109"
Content-Encoding: gzip #压缩传输
#验证不压缩访问的文件大小:
自定义图标
#方法一:服务器不记录访问日志:
location = /favicon.ico {
log_not_found off;
access_log off;
}
#方法二:将图标保存到指定目录访问:
#location ~ ^/favicon\.ico$ {
location = /favicon.ico {
root /data/nginx/html/pc/images;
expires 365d; #设置文件过期时间
}
rewrite重写功能
rewrite功能就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标记位实现URL重写以及重定向。 比如:更换域名后需要保持旧的域名能跳转到新的域名上、某网页发生改变需要跳转到新的页面、网站防盗链等等需求。
rewrite只能放在server{},location{},if{}中,并且默认只能对域名后边的除去传递的参数外的字符串起作用, 例如 www.liusy.com/abc/bbs/ind… 只对/abc/bbs/index.php重写。
rewrite跳转实现
Nginx:通过ngx_http_rewrite_module 模块支持URL重写、支持if条件判断,但不支持else 跳转:从一个 location跳转到另一个location,循环最多可以执行10次,超过后nginx将返回500错误
语法格式
rewrite <regex> <replacement> [flag]; regex :表示正则匹配规则。 replacement :表示跳转后的内容。 flag :表示 rewrite 支持的 flag 标记。
###flag标记说明###last :本条规则匹配完成后,不终止重写后的url匹配,一般用在 server 和 if 中。 break :本条规则匹配完成即终止,终止重写后的url匹配,一般使用在 location 中。 redirect :返回302临时重定向,浏览器地址会显示跳转后的URL地址。 permanent :返回301永久重定向,浏览器地址栏会显示跳转后的URL地址。