nginx配置文件详解
nginx配置文件详解
nginx配置文件
主配置文件:/usr/local/nginx/conf/nginx.conf
默认启动nginx时,使用的配置文件是:安装路径/conf/nginx.conf文件
可以在启动nginx时通过-c选项来指定要读取的配置文件
nginx常见的配置文件及其作用
配置文件 | 作用 |
---|---|
nginx.conf | nginx的基本配置文件 |
mime.types | MIME类型关联的扩展文件 |
fastcgi.conf | 与fastcgi相关的配置 |
proxy.conf | 与proxy相关的配置 |
sites.conf | 配置nginx提供的网站,包括虚拟主机 |
nginx.conf配置详解
nginx.conf的内容分为以下几段:
- main配置段:全局配置段。其中main配置段中可能包含event配置段
- event {}:定义event模型工作特性
- http {}:定义http协议相关的配置
配置指令:要以分号结尾,语法格式如下:
derective value1 [value2 ...];
支持使用变量:
内置变量:模块会提供内建变量定义
自定义变量:set var_name value
用于调试、定位问题的配置参数
daemon {on|off}; //是否以守护进程方式运行nginx,调试时应设置为off
master_process {on|off}; //是否以master/worker模型来运行nginx,调试时可以设置为off
error_log 位置 级别; //配置错误日志
error_log里的位置和级别能有以下可选项:
位置 | 级别 |
---|---|
file stderr syslog:server=address[,parameter=value] memory:size |
debug:若要使用debug级别,需要在编译nginx时使用–with-debug选项 info notice warn error crit alert emerg |
正常运行必备的配置参数
user USERNAME [GROUPNAME]; //指定运行worker进程的用户和组
pid /path/to/pid_file; //指定nginx守护进程的pid文件
worker_rlimit_nofile number; //设置所有worker进程最大可以打开的文件数,默认为1024
worker_rlimit_core size; //指明所有worker进程所能够使用的总体的最大核心文件大小,保持默认即可
优化性能的配置参数
worker_processes n; //启动n个worker进程,这里的n为了避免上下文切换,通常设置为cpu总核心数-1或等于总核心数
worker_cpu_affinity cpumask ...; //将进程绑定到某cpu中,避免频繁刷新缓存
//cpumask:使用8位二进制表示cpu核心,如:
0000 0001 //第一颗cpu核心
0000 0010 //第二颗cpu核心
0000 0100 //第三颗cpu核心
0000 1000 //第四颗cpu核心
0001 0000 //第五颗cpu核心
0010 0000 //第六颗cpu核心
0100 0000 //第七颗cpu核心
1000 0000 //第八颗cpu核心
timer_resolution interval; //计时器解析度。降低此值,可减少gettimeofday()系统调用的次数
worker_priority number; //指明worker进程的nice值
6.5 事件相关的配置:event{}段中的配置参数
accept_mutex {off|on}; //master调度用户请求至各worker进程时使用的负载均衡锁;on表示能让多个worker轮流地、序列化地去响应新请求
lock_file file; //accept_mutex用到的互斥锁锁文件路径
use [epoll | rtsig | select | poll]; //指明使用的事件模型,建议让nginx自行选择
worker_connections #; //每个进程能够接受的最大连接数
网络连接相关的配置参数
keepalive_timeout number; //长连接的超时时长,默认为65s
keepalive_requests number; //在一个长连接上所能够允许请求的最大资源数
keepalive_disable [msie6|safari|none]; //为指定类型的UserAgent禁用长连接
tcp_nodelay on|off; //是否对长连接使用TCP_NODELAY选项,为了提升用户体验,通常设为on
client_header_timeout number; //读取http请求报文首部的超时时长
client_body_timeout number; //读取http请求报文body部分的超时时长
send_timeout number; //发送响应报文的超时时长
fastcgi的相关配置参数
LNMP:php要启用fpm模型
配置示例如下:
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000; //定义反向代理
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
}
nginx作为web服务器时使用的配置
http{}段的配置参数
http{…}:配置http相关,由ngx_http_core_module模块引入。nginx的HTTP配置主要包括四个区块,结构如下:
http { //协议级别
include mime.types;
default_type application/octet-stream;
keepalive_timeout 65;
gzip on;
upstream { //负载均衡配置
...
}
server { //服务器级别,每个server类似于httpd中的一个<VirtualHost>
listen 80;
server_name localhost;
location / { //请求级别,类似于httpd中的<Location>,用于定义URL与本地文件系统的映射关系
root html;
index index.html index.htm;
}
}
}
http{}段配置指令
server {}:定义一个虚拟主机,示例如下:
server {
listen 80;
server_name www.idfsoft.com;
root "/vhosts/web";
}
listen:指定监听的地址和端口
listen address[:port];
listen port;
server_name NAME [...]; 后面可跟多个主机,名称可使用正则表达式或通配符
当有多个server时,匹配顺序如下:
- 先做精确匹配检查
- 左侧通配符匹配检查,如*.idfsoft.com
- 右侧通配符匹配检查,如mail.*
- 正则表达式匹配检查,如~ ^.*.idfsoft.com$
- default_server
-
root path; 设置资源路径映射,用于指明请求的URL所对应的资源所在的文件系统上的起始路径
-
alias path; 用于location配置段,定义路径别名
-
index file; 默认主页面
index index.php index.html; -
error_page code […] [=code] URI | @name 根据http响应状态码来指明特用的错误页面,例如 error_page 404 /404_customed.html
[=code]:以指定的响应码进行响应,而不是默认的原来的响应,默认表示以新资源的响应码为其响应码,例如 error_page 404 =200 /404_customed.html
log_format 定义日志格式
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 logs/access.log main;
//注意:格式名main可自己定义,但要一一对应,另外此处可用变量为nginx各模块内建变量
location区段,通过指定模式来与客户端请求的URI相匹配
//功能:允许根据用户请求的URI来匹配定义的各location,匹配到时,此请求将被相应的location配置块中的配置所处理,例如做访问控制等功能
//语法:location [ 修饰符 ] pattern {......}
常用修饰符说明:
修饰符 | 功能 |
---|---|
= | 精确匹配 |
~ | 正则表达式模式匹配,区分大小写 |
~* | 正则表达式模式匹配,不区分大小写 |
^~ | 前缀匹配,类似于无修饰符的行为,也是以指定模块开始,不同的是,如果模式匹配,那么就停止搜索其他模式了,不支持正则表达式 |
@ | 定义命名location区段,这些区段客户端不能访问,只可以由内部产生的请求来访问,如try_files或error_page等 |
查找顺序和优先级:由高到底依次为
- 带有=的精确匹配优先
- 带有^~修饰符的,开头匹配
- 正则表达式按照他们在配置文件中定义的顺序
带有或*修饰符的,如果正则表达式与URI匹配 - 没有修饰符的精确匹配
优先级如下:
( location = 路径 ) --> ( location ^~ 路径 ) -->
( location ~ 正则 ) --> ( location ~* 正则 ) -->
( location 路径 )
location实战
[root@nginx ~]# cd /usr/local/nginx/conf
[root@nginx conf]# vim nginx.conf
...
server {
listen 80;
server_name localhost;
location / { //模糊匹配"/"开头的URI,这个优先级最低,当其他的都匹配不到时,匹配这个
echo "/";
}
location = /abc { //精确匹配URI为"/abc"
echo "= abc";
}
location ^~ /abc { //匹配以"/abc"开头的URI,优先级低于修饰符"="
echo "^abc";
}
location ~ ^/a { //使用正则表达式匹配以"a"开头的URI,优先级低于修饰符"^~"
echo "^/a";
}
...
[root@nginx conf]# cd
[root@nginx ~]# systemctl reload nginx.service
#进行测试
#1.这次访问的的是"/abc",它的URI就是"/abc",被"location = /abc"精确匹配到,所以说修饰符"="优先级最高,打印了"=abc"
[root@nginx ~]# curl http://127.0.0.1/abc
= abc
##注意"?"后面部分不属于URI,所以说还能被"location = /abc",精确匹配到
[root@nginx ~]# curl http://127.0.0.1/abc?aa
= abc
#2.访问这个的URI是"/abc/",所以说不能被"location = /abc"精确匹配到,但是这个URI是以"/abc"开头的,所以说被"location ^~ /abc"优先匹配到
[root@nginx ~]# curl http://127.0.0.1/abc/
^abc
[root@nginx ~]# curl http://127.0.0.1/abc/abc
^abc
[root@nginx ~]# curl http://127.0.0.1/abcd/a
^abc
[root@nginx ~]# curl http://127.0.0.1/abcdef?aa
^abc
#3.只要不被前两条匹配到,且以"a"开头的URI,就都会被"location ~ ^/a"匹配到
[root@nginx ~]# curl http://127.0.0.1/a
^/a
[root@nginx ~]# curl http://127.0.0.1/ab
^/a
[root@nginx ~]# curl http://127.0.0.1/a/a?a
^/a
#5.只要上面的条件都不被匹配到"/",符合条件的只有"location /"这一条
[root@nginx ~]# curl http://127.0.0.1
/
[root@nginx ~]# curl http://127.0.0.1/
/
[root@nginx ~]# curl http://127.0.0.1/b
/
[root@nginx ~]# curl http://127.0.0.1/b/a
/
[root@nginx ~]# curl http://127.0.0.1/b/a?a
/
nginx访问控制
用于location段
allow:设定允许哪台或哪些主机访问,多个参数间用空格隔开
deny:设定禁止哪台或哪些主机访问,多个参数间用空格隔开
示例:
[root@nginx ~]# cd /usr/local/nginx/html/
[root@nginx html]# ls
50x.html index.html
[root@nginx html]# echo 'hello world' > index.html
[root@nginx html]# systemctl restart nginx
#虚拟机访问
[root@nginx html]# curl 192.168.111.141
hello world
浏览器访问
修改配置文件设置访问权限,设置只允许虚拟机访问
[root@nginx html]# cd ..
[root@nginx nginx]# vim conf/nginx.conf
...
location / {
allow 192.168.118.129;
deny all;
root html;
index index.html index.htm;
}
...
[root@nginx nginx]# systemctl restart nginx
#虚拟机访问
[root@nginx nginx]# curl 192.168.118.129
hello world
主机浏览器访问
nginx用户认证
#安装httpd工具包
[root@nginx ~]# yum -y install httpd-tools
[root@nginx ~]# cd /usr/local/nginx/html/
[root@nginx html]# mkdir abc
[root@nginx html]# echo "ABC" >> abc/index.html
#修改配置文件
[root@nginx html]# cd
[root@nginx ~]# cd /usr/local/nginx/conf/
[root@nginx conf]# vim nginx.conf
...
location /abc {
auth_basic "ABC";
auth_basic_user_file "/usr/local/nginx/conf/.pass"; #密码位置
root html;
index index.html;
}
...
#生成密码
[root@nginx conf]# htpasswd -cm /usr/local/nginx/conf/.pass daxinyu
New password:
Re-type new password:
Adding password for user daxinyu
[root@nginx conf]# cat .pass
daxinyu:$apr1$adGf7vfN$G9eStSLIcBg4Eq7xCQN5q.
[root@nginx conf]# systemctl restart nginx
直接访问
访问html下的abc
https配置
证书申请及签署步骤
a) 生成申请请求
b) RA核验
c) CA签署
d) 获取证书
#生成证书
[root@nginx ~]# cd /etc/pki/
[root@nginx pki]# mkdir CA
[root@nginx pki]# cd CA/
[root@nginx CA]# mkdir private
[root@nginx CA]# (umask 077;openssl genrsa -out private/cakey.pem 2048)
Generating RSA private key, 2048 bit long modulus (2 primes)
.............................................+++++
......+++++
e is 65537 (0x010001)
[root@nginx CA]# ls private/
cakey.pem
#CA生成自签署证书
[root@nginx CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 365
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN #国家
State or Province Name (full name) []:HB #省份
Locality Name (eg, city) [Default City]:WH #城市
Organization Name (eg, company) [Default Company Ltd]:DXY
Organizational Unit Name (eg, section) []:www.example.com
Common Name (eg, your name or your server's hostname) []:www.example.com
Email Address []:123@456.com
[root@nginx CA]# mkdir certs newcerts crl
[root@nginx CA]# touch index.txt && echo 01 > serial
#生成秘钥
[root@nginx CA]# cd /usr/local/nginx/conf/
[root@nginx conf]# mkdir ssl
[root@nginx conf]# cd ssl/
[root@nginx ssl]# (umask 077;openssl genrsa -out nginx.key 2048)
Generating RSA private key, 2048 bit long modulus (2 primes)
...............................................................................................+++++
.......................................+++++
e is 65537 (0x010001)
#证书签署请求
[root@nginx ssl]# openssl req -new -key nginx.key -days 365 -out nginx.csr
Ignoring -days; not generating a certificate
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:HB
Locality Name (eg, city) [Default City]:WH
Organization Name (eg, company) [Default Company Ltd]:DXY
Organizational Unit Name (eg, section) []:www.example.com
Common Name (eg, your name or your server's hostname) []:www.example.com
Email Address []:123@456.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: #回车
An optional company name []: #回车
#签署证书
[root@nginx ssl]# openssl ca -in nginx.csr -out nginx.crt -days 365
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Oct 13 14:51:04 2022 GMT
Not After : Oct 13 14:51:04 2023 GMT
Subject:
countryName = CN
stateOrProvinceName = HB
organizationName = DXY
organizationalUnitName = www.example.com
commonName = www.example.com
emailAddress = 123@456.com
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
78:F8:8D:3E:C8:C6:F0:4C:CB:B3:BD:DA:0B:C6:C2:02:6B:01:A1:0F
X509v3 Authority Key Identifier:
keyid:26:DD:53:90:8B:BA:13:01:83:CA:7A:02:34:71:5A:9E:10:5E:E7:73
Certificate is to be certified until Oct 13 14:51:04 2023 GMT (365 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
[root@nginx ssl]# ls
nginx.crt nginx.csr nginx.key
#修改配置文件加入生成的秘钥和证书
[root@nginx ssl]# cd ..
[root@nginx conf]# vim nginx.conf
//先取消注释
server {
listen 443 ssl;
server_name www.example.com;
ssl_certificate /usr/local/nginx/conf/ssl/nginx.crt; #修改为密钥和证书的位置
ssl_certificate_key /usr/local/nginx/conf/ssl/nginx.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
}
[root@nginx conf]# systemctl restart nginx
访问测试
点高级继续前往
状态页面开启和监控
开启状态页面
开启status:
location /status {
stub_status {on | off}; //默认off
allow 172.16.0.0/16;
deny all; //设置可以访问的IP
}
访问状态页面的方式:
http://server_ip/status
访问测试
状态页面信息详解:
状态码 | 表示的意义 |
---|---|
Active connections 2 | 当前所有处于打开状态的连接数 |
accepts | 总共处理了多少个连接 |
handled | 成功创建多少握手 |
requests | 总共处理了多少个请求 |
Reading | nginx读取到客户端的Header信息数,表示正处于接收请求状态的连接数 |
Writing | nginx返回给客户端的Header信息数,表示请求已经接收完成, 且正处于处理请求或发送响应的过程中的连接数 |
Waiting | 开启keep-alive的情况下,这个值等于active - (reading + writing), 意思就是Nginx已处理完正在等候下一次请求指令的驻留连接 |
监控状态页面
环境介绍
主机名 | ip | 服务 |
---|---|---|
zabbix | 192.168.118.137 | LAMP zabbix-server zabbix-agentd |
nginx | 192.168.118.129 | nginx zabbix-agentd |
nginx端
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
...
location = /nginx_status {
stub_status on;
}
...
[root@nginx ~]# systemctl restart nginx
nginx部署zabbix监控链接
#创建用户
[root@nginx ~]# useradd -rMs /sbin/nologin zabbix
#下载相关依赖包
[root@nginx ~]# dnf -y install make gcc gcc-c++ pcre-devel openssl openssl-devel
#下载,解压,编译安装zabbix_agentd
[root@nginx ~]# wget https://cdn.zabbix.com/zabbix/sources/stable/6.2/zabbix-6.2.2.tar.gz
[root@nginx ~]# tar -xf zabbix-6.2.2.tar.gz
[root@nginx ~]# cd zabbix-6.2.2
[root@nginx zabbix-6.2.2]# ./configure --enable-agent
[root@nginx zabbix-6.2.2]# make install
#修改配置文件
[root@nginx ~]# vim /usr/local/etc/zabbix_agentd.conf
Server=192.168.118.137 //修改为服务端IP地址
ServerActive=192.168.118.137 //agent主动模式
Hostname=nginx //zabbix系统内主机名
#启动服务
[root@nginx ~]# zabbix_agentd
[root@nginx ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 0.0.0.0:443 0.0.0.0:*
LISTEN 0 128 0.0.0.0:10050 0.0.0.0:*
LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
#监控编写脚本
[root@nginx ~]# mkdir /scripts
[root@nginx ~]# cd /scripts/
[root@nginx scripts]# vi check_nginx.sh
#Script to fetch nginx statuses for monitoring systems
HOST="127.0.0.1"
PORT="80"
function ping {
/sbin/pidof nginx | wc -l
}
function active {
/usr/bin/curl "http://$HOST:$PORT/nginx_status/" 2>/dev/null| grep 'Active' | awk '{print $NF}'
}
function reading {
/usr/bin/curl "http://$HOST:$PORT/nginx_status/" 2>/dev/null| grep 'Reading' | awk '{print $2}'
}
function writing {
/usr/bin/curl "http://$HOST:$PORT/nginx_status/" 2>/dev/null| grep 'Writing' | awk '{print $4}'
}
function waiting {
/usr/bin/curl "http://$HOST:$PORT/nginx_status/" 2>/dev/null| grep 'Waiting' | awk '{print $6}'
}
function accepts {
/usr/bin/curl "http://$HOST:$PORT/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $1}'
}
function handled {
/usr/bin/curl "http://$HOST:$PORT/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $2}'
}
function requests {
/usr/bin/curl "http://$HOST:$PORT/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $3}'
}
$1
[root@zabbix scripts]# chmod +x check_nginx.sh
[root@zabbix scripts]# ll
总用量 4
-rwxr-xr-x 1 root root 1003 10月 13 23:08 check_nginx.sh
#开启自定义监控
[root@nginx ~]# vim /usr/local/etc/zabbix_agentd.conf
#在最后添加下面两行
UnsafeUserParameters=1
UserParameter=check_nginx[*],/bin/bash /scripts/check_nginx.sh $1
#重启服务
[root@nginx ~]# pkill zabbix
[root@nginx ~]# zabbix_agentd
[root@nginx ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 0.0.0.0:443 0.0.0.0:*
LISTEN 0 128 0.0.0.0:10050 0.0.0.0:*
LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
服务端进行测试
#修改中括号内想要查看的状态名称即可
[root@zabbix ~]# zabbix_get -s 192.168.118.129 -k check_nginx[active]
1
[root@zabbix ~]# zabbix_get -s 192.168.118.129 -k check_nginx[accepts]
4
[root@zabbix ~]# zabbix_get -s 192.168.118.129 -k check_nginx[handled]
5
创建监控主机
创建监控项
posted on 2022-10-14 00:09 linux-ada 阅读(6918) 评论(0) 编辑 收藏 举报