nginx 基础配置

380 阅读11分钟

全局调优

设置work进程和cpu核心数 相等

在许多服务器应用程序中,特别是使用多进程架构的(如某些Web服务器或代理服务器),将工作进程(work processes)的数量设置为与CPU核心数(cores)相等或相近,是一个常见的优化策略。这样可以确保每个CPU核心都被充分利用,从而提高整体的系统吞吐量。

nginx复制代码
	worker_processes auto; # 这将自动设置为CPU核心数  

	# 或者  

	worker_processes 4; # 如果你的CPU有4个核心

在Nginx的配置文件(通常是/etc/nginx/nginx.conf/etc/nginx/conf.d/default.conf)中,你可以设置worker_processes指令来指定工作进程数。

隐藏版本信息

#修改配置文件  放在   http语句中
http {
    server_tokens  off;

重新加载Nginx配置

使用命令sudo nginx -s reload

cpu亲缘性 ,将nginx进程和cpu进行一一对应绑定

CPU亲缘性(或称为CPU亲和性)是指将特定的任务或线程绑定到特定的CPU核心上执行的能力。在Nginx的上下文中,这意味着将Nginx的工作进程(worker processes)与CPU核心进行一一对应绑定,以确保Nginx的工作进程在特定的CPU核心上运行。

以下是将Nginx进程与CPU进行一一对应绑定的步骤:

  1. 确定CPU核心数量

    • 首先,需要知道服务器上有多少个CPU核心。这可以通过lscpunproccat /proc/cpuinfo等命令来查看。
  2. 配置Nginx的CPU亲缘性

    • Nginx允许通过配置文件中的worker_processesworker_cpu_affinity指令来设置工作进程的数量和它们与CPU核心的绑定关系。
    • worker_processes指令用于设置工作进程的数量,通常设置为CPU核心数。
    • worker_cpu_affinity指令用于指定每个工作进程应该绑定到哪些CPU核心上。这是一个位掩码,其中每一位对应一个CPU核心。
  3. 配置示例

    • 假设服务器有4个CPU核心,可以将Nginx配置为启动4个工作进程,并将每个工作进程绑定到一个不同的CPU核心上。
    • Nginx配置文件的相关部分可能如下所示:
	worker_processes 4;  

	worker_cpu_affinity 0001 0010 0100 1000;
  • 在这个例子中,worker_processes 4;表示启动4个工作进程。worker_cpu_affinity 0001 0010 0100 1000;是一个位掩码列表,每个掩码对应一个工作进程。第一个掩码0001表示第一个工作进程绑定到第一个CPU核心(从右往左数,最低位为第一个核心),第二个掩码0010表示第二个工作进程绑定到第二个CPU核心,以此类推。
  1. 重新加载Nginx配置

    • 在修改了Nginx的配置文件后,需要重新加载Nginx的配置以使更改生效。这可以通过发送HUP信号给Nginx的主进程(通常是nginx -s reload命令)来完成。
  2. 验证配置

    • 可以使用系统工具(如tophtopps命令配合grep nginx)来查看Nginx工作进程是否已绑定到指定的CPU核心上。

请注意,进程绑定CPU并不意味着进程独占CPU。除非特别设置,否则其他进程仍然可以在同一CPU核心上运行。此外,CPU亲缘性具有遗传性,即子进程通常会继承父进程的CPU亲缘性设置,但也可以通过系统提供的接口进行重新设置。

进程优先级

worker_priority 0; 
#工作进程优先级,-20~20(19)




[root@localhost ~]#ps axo pid,cmd,psr,ni|grep nginx|sort -n
#查看默认优先级,默认优先级为0
 18620 nginx: master process /usr/   3   0
 19045 nginx: worker process         0   0
 19046 nginx: worker process         1   0
 19082 vim /etc/nginx/nginx.conf     1   0
 19173 grep --color=auto nginx       1   0

修改配置文件
user nginx;
worker_processes 2;
worker_cpu_affinity 00000101 00000010;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
worker_priority -20;
#添加此项
nginx -s reload



[root@localhost ~]#ps axo pid,cmd,psr,ni|grep nginx|sort -n
 18620 nginx: master process /usr/   3   0
 19196 nginx: worker process         0 -20
 19197 nginx: worker process         1 -20
 19199 grep --color=auto nginx       1   0

进程打开的数量 nginx 系统

所有worker进程能打开的文件数量上限,包括:Nginx的所有连接(例如与代理服务器的连接等),而不仅仅是与客户端的连接,另一个考虑因素是实际的并发连接数不能超过系统级别的最大打开文件数的限制.最好与ulimit -n 或者limits.conf的值保持一致。

1. Nginx配置

在Nginx的配置文件中,并没有直接设置进程打开文件数量限制的指令。但是,Nginx的工作进程数量(通过worker_processes指令设置)和每个进程可以打开的文件数量限制(这取决于系统级别的设置)共同决定了Nginx能够处理的总文件数量。

2. 系统层面配置

永久设置

要永久地修改系统打开文件的最大数量限制,你需要编辑系统的配置文件。

  1. 修改/etc/security/limits.conf文件

    对于每个用户,你可以在该文件中设置软限制(soft limit)和硬限制(hard limit)。例如,要为所有用户设置打开文件的软限制为102400,硬限制也为102400,可以添加或修改以下行:

    复制代码
    	* soft nofile 102400  
    
    	* hard nofile 102400
    

    这里的*表示所有用户。如果你只想为特定用户设置限制,可以将*替换为用户名。

  2. 修改内核参数(可选)

    如果你运行的是服务器并且某些应用程序(如Nginx)需要更高的文件描述符限制,你可能还需要增加系统级别的文件描述符限制。这可以通过编辑/etc/sysctl.conf文件来实现。例如,要设置系统级别的文件描述符限制为500000,可以添加或修改以下行:

    bash复制代码
    	fs.file-max = 500000
    

    然后,你需要运行sysctl -p命令来应用更改,或者重启系统使更改生效。

  3. 重启Nginx服务

    在修改系统层面的设置后,你需要重启Nginx服务以使新的设置生效。

    bash复制代码
    	sudo systemctl restart nginx
    

    或者,如果你不是使用systemctl来管理Nginx,你可以使用适合你系统的命令来重启Nginx。

event 模型调优

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
}

