第八章 必要的全局配置选项
8.1 Nginx配置文件详解
俗话说”人靠衣裳马靠鞍”,Nginx
也要进行配置才能够使用,我们看一下怎样才能把Nginx
打扮的漂漂亮亮的吧。
user nobody; #启动Nginx工作进程的用户和组
worker_processes auto; #启动Nginx工作进程的数量,auto:自动根据当前服务器的核数来定义
worker_cpu_affinity 00000001 00000010 00000100 00001000; #将Nginx⼯作进程绑定到指定的CPU核⼼,默认Nginx是不进⾏进程绑定的,绑定并不是意味着当前nginx进程独占以⼀核⼼CPU,但是可以保证此进程不会 运⾏在其他核⼼上,这就极⼤减少了nginx的⼯作进程在不同的cpu核⼼上的来回跳转,减少了CPU对进程的资源分配与 回收以及内存管理等,因此可以有效的提升nginx服务器的性能。
error_log "/worker/log/error.log" warn; #错误日志记录配置
pid "/worker/pid/nginx.pid"; #pid文件保存路径
worker_priority 0; #⼯作进程nice值,-20~19
worker_rlimit_nofile 65536; #这个数字包括Nginx的所有连接(例如与代理服务器的连接等),⽽不仅仅是与客⼾端的连接,另⼀个考虑因素是实际的并发连接数不能超过系统级别的最⼤打开⽂件数的限制
daemon off; #前台运⾏Nginx服务⽤于测试、docker等环境。
events {
use epoll; #使用epoll事件驱动,Nginx支持众多的时间驱动,比如select、poll、epoll,只能设置在events模块中设置
worker_connections 65536; #设置单个工作进程的最大并发连接数
accept_mutex on; #优化同⼀时刻只有⼀个请求⽽避免多个睡眠进程被唤醒的设置,on为防⽌被同时唤醒默认为off,全部唤醒的过程也成为"惊群",因此nginx刚安装完以后要进⾏适当的优化。
multi_accept on; #Nginx服务器的每个⼯作进程可以同时接受多个新的⽹络连接,但是需要在配置⽂件中配置,此指令默认为关闭,即默认为⼀个⼯作进程只能⼀次接受⼀个新的⽹络连接,打开后⼏个同时接受多个。
}
http {
include mime.types; #导入支持的文件类型
default_type application/octet-stream; #设置默认的类型,会提示下载不匹配的类型文件
#日志配置部分
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 "/worker/log/access.log" main; #定义访问日志的路径
server_tokens on; #是否在响应报文的server首部显示nginx版本
server_names_hash_bucket_size 128;
client_header_buffer_size 4k;
large_client_header_buffers 4 32k;
client_max_body_size 20m; #设置允许客户端上传单个文件的最大值,默认值为1m,上传文件超过此值会出现413错误
client_body_buffer_size 4m; #用于接收每个客户端请求报文的body部分的缓冲大小。默认为16K。超出此大小时,其将被暂存到磁盘上的由下面client_body_temp_path指令所定义的位置
client_body_temp_path path; #设定存储客户端请求报文的body部分的临时存储路径及子目录结构和数量,目录名为16进制的数字,使用hash之后的值从后往前截取1位、2位、2位作为目录名。
sendfile on; #实现文件零拷贝
tcp_nopush on; #在开启了sendfile的情况下,合并请求后统⼀发送给客⼾端
tcp_nodelay on; #在开启了keepalived模式下的连接是否启⽤TCP_NODELAY选项,当为off时,延迟0.2s发送,默认On时,不延迟发送,⽴即发送⽤⼾相应报⽂
keepalive_timeout 65 65; #设置会话保持时间,0表示禁止长连接,默认为75s,通常配置在http字段作为站点全局配置
keepalive_requests 3; #在一次长连接上所允许请求的资源的最大数量,默认为100次,建议适当调大,比如:500
#开启长连接后,返回客户端的会话保持时间为60s,单次长连接累计请求达到指定次数请求或65秒就会被断开,后面的65是发送给客户端响应报文头部中显示的超时时间,如果不设置客户端将不显示超时时间。
gzip on; #开启文件压缩
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
server {
listen 80; #设置监听地址和端口
server_name www.test.com; #定义主机名
charset utf-8; #设置编码格式,默认是俄语格式,可以改为utf-8
location ~ \.php$ { #以http的⽅式转发php请求到指定web服务器
root /project/src;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi.conf;
}
location / {
root /static;
}
}
}
上面是一个真实服务器中Nginx
配置的简略版,”麻雀虽小五脏俱全”,它配置了一个HTTP
服务器,可以处理静态文件以及php
动态请求。
我们先使用这个配置文件启动一下Nginx
,来体验一下……
8.2 root和alias
root:指定web的家目录,在定义location的时候,文件的绝对路径等于 root+location,如:
server {
listen 80;
server_name www.magedu.net;
location / {
root /data/nginx/html/pc;
}
location /about {
root /data/nginx/html/pc; #必须要在html⽬录中创建⼀个about⽬录才可以访问,否则报错。
index index.html;
}
}
[root@d799c03b449d pc]# mkdir /data/nginx/html/pc/about
[root@d799c03b449d pc]# echo pc > /data/nginx/html/pc/index.html
[root@d799c03b449d pc]# echo about > /data/nginx/html/pc/about/index.html
重启nginx并访问测试
alias:定义路径别名,会把访问的路径重新定义到其指定的路径,如:
server {
listen 80;
server_name www.magedu.net;
location / {
root /data/nginx/html/pc;
}
location /about { #使用alias的时候uri后面如果加了斜杠则下面的路径配置必须加斜杠,否则403
alias /data/nginx/html/pc; #当访问about的时候,会显示alias定义的/data/nginx/html/pc里面的内容。
index index.html;
}
}
重启Nginx并访问测试
http://www.magedu.net/about/index.html #访问指定文件资源
8.3 全局配置
1、user指令
我们知道,操作系统中的所有资源都具有所属者以及其他各种访问权限(强大的Linux
也不例外~)。这种权限控制可以让操作系统变得很安全,防止黑客破坏我们的系统。Nginx
提供了user
全局配置指令来设置worker
进程的所属者,这样就可以让Nginx
访问特定权限的资源,保护我们服务器的稳定性。
我们可以通过ps
命令查看worker
进程,可以看到这个进程的所属者是nobody
用户。
我们下面体验一下这个user
的作用。
在上面体验Nginx
的时候,我们成功的访问到了服务器上面的hello.html
文件,并且返回了hello Nginx
字符串。
下面我们修改hello.html
文件的权限,删除nobody
的可读权限,重新访问这个文件,这个时候Nginx
就会返回403
错误。
这里就是user
指令的作用,大家是否熟悉了呢?
2、worker_processes 指令
我们前面说过,Nginx
是一个Master-Worker
的工作模式。Nginx
在启动之后会生成一个master
进程,master
不处理请求,而是生成和管理worker
进程,worker
进程主要负责干活(处理请求)。
那么大家可能要问了?这个值应该设置为多大呢?是不是这个值越大越好?当然不是了,我们看一下大神们给出的建议:
nginx doesn't benefit from more than one worker per CPU.
If Nginx is doing CPU-intensive work such as SSL or gzipping and you have 2 or more CPUs/cores, then you may set worker_processes to be equal to the number of CPUs or cores.
###################################################################
nginx不会从每个CPU超过一个worker中获益。
如果Nginx正在进行CPU密集型的工作,比如SSL或gzip,并且您有2个或更多的CPU/核心,那么您可以将worker_进程设置为等于CPU或核心的数量。
所以worker_processes
的值并不是越多越好,最好是和我们服务器CPU
核数量一样。Nginx
提供了一个默认的auto
值就是这样的原理。
3、event配置
event
是配置Nginx
使用的事件处理机制的。我们一般选择epoll
模型
4、location配置
在一个server中location配置段可存在多个,用于实现uri到文件系统的路径映射。nginx会根据用户请求的URI来检查定义的所有location,按一定的优化级找出一个最佳匹配,而后应用其配置。
在没有使用正则表达式的时候,nginx会先在server中的多个location选取匹配度最高的一个uri,uri是用户请求的字符串,即域名后面的web文件路径,然后使用该location模块中的正则url和字符串,如果匹配成功就结束搜索,并使用此location处理此请求。
#语法规则
= 严格匹配。如果这个查询匹配,那么将停止搜索并立即处理此请求。
~ 为区分大小写匹配(可用正则表达式)
!~为区分大小写不匹配
~* 为不区分大小写匹配(可用正则表达式)
!~*为不区分大小写不匹配
^~ 如果把这个前缀用于一个常规字符串,那么告诉nginx 如果路径匹配那么不测试正则表达式。
不带符号 匹配起始于此uri的所有的uri
#匹配优先级从高到低
= ^~ ~/~* 不带符号
列子,有如下匹配规则:
location = / {
#规则A
}
location = /login {
#规则B
}
location ^~ /static/ {
#规则C
}
location ~ \.(gif|jpg|png|js|css)$ {
#规则D
}
location ~* \.png$ {
#规则E
}
location !~ \.xhtml$ {
#规则F
}
location !~* \.xhtml$ {
#规则G
}
location / {
#规则H
}
那么产生的效果如下:
访问根目录/, 比如http://localhost/ 将匹配规则A
访问 http://localhost/login 将匹配规则B,http://localhost/register 则匹配规则H
访问 http://localhost/static/a.html 将匹配规则C
访问 http://localhost/a.gif, http://localhost/b.jpg 将匹配规则D和规则E,但是规则D顺序优先,规则E不起作用,而 http://localhost/static/c.png 则优先匹配到 规则C
访问 http://localhost/a.PNG 则匹配规则E, 而不会匹配规则D,因为规则E不区分大小写。
访问 http://localhost/a.xhtml 不会匹配规则F和规则G,http://localhost/a.XHTML不会匹配规则G,因为不区分大小写。规则F,规则G属于排除法,符合匹配规则但是不会匹配到,所以想想看实际应用中哪里会用到。
访问 http://localhost/category/id/1111 则最终匹配到规则H,因为以上规则都不匹配,这个时候应该是nginx转发请求给后端应用服务器,比如FastCGI(php),tomcat(jsp),nginx作为方向代理服务器存在
实际的生产环境:
#直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说。
#这里是直接转发给后端应用服务器了,也可以是一个静态首页
# 第一个必选规则
location = / {
proxy_pass http://tomcat:8080/index
}
# 第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项
# 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ^~ /static/ {
root /webroot/static/;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
root /webroot/res/;
}
#第三个规则就是通用规则,用来转发动态请求到后端应用服务器
#非静态文件请求就默认是动态请求,自己根据实际把握
#毕竟目前的一些框架的流行,带.php,.jsp后缀的情况很少了
location / {
proxy_pass http://tomcat:8080/
}