Nginx基本配置

Nginx配置⽂件

Nginx主配置⽂件 /etc/nginx/nginx.conf 是⼀个纯⽂本类型的⽂件,整个配置⽂件是以 区块 的形式组织的。⼀般,每个 区块以⼀对⼤括号 {} 来表示开始与结束。
1.Main位于nginx.conf配置⽂件的最⾼层
2.Main层下可以有Event、HTTP层
3.HTTP层下⾯有允许有多个 Server层 , ⽤于对不同的⽹站做不同的配置
4.Server层也允许有多个Location, ⽤于对不同的路径进⾏不同模块的配置

//nginx默认配置语法

user  nginx;                      //设置nginx服务的系统使⽤⽤户
worker_processes  auto;            //⼯作进程, 配置和CPU个数保持⼀致

error_log  /var/log/nginx/error.log notice;              //错误⽇志, 后⾯接⼊的是路径
pid        /var/run/nginx.pid;              //Nginx服务启动时的pid

//events事件模块
events {
    worker_connections  1024;        //每个worker进程⽀持的最⼤连接数
    use                                       //内核模型,select,poll,epoll
}

//⾮虚拟主机的配置或公共配置定义在http{}段内, server{}段外
http {
... 
 //必须使⽤虚拟机配置站点, 每个虚拟机使⽤⼀个server{}段
 'server' {
 listen 80; //监听端⼝, 默认80
 server_name localhost; //提供服务的域名或主机名
 //控制⽹站访问路径
 'location' / {
 root /usr/share/nginx/html; //存放⽹站路径
 index index.html index.htm; //默认访问⾸⻚⽂件
}

 //指定错误代码, 统⼀定义错误⻚⾯, 错误代码重定向到新的Locaiton
 error_page 500 502 503 504 /50x.html;
 'location' = /50x.html {
 root html;
 }
 }
 ...
 //第⼆个虚拟主机配置
 'server' {
 ...
 }
}

Nginx虚拟主机

所谓虚拟主机,在web服务器⾥是⼀个独⽴的⽹站站点,这个站点对应独⽴的域名(也可能是IP或端⼝),具有独⽴的程序及资源⽬录,可以独⽴地对外提供服务供⽤户访问。

配置基于域名虚拟主机
1.创建web站点⽬录
[root@LNMP conf]# mkdir /soft/code/{www,bbs}
[root@LNMP conf]# echo "www.wingsredevsecops.top" > /soft/code/www/index.html
[root@LNMP conf]# echo "bbs.wingsredevsecops.top" > /soft/code/bbs/index.html

2.配置虚拟主机
[root@i-m60lx3hh conf.d]# cat www.conf
server {
 listen 80;
 server_name www.xu.top;
 root /soft/code/www;
}

配置不同端⼝访问不同虚拟主机
mkdir -p /soft/code/800{1..2}
echo "8001" > /soft/code/8001/index.html
echo "8002" > /soft/code/8002/index.html

//仅修改listen监听端⼝即可, 但不能和系统端⼝发⽣冲突
[root@i-m60lx3hh conf.d]# cat 800*
server {
 listen 8001;
 root /soft/code/8001;
 index index.html index.htm;
}
server {
 listen 8002;
 root /soft/code/8002;
 index index.html index.htm;
}

# 配置虚拟主机别名
所谓虚拟主机别名,就是虚拟主机设置除了主域名以外的⼀个域名,实现⽤户访问的多个域名对应同⼀个虚拟主机⽹站
的功能。
以www.wingsredevsecops.top域名的虚拟主机为例:
为其增加⼀个别名blog.wingsredevsecops.top时,出现⽹站内容和访问www.wingsredevsecops.top是⼀样的,
具体配置如下:
//默认配置
[root@LNMP ~]# vim /etc/nginx/conf.d/www.conf
server {
 listen 80;
 server_name www.wingsredevsecops.top;
}
//别名配置
[root@LNMP ~]# vim /etc/nginx/conf.d/www.conf
server {
 listen 80;
 server_name www.wingsredevsecops.top blog.wingsredevsecops.top;
 ...
}
//使⽤Linux下curl测试结果
[root@LNMP conf]# curl blog.wingsredevsecops.top
www.wingsredevsecops.top
[root@LNMP conf]# curl www.wingsredevsecops.top
www.wingsredevsecops.top
//访问带www和带blog是⼀样的, 除了别名实现也可以通过rewrite实现



Nginx⽇志配置

Nginx⽇志配置规范
//配置语法: 包括: error.log access.log
Syntax: log_format name [escape=default|json] string ...;
Default: log_format combined "...";
Context: http

//Nginx默认配置
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
 '$status $body_bytes_sent "$http_referer" '
 '"$http_user_agent" "$http_x_forwarded_for"';