server块构建虚拟主机

写子配置文件插在http语块中

image.png

alias 别名

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
       }
}

location匹配

在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;ngnix会根据用户请求的URI来检查定义的所有location,按一定的优化级找出一个最佳匹配,而后应用其配置在没有使用正则表达式的时候,nginx会先在server中的多个location选取匹配度最高的一个uri

 #语法规则:
location [ = | ~ | ~* | ^~ ] uri { ... }

=              	#用于标准url前,需要请求字串与uri精确匹配,大小敏感,如果匹配成功就停止向下匹配并立即处理请求
^~            	#用于标准url前,表示包含正则表达式,并且匹配以指定的正则表达式开头,对URI的最左边部分做匹配检查,不区分字符大小写
~              	#用于标准url前,表示包含正则表达式,并且区分大小写
~*            	#用于标准url前,表示包含正则表达式,并且不区分大写
不带符号   	  	 #匹配起始于此uri的所有的uri

#\            	#用于标准url前,表示包含正则表达式并且转义字符。可以将 . * ?等转义为普通符号

#匹配优先级从高到低:
=, ^~, ~/~*, 不带符号

access 模块 四层控制

查看模块是否默认安装nginx.org/en/docs/htt…


[root@localhost nginx-1.18.0]#./configure --help |grep access
# 可以去源码包中 过滤  access模块  自带 不想要可以 without 去掉 
  --without-http_access_module       disable ngx_http_access_module
  --http-log-path=PATH               set http access log pathname
  --without-stream_access_module     disable ngx_stream_access_module



