目录
一、Nginx概述
二、安装Nginx
三、信号与平滑升级
分割日志
平滑升级
四、配置信息
全局配置
关闭版本
修改启动进程数
cpu和work进程绑定
pid路径
nginx进程优先级
work进程打开的文件的个数
event事件
http设置
server块构建虚拟主机
alias别名
location
验证模块
自定义错误页面
检测文件是否存在
作为下载服务器
用户上传资料
高级配置
网页的状态页
变量
自定义访问日志
Nginx压缩
自定义图标
rewrite重写功能
rewrite跳转实现
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有编译安装和yum安装两种方式,主要着重介绍编译安装方式,因为编译安装可以自定义下载最新的nginx安装包,而yum安装是在网络仓库源安装,不一定是最新版的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 命令支持向其发送信号,实现不同功能
-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序号:
CPU MASK: 00000001:0号CPU
00000010:1号CPU
................
10000000:7号CPU
worker_cpu_affinity 00000001 00000010 00000100 00001000;第0号---第3号CPU
#序号绑定cpu 亲缘性
可以自行设置pid保存位置
当你想将nginx的work进程的优先级调高 可以使用nice设置
nice的优先级是 -20 到 19
先查看默认优先级,一般默认优先级为0
修改配置文件
重新加载后再查看进程优先级
修改配置文件里打开进程数
同时在limit里也修改,不然不会生效
重新加载后查看
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 是一个大的语句块,包含若干个小的语句块(比如server语句块)
类似
http {
...
... #各server的公共配置
server { #每个server用于定义一个虚拟主机,第一个server为默认虚拟服务器
...
}
server {
...
server_name #虚拟主机名
root #主目录
alias #路径别名
location [OPERATOR] URL { #指定URL的特性
...
if CONDITION {
...
}
}
}
}
【基于域名】
设置子配置文件的位置
创建并配置好子配置文件
创建配置文件中的主页名
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
}
}
在一个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为任意请求报文首部字段,表示记录请求报文的首部字段
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为任意请求报文首部字部cookie的key名$http_
//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的对应的首部字段名需要为小写,如果有横线需要替换为下划线,此变量有问题
echo $sent_http_server;$arg_
//此变量存放了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;# 其他配置项...
}
配置指令
#启用或禁用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功能就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标记位实现URL重写以及重定向。 比如:更换域名后需要保持旧的域名能跳转到新的域名上、某网页发生改变需要跳转到新的页面、网站防盗链等等需求。
rewrite只能放在server{},location{},if{}中,并且默认只能对域名后边的除去传递的参数外的字符串起作用, 例如 www.liusy.com/abc/bbs/ind… 只对/abc/bbs/index.php重写。
Nginx:通过ngx_http_rewrite_module 模块支持URL重写、支持if条件判断,但不支持else 跳转:从一个 location跳转到另一个location,循环最多可以执行10次,超过后nginx将返回500错误
语法格式
rewrite
[flag]; regex :表示正则匹配规则。 replacement :表示跳转后的内容。 flag :表示 rewrite 支持的 flag 标记。
###flag标记说明###last :本条规则匹配完成后,不终止重写后的url匹配,一般用在 server 和 if 中。 break :本条规则匹配完成即终止,终止重写后的url匹配,一般使用在 location 中。 redirect :返回302临时重定向,浏览器地址会显示跳转后的URL地址。 permanent :返回301永久重定向,浏览器地址栏会显示跳转后的URL地址。