//Nginx⽇志变量
$remote_addr //表示客户端地址
$remote_user //http客户端请求nginx认证⽤户名
$time_local //Nginx的时间
$request //Request请求⾏, GET等⽅法、http协议版本
$status //respoence返回状态码
$body_bytes_sent //从服务端响应给客户端body信息⼤⼩
$http_referer //http上⼀级⻚⾯, 防盗链、⽤户⾏为分析
$http_user_agent //http头部信息, 客户端访问设备
$http_x_forwarded_for //http请求携带的http信息

# access.log
127.0.0.1 - - [14/Apr/2023:11:45:47 +0800] "GET / HTTP/1.1" 200 615 "-" "curl/7.29.0"
"-"

# 应⽤场景
问题排查分析⽇志 错误⽇志 访问⽇志
acess 接⼝业务统计

# Nginx状态监控
--with-http_stub_status_module 记录 Nginx 客户端基本访问状态信息

http_stub_status_module是⼀个nginx模块,它提供基于HTTP请求的状态信息。当启⽤该模块时,⽤户可以通过在浏览器中输⼊http://server_address/nginx_status来获取统计信息和性能参数,⽐如活跃的连接数,响应时间和资源使⽤情况。这些数据可⽤于监控和优化nginx服务器的性能。

Syntax: stub_status;
Default: —
Context: server, location

具体配置如下:
/etc/nginx/conf.d/wingsredevsecops.top.conf

server {
 listen 80;
 server_name wingsredevsecops.top;
 root /soft/code/wing;
 index index.html;
 location /nginx_status {
 stub_status on;
 access_log off;
 # 应⽤监控获取指标
 # allow 127.0.0.1;
 # deny all;
 }

//Nginx_status概述
Active connections:2 //Nginx当前活跃连接数
server accepts handled requests
16 16 19
server表示Nginx处理接收握⼿总次数。
accepts表示Nginx处理接收总连接数。
请求丢失数=(握⼿数-连接数)可以看出,本次状态显示没有丢失请求。
handled requests,表示总共处理了19次请求。
Reading Nginx读取数据
Writing Nginx写的情况
Waiting Nginx开启keep-alive⻓连接情况下, 既没有读也没有写, 建⽴连接情况
 }

# Nginx下载站点
Nginx默认是不允许列出整个⽬录浏览下载。
Syntax: autoindex on | off;
Default: 
autoindex off;
Context: http, server, location

//autoindex常⽤参数
autoindex_exact_size off;
默认为on, 显示出⽂件的确切⼤⼩,单位是bytes。
修改为off,显示出⽂件的⼤概⼤⼩,单位是kB或者MB或者GB。
autoindex_localtime on;
默认为off,显示的⽂件时间为GMT时间。
修改为on, 显示的⽂件时间为⽂件的服务器时间。
charset utf-8,gbk;
默认中⽂⽬录乱码,添加上解决乱码。

# 配置⽬录浏览功能
/etc/nginx/conf.d/wingsredevsecops.top.conf

//开启⽬录浏览
location /download {
 root /soft/code/wing;
 autoindex on;
 autoindex_localtime on;
 autoindex_exact_size off;
}

# Nginx访问限制

连接频率限制 limit_conn_module
请求频率限制 limit_req_module

http协议的连接与请求
HTTP是建⽴在TCP, 在完成HTTP请求需要先建⽴TCP三次握⼿(称为TCP连接),在连接的基础上在HTTP请求。

HTTP 请求建⽴在⼀次 TCP 连接基础上
⼀次 TCP 请求⾄少产⽣⼀次 HTTP 请求

