0
点赞
收藏
分享

微信扫一扫

3、Nginx主配置文件

Nginx核心模块在配置文件中的配置格式

全局配置:不带{}的
如:#user  nobody;
worker_processes  1;

带{}的为对某一模块设置
如:事件驱动模块 
events{                   
worker_processes 1;
}
http/https 协议相关配置段 
http {  
... 
}    
mail 协议相关配置段 
mail {  
... 
}     
#stream 服务器相关配置段 
stream {  
... 
}

nginx配置文件全局配置

Main 全局配置段常见的配置指令分类

正常运行必备的配置 
优化性能相关的配置 
用于调试及定位问题相关的配置
事件驱动相关的配置

全局配置说明:

1、user nginx nginx;  启动nginx工作进程的用户和组;(切换用户要注意属性问题,用户要和下面文件的属性一致)
master进程必须是root,因为他要监听80端口,接收用户的请求,把请求下发到woeker来处理。只有root有权限监听1023以下的端口号。  
nc命令可以监听端口,如:nc -l 666端口,只有root可以监听,其他用户无权限监听
2、worker_processes number|auto; 启动Nginx工作进程的数量,一般设为和CPU核心数相同(auto)
更改配置文件后,重新加载 nginx -s reload
3、将Nginx工作进程绑定到指定的CPU核心,默认Nginx是不进行进程绑定的,绑定并不是意味着当前nginx进程独占以一核心CPU, 但是可以保证此进程不会运行在其他核心上,这就极大减少了nginx的工作进程在不同的cpu核心上的来回跳转,减少了CPU对进程的资源分配与回收以及内存管理等,因此可以有效的提升nginx服务器的性能.
cpu核心与进程绑定叫做cpu的亲缘性
如何绑定亲缘性:worker_cpu_affinity 000000001|auto 第一颗cpu绑第一个worker进程,以此类推。auto自动
如:worker_cpu_affinity 01 10;查看cpu和哪个进程绑一起  ps axo pid,cmd,psr |grep nginx
4、错误日志 配置文件的错误日志 路径:/apps/nginx/logs/error.log; 可以加等级,可以指定路径,程序启动错误,可根据错误日志来排错
5、pid文件,master进程编号 系统自动分配的,停系统后,pid文件就没有了 路径:/apps/nginx/logs/pid
6、worker_priority 0; 工作进程优先级, -20~19 (值越小,优先级越高)
配置文件中更改优先级:worker_priority -10;  重新加载 nginx -s reload,
查看优先级,ps axo pid,cmd,ni |grep nginx
7、worker_rlimit_nofile 65536;所有worker进程能打开的文件数量上限,包括nginx得所有连接,连接一个,在worker进程下生成一个socket文件。
socket文件所在位置:先查看工作进程端口号ps aux |grep nginx,
根据端口号查看所在位置:ll /proc/端口号/fd
数量上限最好与ulimit -n或者limits.conf得值保持一致。
修改ulimit -n的值文件:vim /etc/security/limits.conf
nofile - max number of open file descriptors或者直接修改:ulimit -n 100000(此值默认为1024)
8、daemon off;守护进程 默认是on 前台运行Nginx服务用于测试,或者以容器运行时,需要设为off,如果后台运行,会直接退出。
9、master_process off|on;是否开启Nginx的master-worker工作模式,仅用于开发调试场景,默认为on。如果关闭这一项,就只剩下master进程。不需要更改
10、
events {  
worker_connections  65536;        #设置单个工作进程的最大并发连接数,要和总的相互匹配 
use epoll; #使用epoll事件驱动,Nginx支持众多的事件驱动,比如:select,poll,epoll,只 能设置在events模块中设置.   (性能优化选择epoll)
accept_mutex on; #on为同一时刻一个请求轮流由worker进程处理,而防止被同时唤醒所有 worker,避免多个睡眠进程被唤醒的设置,默认为off,新请求会唤醒所有worker进程,此过程也称为"惊 群",因此nginx刚安装完以后要进行适当的优化.建议设置为on  (节约资源)
multi_accept on; #on时Nginx服务器的每个工作进程可以同时接受多个新的网络连接,此指令默认为off,即默认为一个工作进程只能一次接受一个新的网络连接,打开后几个同时接受多个.建议设置为on }

配置文件的全局配置从哪些方面可以优化nginx性能

1、工作进程的数量,设为和CPU核数相同
2、结亲缘,cpu核与工作进程进行绑定,防止工作进程在cpu上来回跳转
3、设置工作进程优先级 orker_priority -20
4、置工作进程的最大并发连接数 如:worker_connections  65536
5、epoll 支持众多的事件驱动
6、启accept_mutex on; 防止惊群,一个请求来了只需要一个worker为其服务。 默认为off
7、multi_accept on;工作进程可以接受多个网络连接。  默认为off

范例: 实现 nginx 的高并发配置

[root@ubunt html]# ulimit -n 102400 调大连接数
在另一机器安装对nginx的压力测试工具
[root@10 ~]# yum -y install httpd-tools (红帽下安装包)
[root@10 ~]# while true;do ab -c 5000 -n 10000 http://10.0.0.200/;sleep 0.5;done
从另一台机器死循环方式发起5000个并发,10000次的压力测试机器

默认配置不支持高并发,会发现以下错误日志
[root@ubunt html]# tail -f /apps/nginx/logs/error.log
0: *1105860 open() "/apps/nginx/html/50x.html" failed (24: Too many open files), client: 10.0.0.7, server: localhost, request: "GET / HTTP/1.0", host: "10.0.0.8"

Ubuntu默认值比较高,无需调整:
cat /proc/25149/limits
Limit                         Soft Limit           Hard Limit            Units
Max open files                 1024                 524288               files
Rocky8默认值比较低,需要调整:
Limit                         Soft Limit           Hard Limit            Units
Max open files                 1024                 262144               files

如果systemd启动,则需要修改nginx.service文件中加LimitNOFILE=100000,才能有效
vim /lib/systemd/system/nginx.service
[Service]
...... 
LimitNOFILE=100000
.....
添加之后:systemctl daemon-reload   systemctl restart nginx
如果非systemd启动,可以修改下面pam限制:
vim /etc/security/limits.conf
*               soft   nofile          1000000 
*               hard   nofile          1000000

vim /apps/nginx/conf/nginx.conf
worker_rlimit_nofile 100000;
systemctl restart nginx
watch -n1 'ps -axo pid,cmd,nice | grep nginx 验证优先级

http配置块 (core module核心模块)

http 协议相关的配置结构

http { 
...
...                                  各server的公共配置
server {                             每个server用于定义一个虚拟主机,第一个server为默认虚拟服务器
...
} 
server {     
... 
server_name                          虚拟主机名
root                                 主目录
alias                                路径别名
location [OPERATOR] URL {            指定URL的特性
if CONDITION { 
...
} 
} 
} 
}

http协议配置说明
MIME

在响应报文中将指定的文件扩展名映射至MIME对应的类型
include           /etc/nginx/mime.types;
default_type     application/octet-stream;除mime.types中的类型外,指定其它文件的默认 MIME类型,浏览器一般会提示下载
types {   
text/html html;   
image/gif gif;   
image/jpeg jpg;

如:识别php文件为text/html
vim /apps/nginx/conf/nginx.conf
http {
include       mime.types;   
default_type application/octet-stream;  
types{      
text/plain php;                       加此行
nginx -s reload                       重新加载

curl -I http://10.0.0.100/test.php
HTTP/1.1 200 OK 
Server: nginx/1.18.0 
Date: Thu, 24 Sep 2020 13:56:26 GMT 
Content-Type: text/html 
Content-Length: 612 
Last-Modified: Thu, 24 Sep 2020 12:13:03 GMT 
Connection: keep-alive
ETag: "5f6c8d4f-264" 
Accept-Ranges: bytes

指定响应报文server首部

是否在响应报文中显示nginx版本
server_tokens on | off | build | string;
如:http {
    server_tokens on   放在server,http,location语句块都可以
nginx -s reload        重新加载      

修改server字段
如果想自定义响应报文的nginx版本信息,需要修改源码文件,重新编译 
如果server_tokens on,修改 src/core/nginx.h 修改第13-14行,如下示例
如:vim /usr/local/src/nginx-1.22.0/src/core/nginx.h
define NGINX_VERSION     "1.68.9" 
define NGINX_VER         "nginx/" NGINX_VERSION

http常见核心模块配置
基于不同的IP,不同的端口以及不同的域名实现不同的虚拟主机,依赖于核心模块 ngx_http_core_module实现
新建一个 PC web 站点、一个mobile web站点(写一个独立的配置文件,用主配置文件里的include包含)

创建pc网站配置
第一步:创建网站存放数据的文件夹
mkdir -p /data/nginx/html/{pc,mobile} pc端一个,移动端一个

第二步:cd /data/nginx/html/pc/
把拷贝的京东商城pc端页面两个文件夹拉进来
ls
index_files  index.html
把拷贝的京东商城移动端页面两个文件夹拉进来
ls
index_files  index.html

第三步:理论上把pc网站需要的配置放到主配置文件下的http语句就可以,但是为了后期管理方便,建议自己写的东西专门写一个独立的配置文件,用主配置文件里的include包含。
实际操作:
定义子配置文件路径
mkdir /apps/nginx/conf/conf.d
vim /apps/nginx/conf/nginx.conf
include /apps/nginx/conf/conf.d/*.conf;在配置文件的最后面添加此行,注意不要放在最前面,会导致前面的命令无法生效

第四步:cd /apps/nginx/conf/conf.d
创建网站配置文件
touch www.meng.org.conf   pc端
touch m.meng.org.conf     移动端
[root@ubunt conf.d]# ls
m.meng.org.conf  www.meng.org.conf

第五步:对www.meng.orrg.conf 写入配置
[root@ubunt conf.d]# vim www.meng.org.conf
server {
    listen 80;
    server_name www.meng.org;
    root /data/nginx/html/pc/;
}
对m.meng.org.conf 写入配置
server {
    listen 80;
    server_name m.meng.org;
    root /data/nginx/html/mobile/;
}
    
第五步:DNS解析

第六步:nginx -s reload

第七步:通过域名在网页上进行访问,测试是否完成www.meng.org   m.meng.org
如果直接访问ip,访问的结果是nginx自带的默认index.html文件
为什么出现这种情况?
因为我们把include /apps/nginx/conf/conf.d/*.conf;写在了配置文件/apps/nginx/conf/nginx.conf
的最下面,如果放在系统默认的server前面,再通过IP去访问,就会访问到排在第一个的移动端网站

如果在网站配置为文件中写入default_server;表示默认主机,否则排在前边的为默认主机
无论是通过ip还是域名都可以访问到这个网站
如:www.meng.org.conf
server {
    listen 80 default_server;
    server_name www.meng.org;
    root /data/nginx/html/pc/;
}
nginx -s reload
不论是ip还是www.meng.org 都可以访问到网站

grep -Ev "#|^$" /apps/nginx/conf/nginx.conf
把include /apps/nginx/conf/conf.d/*.conf;放在最后
现在在访问,会直接访问到默认网站
如:curl 10.0.0.100  会访问到nginx系统自带的index.html文件中
如果要求他访问到你指定的网站,需要加主机头
如:curl -v -H "host:www.meng.org" 10.0.0.100 |less

在一个物理服务器上建多个网站的方法有三种来区分(一般用主机头来区分)

第一:根据端口号区分
如:一个网站用80,一个用81,一个用82.但端口号区分,用户访问时得输地址加端口号
第二:ip来区分,不同的ip对应不同的网站
如:server{
listen    10.0.0.101:80;
}
第三:在server上加主机头
如:server{
server_name host: www.meng.org
}

root与alias

server {
    listen 80 ;
    server_name www.meng.org;
    root /data/nginx/html/pc/;
} 
其中root指得是存放网站页面的目录根路径,如果在网站上访问www.meng.org/test/index.html,得去/data/nginx/html/pc/下去找,如果不想test放在这里去找,而是放在/opt/pc/test/index.html下去找,怎么样才可以实现?

server {
    listen 80 ;
    server_name www.meng.org;
    root /data/nginx/html/pc/; 
    location /test/ {     使用alias的时候uri后面如果加了斜杠,则下面的路径配置必须加斜杠,否则403
     alias /opt/pc/;      要加都加,要不加都不加
    }
} 
nginx -s reload
意思是当你访问test这个文件夹时,去/opt/pc/test/找,而不是/data/nginx/html/pc/,只是针对test这个文件夹单独设置了一个特殊设置,其他的还是往/data/nginx/html/pc/找。
另外还需要为test创建一个文件夹
mkdir -p /opt/pc
touch /opt/pc/index.html
echo /opt/pc/index.html > /opt/pc/index.html
去网页访问test文件下的index.html
http://www.meng.org/test/index.html
结果就是/opt/pc/index.html

location的详细使用

在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;ngnix会根据用户请 求的URI来检查定义的所有location,按一定的优先级找出一个最佳匹配,而后应用其配置

在没有使用正则表达式的时候,nginx会先在server中的多个location选取匹配度最高的一个uri,uri是 用户请求的字符串,即域名后面的web文件路径,然后使用该location模块中的正则url和字符串,如果 匹配成功就结束搜索,并使用此location处理此请求.

location 官方帮助:

http://nginx.org/en/docs/http/ngx_http_core_module.html#location

语法规则:location [ = | ~ | ~ * | ^ ~] uri {...} 允许放在server语句块和location语句块

=       #用于标准uri前,需要请求字串与uri精确匹配,大小敏感,如果匹配成功就停止向下匹配并立即处理请求 
^~      #用于标准uri前,表示包含正则表达式,并且匹配以指定的正则表达式开头,对uri的最左边部分做匹配检查,不区分字符大小写
~       #用于标准uri前,表示包含正则表达式,并且区分大小写 
~*      #用于标准uri前,表示包含正则表达式,并且不区分大小写 
不带符号  #匹配起始于此uri的所有的uri \   #用于标准uri前,表示包含正则表达式并且转义字符.可以将 . * ?等转义为普通符号 
#匹配优先级从高到低: =, ^~, ~/,~*, 不带符号

官方示例

location = / {               如果访问http://www.meng.org/是可以的
    [ configuration A ]     这样http://www.meng.org/index.html 多了后面的就是不可以的
}                            后面必须是根

location / {                 如果访问http://www.meng.org/只要/开头都算
    [ configuration B ]      
} 

location /documents/ {   
    [ configuration C ] 
} 

location ^~ /images/ {      
    [ configuration D ]
} 
    
location ~* \.(gif|jpg|jpeg)$ {   如:http://www.meng.org/xxx/a.jpg
    [ configuration E ]           
} 
    
The “/” request will match configuration A(?), the “/index.html” request will match configuration B,
the “/documents/document.html” request will match configuration C, the “/images/1.gif” request will match configuration D, and the “/documents/1.jpg” request will match configuration E
如果访问http://www.meng.org/ 以上A和B是满足的 A的优先级高
如果访问http://www.meng.org/index.html 只有B是满足的
如果访问http://www.meng.org/decuments/decuments.htmlB和C都满足,优先级一样,但C匹配度更精确,C生效 
如果访问http://www.meng.org/images/1.gif BDE匹配 D优先级高,D生效
如果访问http://www.meng.org/decuments/1.jpg BCE满足,不带符号优先级最差,E高E生效

范例
在/apps/nginx/conf/conf.d下新建测试文件
vim test.conf
server {
   listen 80;
   server_name location.meng.org;
   location = / {
       default_type text/html;
       return 200 'location = /';
}
   location / {
       default_type text/html;
       return 200 'location /';
}
   location /documents/ {
       default_type text/html;
       return 200 'location /documents/';
}
   location ^~ /images/ {
       default_type text/html;
       return 200 'location ^~ /images/';
}
   location ~* \.(gif|jpg|jpeg)$ {
       default_type text/html;
       return 200 'location ~* \.(gif|jpg|jpeg)';
   }
}
nginx -s reload
DNS解析:location.meng.org   改/etc/hosts文件

测试结果如下,建议是curl测试
#1.请求http://location.meng.org/ 会被 location =/ 匹配
#2.请求http://location.meng.org/index.html 会被location / 匹配
#3.请求http://location.meng.org/documents/1.html 会被location /documents/ 匹配
#4.请求http://location.meng.org/images/1.gif 会被 location ^~ /images/ 匹配
#5.请求http://location.meng.org/documents/1.jpg 会被 location ~* \.(gif|jpg|jpeg)$匹配

利用优先级有什么作用?

可以根据不同的url做匹配,做分支判断。
例如带有资源的,用独立的代码来处理,而不用系统默认的根目录来处理,可以实现动静分离
静态资源如:html、css、js、jpg服务端什么样,客户端拿过来什么样,不变的
动态资源是程序:如php、jsp、scp 要在服务端运行,把运行结果封装成响应报文发给客户端

location @重定向

location @name 这样的location不用于常规请求处理,而是用于请求重定向

server {
    listen 80 ;
    server_name www.meng.org;
    root /data/nginx/html/pc/;
    error_page 404 @error_404;
    location @error_404 {
       default_type text/html;
       charset utf8;
       return 200 '你访问的页面可能走丢了!';
    }
}
访问一个不存在的页面,报状态码404,如果出现404状态码,则由@error_404;来处理,如何处理,就是返回你访问的页面可能走丢了
自定义错误处理,实现了这种情况下的特殊处理


举报

相关推荐

0 条评论