配置文件修改
server {
   listen 80;
   server_name www.kgc.com;
#   allow 192.168.100.0/24;
   deny 192.168.100.101;
   location / {
        root /data/nginx/html/pc;
 }
}

匹配了之后就不往下匹配了
所以范围小的往上

验证模块 需要输入用户名和密码

htpasswd

此命令来自于 httpd-tools 包,如果没有安装 一下即可

使用方法:

第一次生成文件
htpasswd -c  文件路径 姓名        	 交互式生成密码
htpasswd -bc 文件路径 姓名 密码   		直接将密码跟在后面 

-c  代表新建用户名和密码对应的文件
-b  将密码跟在用户名后

非第一次
htpasswd     文件路径 姓名        	 交互式生成密码
htpasswd -b  文件路径 姓名 密码   		直接将密码跟在后面 

第一次
[root@localhost conf.d]#htpasswd -bc /apps/nginx/conf.d/.httpuser kgc 123456
#没有  yum install  httpd-tools    -b  将名字密码跟在后面    -c  新建文件
Adding password for user kgc
[root@localhost conf.d]#cat /apps/nginx/conf.d/.httpuser 
kgc:$apr1$RtjFE23R$lf2n.YpdssSf1EYJbIDqT0

非第一次
[root@localhost error]#htpasswd /apps/nginx/conf.d/.httpuser xiaoming
New password: 
Re-type new password: 
Adding password for user xiaoming

自定义错误页面

error_page code ... [=[response]] uri;
页面错误代码  
error_page    固定写法
code          响应码
=             可以将响应码转换
uri           访问连接
自定义 错误码
server {
   listen 80;
   server_name www.kgc.com;
   root /data/nginx/html/pc;
   error_page 404 =302 /40x.html;
   #把错误码 404 指定成302    注意此处的  40x.html 需要真实存在建立的页面必须一致
   location = /40x.html {
        root /data/nginx/html/pc/error/;
 }
   location / {
        root /data/nginx/html/pc;
 }
   location /admin{
        auth_basic    "admin site";
        auth_basic_user_file /apps/nginx/conf.d/.httpuser;
 }
}




#出了错  直接跳转到显示主站点
server {
   listen 80;
   server_name www.kgc.com;
   root /data/nginx/html/pc;
   error_page 404 =302 /index.html;
   #把错误码 404 指定成302  并跳到主页面:/index.html

日志分离

vim /apps/nginx/conf.d/m.conf
server{
        listen 80;
        server_name  www.m.com;
        root /data/nginx/m/;
        error_log    /data/logs/m_error.log;
        access_log  /data/logs/m_access.log;
}
 [root@localhost error]#mkdir /data/logs
 nginx -t
 nginx -s reload

长连接

ttp 基于 tcp 协议 先要 三次握手然后 再传输数据

一次三次握手 下载多个资源

keepalive_requests 3;
#最大下载三个资源就会断开
keepalive_timeout 60 65;   #只能有一个空格 
#开启长连接后,返回客户端的会话保持时间为60s,单次长连接累计请求达到指定次数请求或65秒就会被断开,后面的60为发送给客户端应答报文头部中显示的超时时间设置为60s:如不设置客户端将不显示超时时间。
Keep-Alive:timeout=60  #浏览器收到的服务器返回的报文
#如果设置为0表示关闭会话保持功能,将如下显示:
Connection:close  #浏览器收到的服务器返回的报文
#使用命令测试:
[root@centos8 ~]# telnet www.kgc.org 80

长连接可以减少网络请求次数和延迟,提高网络效率,但如果连接数量过多,会占用服务器资源,增加服务器负载。在某些情况下,短连接可能更为合适,因为它们可以更快地释放资源,更好地处理异常情况。

http {  
    keepalive_timeout 0;  
    # ... 其他配置 ...  
}

变量