Nginx连接限制配置
//Nginx连接限制语法
Syntax: limit_conn_zone key zone=name:size;
Default: —
Context: http
Syntax: limit_conn zone number;
Default: —
Context: http, server, location
//具体配置如下:
http {
//http段配置连接限制, 同⼀时刻只允许⼀个客户端IP连接
limit_conn_zone $binary_remote_addr zone=conn_zone:10m;
 ...
 server {
 ... 
 location / {
 //同⼀时刻只允许⼀个客户端IP连接
 limit_conn conn_zone 1;
 }
//压⼒测试
yum install -y httpd-tools
ab -n 50 -c 20 http://www.wingsredevsecops.top/index.html

`limit_conn_zone` 指令是 Nginx 提供的限制连接数模块,可以⽤来控制⽤户的连接并发数,避免服务器因为连
接过多⽽宕机。该指令⽤于为限制连接数模块中的连接信息分配⼀块共享内存,以便 Nginx 能够在多个 Worker 进
程之间共享这些信息。
具体的指令含义如下:
- `limit_conn_zone`: 指定需要分配共享内存的共享内存名字。在本例中为 `conn_zone`。
- `$binary_remote_addr`: 表示客户端 IP 地址对应的⼆进制字符串
- `zone`: 定义了共享内存区域的⼤⼩,这⾥为 10MB。
这条指令的作⽤是:根据客户端 IP 地址来限制每个客户端的连接数不超过某个值,共享内存⽤于跨 Worker 进程存
储这些连接信息。在本例中,每个客户端最多只能建⽴指定数量的连接。当⼀个客户端建⽴连接时,如果已经有
`conn_zone` 内存中该 IP 的连接数超过该值,则 Nginx 将丢弃该连接,从⽽限制了连接数的并发度,防⽌服务
器过载。

Nginx 请求限制配置
//Nginx请求限制语法
Syntax: limit_req_zone key zone=name:size rate=rate;
Default: —
Context: http
Syntax: limit_conn zone number [burst=number] [nodelay];
Default: —
Context: http, server, location
//具体配置如下:
http {
//http段配置请求限制, rate限制速率,限制⼀秒钟最多⼀个IP请求
limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;
 ...
 server {
 ... 
 location / {
 //1r/s只接收⼀个请求,其余请求拒绝处理并返回错误码给客户端
 limit_req zone=req_zone;
 //请求超过1r/s,剩下的将被延迟处理,请求数超过burst定义的数量, 多余的请求返回503
 #limit_req zone=req_zone burst=3 nodelay;
 }
//压⼒测试
yum install -y httpd-tools
ab -n 50 -c 20 http://127.0.0.1/index.html

连接限制没有请求限制有效?
多个请求可以建⽴在⼀次的TCP连接之上, 那么我们对请求的精度限制,当然⽐对⼀个连接的
限制会更加的有效。
因为同⼀时刻只允许⼀个连接请求进⼊。
但是同⼀时刻多个请求可以通过⼀个连接进⼊。
所以请求限制才是⽐较优的解决⽅案。

# Nginx访问控制
基于IP的访问控制 http_access_module
基于⽤户登陆认证 http_auth_basic_module
基于IP的访问控制

//允许配置语法
Syntax: allow address | CIDR | unix: | all;
Default: —
Context: http, server, location, limit_except
//拒绝配置语法
Syntax: deny address | CIDR | unix: | all;
Default: —
Context: http, server, location, limit_except
//配置拒绝某⼀个IP, 其他全部允许
 location ~ ^/1.html {
 index index.html;
 deny 192.168.178.100;
 allow all;
}
//只允许某⼀个⽹段访问,其它全部拒绝
location / {
 index index.php index.html index.htm;
 allow 10.1.106.0/24;
 deny all;
}

// 基于⽤户登陆认证
//配置语法
Syntax: auth_basic string| off;
Default: auth_basic off;
Context: http, server, location, limit_except

//⽤户密码记录配置⽂件
Syntax: auth_basic_user_file file;
Default: -
Context: http, server, location, limit_except

//需要安装依赖组件
[root@wing ~]# yum install httpd-tools
[root@wing ~]# htpasswd -c /etc/nginx/auth_conf wing
//可在http,server,location下添加如下信息
auth_basic "Auth access Blog Input your Passwd!";
auth_basic_user_file /etc/nginx/auth_conf;

/etc/nginx/conf.d/wingsredevsecops.top.conf
location /download {
 auth_basic "Auth access Blog Input your Passwd!";
 auth_basic_user_file /etc/nginx/auth_conf;
 autoindex on;
 autoindex_localtime on;
 autoindex_exact_size off;
 }

⽤户认证局限性
1.⽤户信息依赖⽂件⽅式
2.⽤户管理⽂件过多, ⽆法联动
3.操作管理机械,效率低下
解决办法
1. Nginx 结合 LUA 实现⾼效验证
2. Nginx 结合 LDAP 利⽤ nginx-auth-ldap 模块

# 反向代理配置
1.客户端使⽤代理服务器访问真实WEB服务器
2.代理服务器开启x_forwarede_for记录客户端真实IP
3.WEB服务器开启x_forwarede_for记录客户端真实IP以及代理服务器IP http x forwarded for =
ClientlP,Proxy(1)IPProxy(2)IP

# Nginx反向代理配置
server {
 # 监听的IP和端⼝
 listen 80;
 # 域名
 server_name slb.wingsredevsecops.top;
 # 记录⽇志,使⽤⾃定义的log_format
 access_log /var/log/nginx/access.log main;
 # 设置代理头部
 proxy_set_header Host $http_host;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 # 正常的反向代理配置
 location / {
 # 后端Web服务器
 proxy_pass http://10.1.106.66;
 }
}

解决⽅式
1.采⽤HTTP头信息控制访问, 代理以及web服务开启 http_x_forwarded_for
2.结合geo模块作
3.通过HTTP⾃动以变量传递
posted @ 2025-03-13 21:13  basickill  阅读(87)  评论(0)    收藏  举报