一、下载安装
安装方式
1.yum
2.源码包:
2.1直接安装
2.2编译安装
Nginx 编译安装参数
nginx -V
nginx version: nginx/1.14.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
======================================基本配置===========================================
configure arguments: 配置参数./configure --help查询帮助
--prefix=/etc/nginx 安装路径
--sbin-path=/usr/sbin/nginx 程序文件
--modules-path=/usr/lib64/nginx/modules 模块路径
--conf-path=/etc/nginx/nginx.conf 主配置文件
--error-log-path=/var/log/nginx/error.log 错误日志
--http-log-path=/var/log/nginx/access.log 访问日志
--pid-path=/var/run/nginx.pid 程序ID
--lock-path=/var/run/nginx.lock 锁路径,防止重复启动nginx
--http-client-body-temp-path=/var/cache/nginx/client_temp 缓存
--http-proxy-temp-path=/var/cache/nginx/proxy_temp 代理缓存
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp php缓存
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp python缓存
--http-scgi-temp-
path=/var/cache/nginx/scgi_temp
--with-compat 启用动态模块兼容性
--user=nginx 用户
--group=nginx 组
==========================================模块类=========================================
--with-file-aio 就是异步非阻塞
(使用nginx的aio特性会大大提高性能,比如图片站的特点是大量的读io操作,nginx aio不用等待每次io的结果,有助于并发处理大量io和提高nginx处理效率。
aio的优点就是能够同时提交多个io请求给内核,然后直接由内核的io调度算法去处理这些请求(directio),这样的话,内核就有可能执行一些合并,节约了读取文件的处理时间。)
--with-threads 多线程模块
--with-http_addition_module 响应之前或者之后追加文本内容,比如想在站点底部追加一
个js广告或者新增的css样式
--with-http_auth_request_module 认证模块
--with-http_dav_module 增加上传PUT,DELETE,MKCOL:创建集合,COPY和MOVE方法)默
认情况下为关闭
--with-http_flv_module NGINX 添加MP4、FLV视频支持模块
--with-http_gunzip_module 压缩模块
--with-http_gzip_static_module 另一个压缩模块
--with-http_mp4_module 多媒体模块
--with-http_random_index_module nginx显示随机首页模块
--with-http_realip_module Nginx获取真实IP模块
--with-http_secure_link_module nginx安全下载模块
--with-http_slice_module nginx中文文档
--with-http_ssl_module 安全模块
--with-http_stub_status_module 访问状态
--with-http_sub_module nginx替换网站响应内容
--with-http_v2_module
--with-mail 邮件客户端
--with-mail_ssl_module
--with-stream
负载均衡模块。nginx从1.9.0开始,新增加了一个stream模块,用来实现四层协议的转发、代
理或者负载均衡等。
--with-stream_realip_module
--with-stream_ssl_module
--with-stream_ssl_preread_module
=======================================CPU优化参数=======================================
--with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --
param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC'
--with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'
二、基本配置认识
/etc/logrotate.d/nginx 日志轮转
/etc/nginx/nginx.conf 总配置文件(各大主要模块配置位置)
/etc/nginx/conf.d/*.conf 子配置文件夹(通常情况新的server模块一般配在子配文件)
/etc/nginx/conf.d/default.conf 默认的网站配置文件(某些老版本可能将内容直接配置在主 配,会没有这个文件)
/etc/nginx/koi-utf 字符集,文件编码
/etc/nginx/mime.types 文件关联程序 网站文件类型 和 相关处理程序
/etc/nginx/modules 模块文件夹。第三方模块
/usr/sbin/nginx-debug nginx调试程序
/usr/lib/systemd/system/nginx-debug.service nginx调试程序启动脚本
/usr/lib/systemd/system/nginx.service systemctl 服务脚本
/usr/sbin/nginx Nginx主程序
/usr/share/nginx/html/index.html 默认主页
/usr/lib64/nginx Nginx模块目录
/var/cache/nginx 缓存各种
/var/log/nginx 日志文件夹 ls /var/log/nginx/ access.log error.log
三、基本配置
1.了解nginx.conf文件组成 -------- /etc/nginx/nginx.conf
1.1 全局块
----------------------------------全局块-------------------------------------
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
全局块是Nginx配置文件的开始部分,主要设置一些影响Nginx服务器整体运行的配置指令。
- user:指定Nginx运行的用户和用户组,默认为
nobody
。 - worker_processes:设置工作进程数,通常设置为等于CPU核心数,也可以设置为
auto
自动 匹配CPU核心数。 - error_log:设置错误日志的存放路径和日志级别。
- pid:指定Nginx进程的PID文件存放位置。
1.2 events块(配置高并发的模块)
--------------------------------events块----------------------------------
events {
worker_connections 1024;
}
events块主要影响Nginx服务器与用户的网络连接。
- worker_connections:设置每个工作进程的最大连接数。
- multi_accept:设置是否允许同时接受多个网络连接。
- use:设置事件驱动模型,常见的有
epoll
、kqueue
等。
1.3 http块
-------------------------------------http块----------------------------------
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 4096;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf; * 包含子配置的文件夹
------------------server块----------------------
server {
listen 80;
listen [::]:80;
server_name _;
root /usr/share/nginx/html;
include /etc/nginx/default.d/*.conf;
error_page 404 /404.html;
location = /404.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
}
http块是Nginx配置中最频繁的部分,包含了代理、缓存、日志定义等绝大多数功能和第三方模块的配置。
- sendfile:设置是否使用sendfile方式传输文件,以提高传输效率。
tcp_nopush :
on开启时会设置调用tcp_cork方法(默认的),结果就是数据包不会马上传送出去,等到数据包最大时,一次性的传输出去,有助于解决网络堵塞,提高效率,但浪费网络资源(默认关闭)。tcp_nodelay :
这个指令用于控制TCP_NODELAY选项(延时发送ACK包)。- keepalive_timeout:设置连接的保持时间。
types_hash_max_size:
这个指令用于设置MIME类型哈希表的最大大小- include:引入其他配置文件,使得配置更加模块化。
- default_type:设置默认的MIME类型。
- mime.types:包含文件扩展名与MIME类型的映射。
- log_format:定义日志格式,用于指定访问日志的格式。
- access_log:指定访问日志的存放路径和使用的格式。
每个http块可以包括多个server块,每个server块相当于一个虚拟主机。
- listen:设置监听的端口和地址。
- server_name:设置虚拟主机的名称或IP地址。
- location:基于Nginx服务器接收到的请求字符串对特定的请求进行处理。可以定义多个location块,每个块都有自己的匹配规则和处理方式。
四、简单使用
0.基本命令及选项
0.1 显示帮助信息
- 命令:
nginx -h
或nginx --help
- 作用:显示Nginx的帮助信息,包括可用的命令行选项和简短的描述。
0.2 显示版本信息
- 命令:
nginx -v
- 作用:显示Nginx的版本信息。
0.3 显示版本信息和编译配置项
- 命令:
nginx -V
(注意是大写的V)- 作用:显示Nginx的版本信息以及编译时的配置项,这对于了解Nginx的功能和性能特性很有帮助。
0.4 检查测试配置文件
- 命令:
nginx -t
- 作用:检查Nginx的配置文件(通常是nginx.conf)是否有语法错误。如果配置文件没有问题,会显示“syntax is ok”和“test is successful”的消息。
若重启nginx失败,需检查是否配置文件语法错误,若语法无误,则检查是否nginx端口被占
0.5 检查测试配置文件并输出内容
- 命令:
nginx -T
- 作用:与
-t
选项类似,但-T
还会在终端输出配置文件的完整内容,这有助于在检查配置时快速定位问题。
0.6 向主进程发送信号
- 命令:
nginx -s signal
- signal 可以是以下之一:
stop
、quit
、reopen
、reload
。
stop
:快速关闭Nginx,不等待工作进程完成处理请求。quit
:平稳关闭Nginx,等待工作进程完成请求处理后再退出。reopen
:重新打开日志文件(通常用于日志轮转)。reload
:重新加载配置文件,如果配置文件有更改,Nginx将应用新的配置并启动新的工作进程,同时优雅地关闭旧的工作进程。
0.7 指定配置文件路径
- 命令:
nginx -c filename
- 作用:使用指定的配置文件启动Nginx,而不是默认的nginx.conf文件。
0.8 指定前缀路径
- 命令:
nginx -p prefix
- 作用:设置Nginx的配置文件、日志文件等文件的前缀路径。默认路径通常是
/usr/local/nginx
或/etc/nginx
,具体取决于Nginx的安装方式和操作系统。0.9 启动时指定全局配置项
- 命令:
nginx -g directives
- 作用:在Nginx启动时指定全局配置项,而不需要修改配置文件。这些配置项以“key=value”的形式提供,并且可以在命令行中指定多个配置项。这种方式通常不用于生产环境,因为它可能会与配置文件中的设置发生冲突。
1.nginx默认html文件
/usr/share/nginx/html/index.html
2.简单写一个网页
2.1创一个目录
2.2在目录里写一个html文件
2.3写nginx配置
server {
listen 80;
server_name gcqlinux.com; *域名,用于区别网站服务器,不可写IP
location / { *前端页面在根下
root /gcqlinux; *在根下的gcqlinux目录
index index.html; *里的index.html页面
}
}
修改配置文件需要重启nginx
2.4域名解析
2.5浏览器访问
2.6自定义404
error_page 404 /404.html; 指定404页面
/var/log/nginx/access.log & error.log
五、日志
1.日志模块
log_format main :' $remote_addr(客户端IP) -(占位符) $remote_user(用户端用户) [$time_local](本地时间) "$request"(请求URL) ' ' $status(状态:200/404/403) $body_bytes_sent(字节数大小) "$http_referer"(引用/链接地址) ' ' "$http_user_agent"(用户代理器) "$http_x_forwarded_for"(代理ip,转发地址)';
2.日志缓存
(默认关闭)open_log_file_cache max=1000 inactive=20s min_user=3 valid=1m;
-
max=1000
:参数指定了缓存中最多可以存储1000个文件描述符和文件信息(即fd句柄最大为1000)。 -
inactive=20s
:如果文件在20秒内没有被访问,它的缓存信息可能会被视为非活动的,并且可能会被清除(缓存时间)。 -
min_uses=3
:参数指定了一个文件只有在被写入至少3次后,它的缓存信息才会被视为活跃的(即写入次数)。 -
valid=1m
:这个参数指定了缓存信息的有效时间为1m。在这个时间内,如果文件没有被修改(即其inode没有改变),那么Nginx将认为缓存中的信息仍然有效,并且不会重新读取文件的状态信息。
3.日志轮转/切割
3.1轮转规则
需要修改日志轮转规则前往: /etc/logrotate.d/nginx
/var/log/nginx/*.log {
create 0640 nginx root 创 权 主 组
daily 天
rotate 10 保留份数
missingok 丢失不提示
notifempty 空文件不轮转
compress 压缩
delaycompress 延迟压缩
sharedscripts 轮转后脚本
--------------日志轮转后执行的脚本--------------
postrotate
/bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
endscript
*向Apache HTTP服务器发送一个USR1信号将导致以下步骤的发生:停止接受新的连接,等待当前连接停止,重新载入配置文件,重新打开日志文件,重启服务器,从而实现相对平滑的不关机的更改*
}
-
create 0640 nginx root
:在日志文件被旋转并删除后,如果需要创建新的日志文件,则设置新文件的权限为0640
(即所有者拥有读写权限,组用户拥有读权限,其他用户没有任何权限),文件的所有者设置为nginx
用户,所属组设置为root
组。 -
daily
:指定日志文件每天进行一次旋转。即每天生成一个新的日志文件,旧的日志文件会被移动并可能进行压缩。 -
rotate 10
:保留10个备份文件。即在进行日志旋转时,旧文件会被重命名并保存,最多保留10个旧文件,超过的会被删除。 -
missingok
:如果日志文件丢失,不报错继续下一个文件的处理。这可以防止在日志文件丢失时,logrotate
工具报错并停止处理后续日志文件。 -
notifempty
:如果日志文件为空,不进行旋转。这可以避免生成空的日志文件备份。 -
compress
:通过gzip压缩旧的日志文件。这有助于节省存储空间。 -
delaycompress
:不立即压缩旋转后的旧日志文件,而是在下一次旋转时才压缩。这意味着,除了最新的日志文件外,其他的都被压缩。 -
sharedscripts
:在多个日志文件被处理时,只执行一次postrotate
和endscript
中的脚本。这通常用于当你想要对一组日志文件执行统一的后续操作时。 -
postrotate
...endscript
:在日志文件旋转后执行的脚本。
4.日志分析
4.1常用字段(变量)
$remote_addr $1 远程客户端地址
$time_local $4 本机时间
$request $7 请求URL
$status $9 状态码
$body_bytes_sent $10 请求体积
4.2实际使用(搭配shell使用)
例1 : (统计2024.6.27当天PV量)
cat secure-20240627 | grep $10 <=10k | wc -l
列出 日志secure-20240627 ,然后过滤出请求体积小于等于10k的日志,然后将符合条件的日志数量列出
例2:(统计2024年7月17日 各种状态码数量)
grep '17/Jul/2024' access.log | awk '{code[$9]++} END{for(i in code){print i,code[i]}}'
过滤 日志access.log 里包含 '17/Jul/2024' 的行 , 使用 awk
来处理 grep
的输出,对于每一行 awk
都会执行 {code[$9]++}
,这会将第九个字段的值作为数组code
的索引,并将该索引对应的值增加1(计算次数),在处理完所有行后awk
会执行END
块中的代码:for(i in code){print i,code[i]}
会遍历code
数组,并打印出每个索引(即$9的值)及其对应的计数
六、Nginx Web模块
1.连接状态
检查是否下载该模块 nginx -V 2>&1 | grep stub_status
server {
location /nginx_status {
stub_status;
allow all;
}
}
访问 192.168.105.71/nginx_status 可见
tcp是连接 http是请求
2.随机主页
检查是否下载该模块 nginx -V 2>&1 | grep random_index_module
server {
location / {
#root /gcqlinux;
#index index.html;
-------------模块写在server模块的location里-----------------
root /app; * 路径
random_index on; * 开启随机多主页
}
}
3.替换模块
检查是否下载该模块 nginx -V 2>&1 | grep sub_module
server {
listen 80;
listen [::]:80;
server_name _;
root /usr/share/nginx/html;
---------------启用替换模块-------------------
sub_filter gcqlinux "GQ"; * 将 gcqlinux 替换成 GQ
sub_filter_once off; * 仅替换一次(关)
}
配置在server块里
4.文件读取
位于http模块
http {
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log /var/log/nginx/access.log main;
---------------------文件读取模块-----------------------
sendfile on; * 一种高效的IO传输方式
tcp_nopush on; * 通过减少包的数量来提高效率
tcp_nodelay on; * 通过减少TCP的延迟来提高响应速度
--------------------------------------------------------
#keepalive_timeout 65;
#types_hash_max_size 4096;
}
5.文件压缩
主配置文件http模块里
http {
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log /var/log/nginx/access.log main;
----------------------------开启压缩模块-------------------------------
gzip on; * 开启压缩
gzip_http_version 1.1; * 版本协议
gzip_comp_level 2; * 压缩级别(1-9)1最快压缩率最低,9最慢压缩率最大
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
* 需要压缩的内容类型
gzip_static on; * 静态压缩(开)
}
6.页面缓存
配置在 location 里
location / {
root /gcqlinux;
index index.html;
----------------页面缓存开启------------------------
expires 24h; * 该页面缓存24h,过期需重新请求
}
7.防盗链
--------------------------------------------防盗链&白名单--------------------------------------------------
valid_referers none blocked *.gcqlinux.com server_name 192.168.105.* ~\.google\. ~\.baidu\. ;
-------------------------------------------------------------------------------------------------------------------
if ($invalid_referer){
return 403;
}
解释:valid_referers none blocked *.gcqlinux.com
1.关闭可引用,锁住*(所有的)gcqlinux.com ;
解释:server_name 192.168.105.* ~\.google\. ~\.baidu\.
2.设置白名单:192.168.105网段下的所有ip、以~\.google\. 和 ~\.baidu\. 结尾的域名(可访问)
解释:if ($invalid_referer){
return 403;
}
3.这并不属于防盗链内容,而是设置不被允许访问的ip跳转403
七、Nginx 访问限制(应对泛洪攻击)
7.1 限制请求频率(限流):
定义限制区域:
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; * 1
location {
limit_req zone=addr burst=5 nodelay; * 2
写法:
http {
---------------------------1.-----------------------------------
# 定义请求限制区
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
#limit_req_zone $binary_remote_zone zone=one:10m rate=1r/s; (另一种写法)
-----------------------------------------------------------------
server {
listen 80;
server_name gcqlinux.com;
location / {
-----------------------------2.----------------------------------
# 应用请求限制区,并设置突发请求数和是否延迟处理
limit_req zone=one burst=5 nodelay;
----------------------------------------------------------------
# 其他配置...
}
}
}
7.1.1 limit_conn_zone
指令
定义区域和参数:
limit_conn_zone:
这个指令用于定义一个请求限制区域(one),并设置其参数(如下):$binary_remote_addr
:这是用作键(key)的变量,用于唯一标识请求。这里使用客户端的IP地址的二进制形式,以减少内存占用。$binary_remote_zone
:也是用作键(key)的变量,但并不是 Nginx 内置的标准变量,通常是在某个特定的 Nginx 配置或模块中定义的自定义变量,在标准 Nginx 配置中常见使用的是以$binary_remote_addr
作为键。zone=one:10m
:定义了一个名为one
的区域,并为其分配了10MB的内存。这个内存用于存储请求的计数和频率信息。rate=1r/s
:设置了这个区域中每个唯一键的请求速率限制为每秒1个请求。
7.1.2 limit_req
指令
定义限制请求的频率,限制请求频率
- 防止服务器受到过快的请求攻击(如洪水攻击)或因为过高的请求负载而崩溃。
limit_req
指令通常与limit_req_zone
指令一起使用,后者用于定义限制请求速率的区域和参数。 - 这段代码定义了一个名为
one
的请求限制区域,限制每个IP地址每秒只能发送1个请求,超过后将被限制。burst=5
表示允许超过限制的请求数有5个缓冲,nodelay
表示不延迟处理请求。
7.2 限制并发连接数:
应用连接限制:
http {
limit_conn_zone $binary_remote_addr zone=addr:10m; *
1
location {
limit_conn addr 1; * 2
写法:
http {
--------------------------1.---------------------------
# 定义并发连接限制区
limit_conn_zone $binary_remote_addr zone=addr:10m;
-------------------------------------------------------
server {
listen 80;
server_name gcqlinux.com;
location / {
---------------------------2.----------------------------
# 应用并发连接限制区,并设置最大并发连接数
limit_conn addr 10;
---------------------------------------------------------
# 其他配置...
}
}
}
7.2.1 limit_conn_zone
指令
这个指令用于定义一个请求限制区域(addr)及参数
limit_conn_zone
:指令用于定义一个“连接限制区域”(connection limit zone),它允许您为特定的键(在这个例子中是$binary_remote_addr
,即客户端 IP 地址的二进制形式)设置内存区域和大小。$binary_remote_addr
:是变量,用于唯一标识每个客户端。使用二进制形式可以减少内存使用。zone=addr:10m
:指定了区域的名称为addr
,并为其分配了 10MB 的内存。这个内存用于存储每个键(即每个 IP 地址)的当前并发连接数。limit_conn:
在 server 或 location 块中使用 ,用于应用连接限制。
7.2.2 limit_conn
指令
应用了的连接限制区域 addr
,并设置限制每个IP地址的最大并发连接数为10
limit_conn
指令用于在特定上下文(如location
块)中限制并发连接数。addr
是之前通过limit_conn_zone
指令定义的区域名称。10
是允许的每个键(在这个例子中是每个 IP 地址)的最大并发连接数。
7.3 总结
limit_req:限制的是请求(request)的频率,通常需要在http块使用 limit_req_zone
指令来定义一个限速区域
limit_conn:限制的是并发连接(connection)的数量,同样需要在http块用 limit_conn_zone
指令来定义一个连接限制区域,
八、Nginx 访问控制
8.1基于主机ip
http {
# 创建一个黑名单文件来存储要拒绝的 IP 地址
include blacklist.conf;
server {
listen 80;
server_name gcqlinux.com;
location / {
deny 192.168.1.100; # 拒绝单个 IP 地址
deny 192.168.1.0/24; # 拒绝 IP 地址段
allow all; # 允许所有其他 IP 地址
# 其他配置...
}
}
}
配置语法:
allow address | CIDR | unix:
:允许指定的IP地址、CIDR地址范围或Unix域套接字访问。deny address | CIDR | unix:
:拒绝指定的IP地址、CIDR地址范围或Unix域套接字访问。
注意:allow
和deny
指令是按顺序检查的,一旦匹配到allow
或deny
,就不会再检查后续的指令。因此,在配置时需要注意指令的顺序(即第一个优先级最高)
8.2基于用户
8.2.1 建立认证文件
yum install -y httpd-tools * 安装密钥工具(tool),生成秘钥的工具
由apache提供
htpasswd -cm /etc/nginx/conf.d/passwd user10 * c创造passwd文件、m加密会话密码
htpasswd -m /etc/nginx/conf.d/passwd user20 * m加密会话密码
cat /etc/nginx/conf.d/passwd * 观察口令文件是否生成。已生成
# 口令如下:
user10:$apr1$UE/tLtDM$nVm686kAMYb/ArqQDUi8U/
user20:$apr1$bmn0E/gK$enkXKb2V5uFvUy9wdIHlP.
如果你还没有passwd文件,你可以使用htpasswd工具来创建它,这个命令会创建passwd文件(如果它不存在的话),并提示你为myuser用户输入密码。-c选项表示创建一个新文件。如果你需要添加更多用户到同一个文件,不要使用-c选项,否则它会覆盖现有文件:确保Nginx有权限读取passwd文件
用户(user10)加密(密码)成功 :
8.2.2 启用控制
-
vim /etc/nginx/conf.d/default.conf
auth_basic "nginx access test!";
auth_basic_user_file /etc/nginx/conf.d/passwd;
写法:
location /protected/ {
auth_basic "Welcome!"; * 1
auth_basic_user_file /etc/nginx/conf.d/passwd; * 2
}
- 用户试图访问受保护的资源时,浏览器会弹出一个认证框,标题为“Welcome!”,要求用户输入用户名和密码。
- 指定了存储用户名和密码的文件路径。Nginx将读取这个文件来验证用户输入的用户名和密码是否正确。
设置完毕后用户需输入密码登录访问:
输入用户名/密码,成功访问
不输密码,认证失败: