nginx配置文件路径
不同安装方式,nginx的文件存放路径也有所不同。
源码安装配置文件路径:在安装目录下的conf目录下,比如我的安装目录是/usr/local/nginx,那么他的配置文件就在/usr/local/nginx/conf目录下。
yum安装配置文件路径:在/etc/nginx/目录(主配置文件)与/etc/nginx/conf.d目录下。
nginx配置文件的结构
通常源码安装的nginx的配置文件,会是下面这种结构,yum安装的有细微差异(大致是一样的,只是server是通过include引用的独立配置文件)
http{
upstream{
}
server{
location xxx{
if(xxx){
}
}
location xxx{
........
}
}
server {
......
}
}
location里面还有if块,一般if块不会出现的太多,它是会在比较复杂配置当中做一些条件的判断。
一般只配置一个http,这样就一个实例
对于HTTP块来说里面可能有多个server块。对于每个server块来说,里面可能有多个location块。
1、main全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
2、events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
4、server块:配置虚拟主机的相关参数,一个http中可以有多个server。
5、location块:配置请求的路由,以及各种页面的处理情况。
nginx.conf
HTTP 的配置项必须直属于 http 块、 server 块、 location 块、 upstream 块或 if 块
server可以写在其他文件当中,通过include指令,将其他文件当中的配置包含到nginx.conf当中,使其生效。
当然了你也可以使用其他的配置文件,你启动nginx的时候配置一下。
文件路径的定义:设置资源路径、设置访问首页、重定向
内存与磁盘资源的分配:包体只存储在磁盘、存储 HTTP 头的内存大小
网络连接的设置:读取 HTTP 头部的超时时间、读取 HTTP 包体的超时时间
MIME 类型的设置:默认 MIME type 、 MIME type 文件扩展映射
对客户端请求的限制:按 HTTP 方法名限制请求、 HTTP 请求包体的最大值
文件操作的优化: sendfile 系统调用、打开文件缓存
对客户端请求的特殊处理:忽略不合法的 HTTP 头部、 DNS 解析地址
解析配置文件
全局配置(设置的指令将影响其他所有设置,一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等)
- user nginx;
指定nginx的工作进程的用户及用户组,默认是nobody用户。
[root@localhost ~]# ps -ef | grep nginx
nobody 14303 14302 0 16:01 ? 00:00:00 nginx: worker process
通常而言,会给其定义一个用户。如user nginx,那么nginx就有权限来管理其发布目录。这个用户必须存在
- worker_processes 8; --指定工作进程的个数,默认是1个。具体可以根据服务器cpu数量进行设置,比如cpu有4个,可以设置为4。一般来说,worker_processes会设置成CPU个数,如果不知道cpu的数量,可以设置为auto。nginx会自动判断服务器的cpu个数,并设置相应的进程数。(使用lscpu来查看你的cpu的个数)
- worker_cpu_affinity:为每个进程分配CPU,将八个进程分配给8个CPU,当然也可以写多个,或者将一个进程分配给多个CPU
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
- worker_rlimit_nofile 65535; 进程的最大打开文件数限制。这样nginx就不会有“too many open files”问题了,最好与ulimit -n的值保持一致。
[root@localhost ~]# /usr/local/nginx/sbin/nginx -s reload --重新加载配置文件可以看到效果,worker进程由nginx来管理,不是由原来的nobody来管理,而且有两个worker进程在工作
[root@localhost ~]# ps -ef | grep nginx
root 14302 1 0 16:01 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 14444 14302 0 17:55 ? 00:00:00 nginx: worker process
nginx 14445 14302 0 17:55 ? 00:00:00 nginx: worker process
master进程和worker进程的关系:master进程是nginx最主要的一个进程。主要是用来接收管理员给其发出的信号。Master下面可以由多个worker进程,可以根据其配置文件生成多个worker进程。worker进程就是用来接收用户的请求,所有进程都可以去抢用户的请求,没有互斥锁。如果多个worker的其中一个进程挂掉了,那么master进程会回收该进程,并生成新的worker进程,是永远保持你配置文件里指定的worker进程数进行工作的。
[root@localhost ~]# ps -ef | grep nginx
root 14302 1 0 16:01 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 14444 14302 0 17:55 ? 00:00:00 nginx: worker process
nginx 14445 14302 0 17:55 ? 00:00:00 nginx: worker process
root 14465 14400 0 18:09 pts/0 00:00:00 grep --color=auto nginx
[root@localhost ~]# kill -9 14444 --可以看到杀死其中的一个worker进程,那么master立马就生成新的worker进程
[root@localhost ~]# ps -ef | grep nginx
root 14302 1 0 16:01 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 14445 14302 0 17:55 ? 00:00:00 nginx: worker process
nginx 14466 14302 0 18:10 ? 00:00:00 nginx: worker process
- error_log logs/error.log; --默认使用这个
#error_log logs/error.log notice;
#error_log logs/error.log info;
设置nginx的错误日志路径,并设置相应的输出级别。如果编译时没有指定编译调试模块,那么 info就是最详细的输出模式了。
如果有编译debug模块,那么debug时最为详细的输出模式。这里设置为默认就好了。
pid logs/nginx.pid;
指定nginx进程pid的文件路径 ,Nginx进程是作为系统守护进程在进行,需要在某个文件中保存当前运行程序的主进程号,
events {
use epoll;
worker_connections 1024;
multi_accept on
}
multi_accept off
– A worker process accepts one new connection at a time (the default). If enabled, a worker process accepts all new connections at once.We recommend keeping the default value (off
), unless you’re sure there’s a benefit to changing it. Start performance testing with the default value to better measure predictable scale.
multi_accept on:设置是否允许同时接受多个网络连接,只能在events模块设置,Nginx服务器的每个工作进程可以同时接受多个新的网络连接,但是需要在配置文件中配置,此指令默认为关闭,即默认为一个工作进程只能一次接受一个新的网络连接,打开后几个同时接受多个。
events :这个指令块用来设置工作进程的工作模式以及每个进程的连接上限。
use :用来指定nginx的工作模式,通常选择epoll,除了epoll,还有select,poll。
worker_connections :定义每个工作进程的最大连接数,默认是1024。
http指令块,即web服务器的相关配置
include: include是一个引用函数 mime.types; 定义数据类型
如果用户请求lutixia.png,服务器上有lutixia.png这个文件,后缀名是png,根据mime.types,这个文件的数据类型应该是image/png,将Content-Type的值设置为image/png,然后发送给客户端
- default_type application/octet-stream:设定默认类型为二进制流,也就是当文件类型未定义时使用这种方式,例如在没有配置PHP环境时,Nginx是不予解析的。此时,用浏览器访问PHP文件就会出现下载窗口。
- 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,可以自定义该名字。也可以通过添加,删除变量来自定义日志文件的格式,main后面的内容定义了日志的格式。
- access_log :定义访问日志的存放路径,并且通过引用log_format所定义的main名称引用其输出格式,如果定义了多个日志格式,可以来引用其中一种格式
[root@localhost conf]# tail -f /usr/local/nginx/logs/access.log
192.168.179.99 - - [07/Mar/2020:20:51:30 +0800] "GET /index.html HTTP/1.0" 200 612 "-" "ApacheBench/2.3"
127.0.0.1 - - [07/Mar/2020:21:35:29 +0800] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0"
- sendfile on :用于开启高效文件传输模式。直接将数据包封装在内核缓冲区,然后返给客户,将tcp_nopush和tcp_nodelay两个指令设置为on用于防止网络阻塞。
tcp_nopush on;
tcp_nodelay on;
- keepalive_timeout 65 :设置客户端连接保持活动的超时时间。在超过这个时间之后,服务器会关闭该连接。
HTTP 有一个 KeepAlive 模式,它告诉 webserver 在处理完一个请求后保持这个 TCP 连接的打开状态。若接收到来自客户端的其它请求,服务端会利用这个未被关闭的连接,而不需要再建立一个连接。
提示:可以用netstat -ntlpa |grep 80 查看链接状态
[root@localhost ~]# netstat -ntplna | grep 80 --使用浏览器浏览nginx门户网站,然后看到建立连接了
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 14875/nginx: master
tcp 0 0 192.168.179.99:80 192.168.179.4:62065 ESTABLISHED 15340/nginx: worker
[root@localhost ~]# netstat -ntplna | grep 80 --65秒之后再看看,可以看到断开连接了
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 14875/nginx: master
tcp 0 0 192.168.179.99:80 192.168.179.4:62065 TIME_WAIT -
- keepalive_requests 100; 设置nginx在保持连接状态最多能处理的请求数,到达请求数,即使还在保持连接状态时间内,也需要重新连接。
这个值根据生存环境而设定,比如京东的网页,访问首页的请求就100多次了,比如每个图片都是一个资源,都需要请求,所以要根据网页的文件个数来设定。(对于爬虫的程序65秒足够将官网的数据爬完,所以除了定义keepalive_timeout的值之外还可以限制在65秒内可以访问多少次)
- gzip on :开启压缩功能,减少文件传输大小,节省带宽。
- gzip_min_length:设置最小的压缩长度,官方设置1K,如果文件大小小于1K,不进行压缩,大于1K就需要压缩gzip_min_length 1k;(当返回内容大于此值时才会使用gzip进行压缩,以K为单位,当值为0时,所有页面都进行压缩。)
- gzip_types:压缩的类型,设置需要压缩的MIME类型,如果不在设置类型范围内的请求不进行压缩。图片视频一般是已经压缩了的,再压缩效果也不是很大,所以需要压缩的格式为XML格式。gizp_types text/plain text/xml;(将普通文件和XML文件进行压缩)
[root@localhost epel-source]# ls -lh /var/cache/yum/x86_64/7/epel/metalink.xml -rw-r--r-- 1 root root 8.8K Mar 8 10:48 /var/cache/yum/x86_64/7/epel/metalink.xml --将.xm文件拷贝到nginx的发布目录下面去,大小为8.8K
[root@localhost epel-source]# cp /var/cache/yum/x86_64/7/epel/metalink.xml /usr/local/nginx/html/
然后打开浏览器去访问.xml文件,可以看到压缩后只有2.1K,可以看到压缩了四分之一
- gzip_comp_level 3; 压缩级别,默认是1,一般设置为3
server指令块:用于定义虚拟主机的,指令主要用于指定主机和端口
一个server表示一个网站
- server :用来定义虚拟主机
- listen :设置监听端口,默认为80端口,端口可以根据需要修改为8080
- server_name :网站域名,多个域名通过逗号隔开,默认是localhost,可以修改为www.lutixia.com;
[root@localhost ~]# netstat -tpln | grep 8080
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 14875/nginx: master
测试一下(端口8080 域名 www.lutixia.com)
修改windows C:\Windows\System32\drivers\etc下的hosts文件,用来解析域名
加上这一行 192.168.179.99 www.lutixia.com
如果要解析多个域名 192.168.179.99 www.lutixia1.com www.lutixia2.com www.lutixia3.com
可以看到访问成功了!
- charset :设置网页的默认编码格式,一般设置为charset utf-8;
- access_log :指定该虚拟主机的独立访问日志,会覆盖前面的全局配置日志文件。如果有有多个虚拟主机,那么每个虚拟主机都需要配置自己的access_log
- access_log logs/lutixia.access.log main; --如果这样配置,那么就会覆盖全局的日志文件,这个引用main是前面定义的日志格式
[root@www ~]# ls /usr/local/nginx/logs/
access.log error.log lutixia.access.log nginx.pid
[root@www logs]# tail -1f /usr/local/nginx/logs/lutixia.access.log
192.168.179.4 - - [08/Mar/2020:20:08:58 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.100 Safari/537.36" "-"
location指令块:配置请求的路由,以及各种页面的处理情况
location / {
root html;
index index.html index.htm;
}
location:来定义资源路径,默认是直接给一个/根目录,所有资源都从根目录下去找,这个根目录就是发布目录
- index :设置默认的索引文件
- error_page :定义访问错误返回的页面,凡是状态码是500 502 503 504 都会返回这个页面。
[root@www html]# vim /usr/local/nginx/html/404.html --这个error page得自己去定义
[root@www html]# cat /usr/local/nginx/html/404.html
"this is error page,file not found!"
error_page 404 =200 /404.html; --定义返回的状态码为200
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html; }
这是第二种定义找不到页面的方法,其实和上面的error_page 404 =200 /404.html是一样的,上面可以写成
error_page 404 =200 /404.html;
location=/404.html{
root html; --这里的root html代表根目录是html,这里的root不是root用户,是代表根目录符号/
}
error_page 404 =200 /404.html;
location=/404.html{
root /data/; --root /data/表示根目录为绝对路径/data/,那么必须保证/data/下有404.html
}
root /data/表示根目录为绝对路径/data/
还是使用第一种最直观 error_page 404 =200 /404.html;