Nginx《三》——Nginx基础配置介绍

Nginx《一》——I/O模型以及web服务介绍
Nginx《二》——Nginx基础服务介绍以及编译安装、配置

Nginx 核心配置详解

默认基础配置

配置指令参考文件

root@make-install:~# grep -Ev "#|^$" /apps/nginx/conf/nginx.conf
user  nginx;
worker_processes  1;
pid        /apps/nginx/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

root@make-install:~#grep -v "#" /apps/nginx/conf/nginx.conf | grep -v "^$"
#全局配置端,对全局⽣效,主要设置nginx的启动⽤⼾/组,启动的⼯作进程数量,⼯作模式,Nginx的PID路径,⽇
志路径等。
user nginx nginx;
worker_processes 1; #启动⼯作进程数数量
events { #events设置快,主要影响nginx服务器与⽤⼾的⽹络连接,⽐如是否允许同时接受多个⽹络连接,使⽤哪
种事件驱动模型处理请求,每个⼯作进程可以同时⽀持的最⼤连接数,是否开启对多⼯作进程下的⽹络连接进⾏序列化
等。
worker_connections 1024; #设置单个nginx⼯作进程可以接受的最⼤并发,作为web服务器的时候最
⼤并发数为worker_connections * worker_processes,作为反向代理的时候为(worker_connections *
worker_processes)/2
}
http { #http块是Nginx服务器配置中的重要部分,缓存、代理和⽇志格式定义等绝⼤多数功能和第三⽅模块都可以
在这设置,http块可以包含多个server块,⽽⼀个server块中⼜可以包含多个location块,server块可以配置⽂
件引⼊、MIME-Type定义、⽇志⾃定义、是否启⽤sendfile、连接超时时间和单个链接的请求上限等。
include mime.types;
default_type application/octet-stream;
sendfile on; #作为web服务器的时候打开sendfile加快静态⽂件传输,指定是否使⽤sendfile系
统调⽤来传输⽂件,sendfile系统调⽤在两个⽂件描述符之间直接传递数据(完全在内核中操作),从⽽避免了数据在内
核缓冲区和⽤⼾缓冲区之间的拷⻉,操作效率很⾼,被称之为零拷⻉,硬盘 >> kernel buffer (快速拷⻉到
kernelsocket buffer) >>协议栈。
keepalive_timeout 65; #⻓连接超时时间,单位是秒 默认不显示 在后再加一个数字是给用户访问显示的 
server { #设置⼀个虚拟机主机,可以包含⾃⼰的全局快,同时也可以包含多个location模块。⽐如本虚拟机
监听的端⼝、本虚拟机的名称和IP配置,多个server 可以使⽤⼀个端⼝,⽐如都使⽤80端⼝提供web服务、
listen 80; #配置server监听的端⼝
server_name localhost; 本server的名称,当访问此名称的时候nginx会调⽤当前serevr内部的配
置进程匹配。
location / { #location其实是server的⼀个指令,为nginx服务器提供⽐较多⽽且灵活的指令,都是
在location中提现的,主要是基于nginx接受到的请求字符串,对⽤⼾请求的UIL进⾏匹配,并对特定的指令进⾏处
理,包括地址重定向、数据缓存和应答控制等功能都是在这部分实现,另外很多第三⽅模块的配置也是在location模
块中配置。
root html; #相当于默认⻚⾯的⽬录名称,默认是相对路径,可以使⽤绝对路径配置。这里是/apps/nginx/这个相对路径
index index.html index.htm; #默认的⻚⾯⽂件名称 先找index.html ,没有再去找ndex.htm
		}
error_page 500 502 503 504 /50x.html; #错误⻚⾯的⽂件名称
location = /50x.html { #location处理对应的不同错误码的⻚⾯定义到/50x.html,这个跟对应其
server中定义的⽬录下。
root html; #定义默认⻚⾯所在的⽬录
		}
	}
#和邮件相关的配置
#mail {
# ...
# 	  } mail 协议相关配置段
#tcp代理配置,1.9版本以上⽀持
#stream {
# ...
# 		} stream 服务器相关配置段
#导⼊其他路径的配置⽂件
#include /apps/nginx/conf.d/*.conf
}

全局配置

user nginx nginx; #启动Nginx⼯作进程的⽤⼾和组 注意这里需要加对应的权限

Syntax:	worker_cpu_affinity cpumask ...;
worker_cpu_affinity auto [cpumask];
Default:	—
Context:	main
worker_processes [number | auto]; #启动Nginx⼯作进程的数量 自动判断内核核心数
worker_cpu_affinity 00000001 00000010 00000100 00001000; #将Nginx⼯作进程绑定到指定的CPU核⼼,默认Nginx是不进⾏进程绑
定的,绑定并不是意味着当前nginx进程独占以⼀核⼼CPU,但是可以保证此进程不会运⾏在其他核⼼上,这就极⼤减少了nginx的⼯作进程在不同
的cpu核⼼上的来回跳转,减少了CPU对进程的资源分配与回收以及内存管理等,因此可以有效的提升nginx服务器的性能。
一般工作中可以把前面2个CUP空闲出来,前面2个cpu使用率比较高
root@apt-install:~# taskset -h  #绑定cpu命令 
root@apt-install:~# ps axo pid,cmd,psr,user |grep nginx  #查看Nginx绑定在那个cup中
  3761 nginx: master process nginx   0 root
  3762 nginx: worker process         0 nginx
  4716 grep --color=auto nginx       0 root

可以编辑一个死循环访问nginx页面服务,然后去看进程看psr参数是否变化
优化CPU来回切换的CPU资源

root@apt-install:~# while : ; do curl http://172.20.32.110;sleep 1;done

错误日志记录配置

#错误⽇志记录配置,语法:error_log file [debug | info(默认) | notice | warn | error | crit |
alert | emerg]
#error_log logs/error.log;
#error_log logs/error.log notice;
error_log /apps/nginx/logs/error.log error;

#pid⽂件保存路径
pid /apps/nginx/logs/nginx.pid;

worker_priority 0; #⼯作进程nice值,-20~19   一般默认即可 

worker_rlimit_nofile 65536; #这个数字包括Nginx的所有连接(例如与代理服务器的连接等),⽽不仅仅是与
客⼾端的连接,另⼀个考虑因素是实际的并发连接数不能超过系统级别的最⼤打开⽂件数的限制.

root@make-install:/apps/nginx/conf# ulimit -n
1000000

root@make-install:~#  watch -n1 'ps -axo pid,cmd,nice | grep nginx' #验证进程优先级

daemon off; #前台运⾏Nginx服务⽤于测试、docker等环境。默认打开

master_process off|on; #是否开启Nginx的master-woker⼯作模式,仅⽤于开发调试场景。

events {     #事件模型配置参数
worker_connections 65536;   #设置单个⼯作进程的最⼤并发连接数

use epoll; #使⽤epoll事件驱动,Nginx⽀持众多的事件驱动,⽐如select、poll、epoll,只能设置在events模块中设置。

accept_mutex on; #优化同⼀时刻只有⼀个请求⽽避免多个睡眠进程被唤醒的设置,on为防⽌被同时唤醒默认为off,全部唤醒的过
程也成为"惊群",因此nginx刚安装完以后要进⾏适当的优化。

multi_accept on; Nginx服务器的每个⼯作进程可以同时接受多个新的⽹络连接,但是需要在配置⽂件中配置,此指令默认为关
闭,即默认为⼀个⼯作进程只能⼀次接受⼀个新的⽹络连接,打开后⼏个同时接受多个。
Syntax:	multi_accept on | off;
Default:	multi_accept off;
Context:	events
If multi_accept is disabled, a worker process will accept one new connection at a time. 
Otherwise, a worker process will accept all new connections at a time.
}
root@make-install:~#  watch -n1 'ps -axo pid,cmd,nice | grep nginx' 

在这里插入图片描述

http详细配置

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 logs/access.log main;     #调用 main 日志格式

#⾃定义优化参数
sendfile on;    #实现⽂件零拷⻉
#tcp_nopush on; #在开启sendfile的情况下,合并请求后统⼀发送给客⼾端。合并:报文太小,合并到了一定大小的报文一起发送
#tcp_nodelay off; #在开启了keepalived模式下的连接是否启⽤TCP_NODELAY选项,当为off时,延迟0.2s发送,默认On时,不
延迟发送,⽴即发送⽤⼾相应报⽂。延迟0.2s是为了减低服务器压力。

#keepalive_timeout 0;
keepalive_timeout 65 65; #设置会话保持时间

#gzip on; #开启⽂件压缩  默认关闭

server {
listen 80; #设置监听地址和端⼝
server_name localhost; #设置server name,可以以空格隔开写多个并⽀持正则表达式,如
*.magedu.com    www.magedu.*    www.(site\d+)\.magedu\.com$  default_server(都没有匹配上域名,
兜底的域名接续)  站点集群 d:数字 
#charset koi8-r; #设置编码格式,默认是俄语格式,可以改为utf-8
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html; #定义错误⻚⾯
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ { #以http的⽅式转发php请求到指定web服务器
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ { #以fastcgi的⽅式转发php请求到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;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht { #拒绝web形式访问指定⽂件,如很多的⽹站都是通过.htaccess⽂件来改变⾃⼰的重定向等功能。
# deny all;
#}
location ~ /passwd.html {
deny all;
	}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server { #⾃定义虚拟server
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm; #指定默认⽹⻚⽂件,此指令由ngx_http_index_module模块提供
# }
#}
# HTTPS server
#
#server { #https服务器配置
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.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;
# }
location /linux38/passwd.ht {
deny all;
}
#}

核心配置示例

基于不同的IP、不同的端⼝以及不⽤得域名实现不同的虚拟主机,依赖于核⼼模块ngx_http_core_module实现。

区别PC端和移动端的访问控制

新建一个PC web站点

root@make-install:~# mkdir /apps/nginx/conf/conf.d/ -p

root@make-install:~# vim /apps/nginx/conf/conf.d/pc.conf 
root@make-install:~# cat /apps/nginx/conf/conf.d/pc.conf 
server {
  listen       80;      #监听端口
  server_name  pc.likai.tech;       #虚拟主机域名

        charset utf-8;              #字符集定义

  location / {                      #默认访问文件
    root  /data/nginx/html/pc;      #访问文件路径
    index  index.html index.htm;
  }
}
root@make-install:~# mkdir /data/nginx/html/pc -p      #创建访问文件路径以及文件目录
root@make-install:~# vim /data/nginx/html/pc/index.html 
root@make-install:~# cat /data/nginx/html/pc/index.html
This is a PC service test

root@make-install:~# vim /apps/nginx/conf/nginx.conf #定义子配置文件被包涵 注意要在http{}里面
include /apps/nginx/conf/conf.d/*.conf;

root@make-install:~# /apps/nginx/sbin/nginx -t        #语法检测
nginx: the configuration file /apps/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /apps/nginx/conf/nginx.conf test is successful
root@make-install:~# /apps/nginx/sbin/nginx -s reload  #重新加载

新建一个Mobile web站点

root@make-install:~# mkdir /apps/nginx/conf/conf.d/ -p

root@make-install:~# vim /apps/nginx/conf/conf.d/mobile.conf 
root@make-install:~# cat /apps/nginx/conf/conf.d/mobile.conf 
server {
  listen       80;      #监听端口
  server_name  mobile.likai.tech;       #虚拟主机域名

        charset utf-8;              #字符集定义

  location / {                      #默认访问文件
    root  /data/nginx/html/mobile;      #访问文件路径
    index  index.html index.htm;
  }
}
root@make-install:~# mkdir /data/nginx/html/mobile -p      #创建访问文件路径以及文件目录
root@make-install:~# vim /data/nginx/html/mobile/index.html 
root@make-install:~# cat /data/nginx/html/mobile/index.html
This is Mobile service test

root@make-install:~# vim /apps/nginx/conf/nginx.conf #定义子配置文件被包涵 注意要在http{}里面
include /apps/nginx/conf/conf.d/*.conf;

root@make-install:~# /apps/nginx/sbin/nginx -t        #语法检测
nginx: the configuration file /apps/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /apps/nginx/conf/nginx.conf test is successful
root@make-install:~# /apps/nginx/sbin/nginx -s reload  #重新加载

web测试

在apt安装的ubantu:172.20.32.120中指定DNS解析以及访问

root@apt-install:~# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.20.32.120  netmask 255.255.0.0  broadcast 172.20.255.255
        inet6 fe80::20c:29ff:fe0d:f103  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:0d:f1:03  txqueuelen 1000  (Ethernet)
        RX packets 79962  bytes 11281425 (11.2 MB)
        RX errors 0  dropped 10579  overruns 0  frame 0
        TX packets 7181  bytes 772606 (772.6 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

root@apt-install:~# vim /etc/hosts
root@apt-install:~# cat /etc/hosts
127.0.0.1	localhost
127.0.1.1	ubuntu-server
172.20.32.110   pc.likai.tech
172.20.32.110   mobile.likai.tech

root@apt-install:~# curl http://pc.likai.tech
This is a PC service test

root@apt-install:~# curl http://mobile.likai.tech
This is Mobile service test

root与alias

root:指定web的家⽬录,在定义location的时候,⽂件的绝对路径等于 root+location,如:

root@make-install:~# mkdir /apps/nginx/conf/conf.d/ -p
server {
listen 80;
server_name pc.likai.tech;
location / {
root /data/nginx/html/pc;
}
location /about {     #子目录about
	root /data/nginx/html/pc; #必须要在html⽬录中创建⼀个about⽬录才可以访问,否则报错。
	index index.html;
}
}
root@make-install:~# mkdir /data/nginx/html/pc/about -p      
root@make-install:~# echo about > /data/nginx/html/pc/about/index.html

访问:

root@apt-install:~# curl http://pc.likai.tech/about/index.html  #apt-Install安装主机访问
about
root@apt-install:~# 

root@make-install:~# cat /data/nginx/html/pc/about/index.html  #make-install编译安装查看这个文件
about

alias:定义路径别名,会把访问的路径重新定义到其指定的路径,如:

root@make-install:~# mkdir /apps/nginx/conf/conf.d/ -p
server {
listen 80;
server_name pc.likai.tech;
location / {
root /data/nginx/html/pc;
	}
location /about { #使⽤alias的时候uri后⾯如果加了斜杠则下⾯的路径配置必须加斜杠,否则403
alias /data/nginx/html/pc; #当访问about的时候,会显⽰alias定义的/data/nginx/html/pc⾥⾯的内容。
如果是root 就是显示/about/data/nginx/html/pc里面的内容
index index.html;
	}
}
root@make-install:~# mkdir /data/nginx/html/pc/about
root@make-install:~# echo about > /data/nginx/html/pc/about/index.html

访问:

root@apt-install:~# curl http://pc.likai.tech/about/index.html  #apt-Install安装主机访问
This is a PC service test
#访问的是alias重定向的/data/nginx/html/pc中默认的index.html文件,make-install编译安装查看这个文件:
root@make-install:~# cat /data/nginx/html/pc/index.html 
This is a PC service test

location的详细使用

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

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

= #⽤于标准uri前,需要请求字串与uri精确匹配,如果匹配成功就停⽌向下匹配并⽴即处理请求。
~ #⽤于标准uri前,表⽰包含正则表达式并且区分⼤⼩写,并且匹配
!~ #⽤于标准uri前,表⽰包含正则表达式并且区分⼤⼩写,并且不匹配
~* #⽤于标准uri前,表⽰包含正则表达式并且不区分⼤写,并且匹配
!~* #⽤于标准uri前,表⽰包含正则表达式并且不区分⼤⼩写,并且不匹配
^~ #⽤于标准uri前,表⽰包含正则表达式并且匹配以什么开头
$ #⽤于标准uri前,表⽰包含正则表达式并且匹配以什么结尾
\ #⽤于标准uri前,表⽰包含正则表达式并且转义字符。可以转. * ?等
* #⽤于标准uri前,表⽰包含正则表达式并且代表任意⻓度的任意字符

匹配案例-精确匹配

在server部分使⽤location配置⼀个web界⾯,要求:当访问nginx 服务器的/login的时候要显⽰指定html⽂件的内容:

[root@s2 ~]# cat /apps/nginx/conf/conf.d/pc.conf
server {
listen 80;
server_name pc.likai.tech;
location / {
root /data/nginx/html/pc;
	}
location = /1.jpg {
root /var/www/nginx/images;
index index.html;
	}
}
mkdir /var/www/nginx/images -pv
cd /var/www/nginx/images/
wget http://175.24.138.169/wp-content/uploads/2019/12/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20191223205700.png
mv 微信图片_20191223205700.png 1.jpg
root@make-install:/var/www/nginx/images# ll
total 20
drwxr-xr-x 2 root root 4096 Jan  5 11:32 ./
drwxr-xr-x 3 root root 4096 Jan  5 11:31 ../
-rw-r--r-- 1 root root 9294 Dec 31 19:22 1.jpg
重新加载Nginx服务访问即可

用apt-install机器做客户端验证是否能访问下载
Nginx《三》——Nginx基础配置介绍_第1张图片

匹配案例-区分大小写

如果uri中包含⼤写字⺟,此组条件不匹配

location ~ /A.?\.jpg {
index index.html;
root /opt/nginx/html/image;
}
重启Nginx并访问测试
将只能访问以⼩写字符的AX.jpg图⽚,不能识别⼤写的JPG结尾的图⽚
访问测试:http://pc.likai.tech/aA.jpg #直接访问资源名称即可

匹配案例-不区分大小写

对⽤⼾请求的uri做模糊匹配,也就是uri中⽆论都是⼤写、都是⼩写或者⼤⼩写混合,此模式也都会匹配,通常使⽤此模式匹配⽤⼾request中的静态资源并继续做下⼀步操作。

location ~* /A.?\.jpg {
index index.html;
root /opt/nginx/html/image;
}
访问测试:http://pc.likai.tech/aA.jpg #直接访问资源名称即可
精确匹配指定名称:
# location ~ /aa.jpg {
# index index.html;
# root /opt/nginx/html/image;
# }
location ~* /aa.jpg {
index index.html;
root /opt/nginx/html/image;
}
重启Nginx并访问测试
对于不区分⼤⼩写的location,则可以访问任意⼤⼩写结尾的图⽚⽂件,如区分⼤⼩写则只能访问aa.jpg,不区分⼤
⼩写则可以访问aa.jpg以外的资源⽐如Aa.JPG、aA.jPG这样的混合名称⽂件,但是要求nginx服务器的资源⽬录有
相应的⽂件,⽐如有Aa.JPG有aA.jPG。

匹配案例-URI开始

location ^~ /images {
root /data/nginx;
index index.html;
}
location /images1 {
alias /data/nginx/html/pc;
index index.html;
}
重启Nginx并访问测试,实现效果是访问images和images1返回不同的结果
~# curl http://pc.likai.tech/images/
images
~# curl http://pc.likai.tech/images1/
pc web

匹配案例-文件名后

~# mkdir /data/nginx/images1
#上传⼀个和images⽬录不⼀样内容的的图⽚1.jp到/data/nginx/images1
location ~* \.(gif|jpg|jpeg|bmp|png|tiff|tif|ico|wmf|js)$ {
root /data/nginx/images1;
index index.html;
}
重启Nginx并访问测试

匹配案例-优先级

location ~* /1.jpg {
index index.html;
root /data/nginx/pc/html/linux/images;
}
location = /1.jpg { #通常⽤于精确匹配指定⽂件,如favicon.ico、employcode.js、index.jsp等
index index.html;
root /data/nginx/pc/html/python/images;
}
上传图⽚到并重启nginx访问测试

匹配优先级:=, ^~, 〜/〜*,/
location优先级:(location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正
则顺序) > (location 部分起始路径) > (/)

生产使用案例

直接匹配⽹站根会加速Nginx访问处理:
location = / {
......;
}
location / {
......;
}
静态资源配置:
location ^~ /static/ {
......;
}
# 或者
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
......;
}
多应⽤配置
location ~* /app1 {
......;
}
location ~* /app2 {
......;
}

Nginx 四层访问控制

访问控制基于模块ngx_http_access_module实现,可以通过匹配客⼾端源IP地址进⾏限制。

location /about {
alias /data/nginx/html/pc;
index index.html;
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all; #先允许⼩部分,再拒绝⼤部分
}

Nginx账户认证功能

配合ElK使用。 一般用于企业内部

~# yum install httpd-tools -y
~# htpasswd -cbm /apps/nginx/conf/.htpasswd user1 123456 #-m指定算法 -c创建新用户 -b加密
Adding password for user user1
~# htpasswd -bm /apps/nginx/conf/.htpasswd user2 123456  #创建第二个不用加-c
Adding password for user user2
~# tail /apps/nginx/conf/.htpasswd  #查看
user1:$apr1$Rjm0u2Kr$VHvkAIc5OYg.3ZoaGwaGq/
user2:$apr1$nIqnxoJB$LR9W1DTJT.viDJhXa6wHv.

~# vim /apps/nginx/conf/conf.d/pc.conf
location = /login/ {         #访问/login的时候需要登入
root /data/nginx/html/pc;
index index.html;
auth_basic "login password";           #提示信息
auth_basic_user_file /apps/nginx/conf/.htpasswd;      #认证文件
}
重启Nginx并访问测试,需要登入认证

自定义错误页面

listen 80;
server_name pc.likai.tech;
error_page 500 502 503 504 404 /error.html;
location = /error.html {
root html;
}
重启nginx并访问不存在的⻚⾯进⾏测试

自定义访问⽇志

~# mkdir /data/nginx/logs
listen 80;
server_name pc.likai.tech;
error_page 500 502 503 504 404 /error.html;       #默认⽬录下⾯创建error.html⻚⾯
access_log /data/nginx/logs/pc-likai-tech_access.log;
error_log /data/nginx/logs/pc-likai-tech_error.log;
location = /error.html {
root html;
}
重启nginx并访问不存在的⻚⾯进⾏测试并验证是在指定⽬录⽣成新的⽇志⽂件

检测文件是否存在

try_files会按顺序检查⽂件是否存在,返回第⼀个找到的⽂件或⽂件夹(结尾加斜线表⽰为⽂件夹),如果所有⽂件或⽂件夹都找不到,会进⾏⼀个内部重定向到最后⼀个参数。只有最后⼀个参数可以引起⼀个内部重定向,之前的参数只设置内部URI的指向。最后⼀个参数是回退URI且必须存在,否则会出现内部500错误。
如果访问的URL不存在就自动跳转

location /about {
root /data/nginx/html/pc;
#alias /data/nginx/html/pc;
index index.html;
#try_files $uri /about/default.html;  #$uri 用户访问的时候的头部访问字段
#try_files $uri $uri/index.html $uri.html /about/default.html; #当前面的url都没有匹配上,则返回default.html
try_files $uri $uri/index.html $uri.html =489;
}
~# echo "default" >> /data/nginx/html/pc/about/default.html
重启nginx并测试,当访问到http://pc.likai.tech/about/xx.html等不存在的uri会显⽰default,如果
是⾃定义的状态码则会显⽰在返回数据的状态码中,如:
# curl --head http://pc.likai.tech/about/xx.html
HTTP/1.1 489           #489就是⾃定义的状态返回码
Server: nginx
Date: Thu, 21 Feb 2019 00:11:40 GMT
Content-Length: 0
Connection: keep-alive
Keep-Alive: timeout=65

长连接配置

keepalive_timeout number; #设定保持连接超时时⻓,0表⽰禁止长连接,默认为75s,通常配置在http字段作为站点全局配置 keepalive_requests number; #在⼀次⻓连接上所允许请求的资源的最⼤数量,默认为100次

keepalive_requests 3;
keepalive_timeout 65 65;
开启⻓连接后,返回客⼾端的会话保持时间为65s,单次⻓连接累计请求达到指定次数请求或65秒就会被断开,后⾯的
60为发送给客⼾端应答报⽂头部中显⽰的超时时间设置为65s:如不设置客⼾端将不显⽰超时时间。
Keep-Alive:timeout=60          #浏览器收到的服务器返回的报⽂
如果设置为0表⽰关闭会话保持功能,将如下显⽰:
Connection:close              #浏览器收到的服务器返回的报⽂
使⽤命令测试:
telnet pc.likai.tech 80
#⻚⾯内容
pc web

Syntax:	keepalive_timeout timeout [header_timeout];
Default:	
keepalive_timeout 75s;
Context:	http, server, location

作为下载服务器配置

root@make-install:~# mkdir /data/nginx/html/pc/download
#download不需要index.html⽂件
root@make-install:~# vim /apps/nginx/conf/conf.d/pc.conf
  location /download {
    autoindex on;              #⾃动索引功能
    autoindex_exact_size on;   #计算⽂件确切⼤⼩(单位bytes),off只显⽰⼤概⼤⼩(单位kb、mb、gb)
    autoindex_localtime on;    #显⽰本机时间⽽⾮GMT(格林威治)时间
    root /data/nginx/html/pc;
  }
root@make-install:/data/nginx/html/pc/download# ll
total 12608
drwxr-xr-x 2 root root     4096 Jan  5 15:00 ./
drwxr-xr-x 4 root root     4096 Jan  5 14:55 ../
-rw-r--r-- 1 root root   296469 Dec 15 17:40 poweradmin-2.1.7.tgz
-rw-r--r-- 1 root root 12423575 Dec 12 14:18 wordpress-5.3-zh_CN.tar.gz
-rw-r--r-- 1 root root   173368 Jun 20  2018 xcache-3.2.0.tar.gz
重启Nginx并访问测试下载⻚⾯

Nginx《三》——Nginx基础配置介绍_第2张图片

limit_rate rate; #限制响应给客⼾端的传输速率,单位是bytes/second,默认值0表⽰⽆限制限速

limit_rate 10k;

作为上传服务器

client_max_body_size 1m; #设置允许客⼾端上传单个⽂件的最⼤值,默认值为1m
client_body_buffer_size size; #⽤于接收每个客⼾端请求报⽂的body部分的缓冲区⼤⼩;默认16k;超出此⼤⼩时,其将被暂存
到磁盘上的由下⾯client_body_temp_path指令所定义的位置
client_body_temp_path path [level1 [level2 [level3]]];#设定存储客⼾端请求报⽂的body部分的临时存储路径及⼦⽬录结
构和数量,⽬录名为16进制的数字,使⽤hash之后的值从后往前截取1位、2位、2位作为⽂件名:
 ~]# md5sum /data/nginx/html/pc/index.html
95f6f65f498c74938064851b1bb 96 3d 4 /data/nginx/html/pc/index.html
1级⽬录占1位16进制,即2^4=16个⽬录 0-f
2级⽬录占2位16进制,即2^8=256个⽬录 00-ff
3级⽬录占2位16进制,即2^8=256个⽬录 00-ff    #分层
配置⽰例:(一般在主配置文件中配置)
client_max_body_size 10m;
client_body_buffer_size 16k;
client_body_temp_path /apps/nginx/temp 1 2 2;       #reload Nginx会⾃动创建temp⽬录

其他配置

keepalive_disable none | browser ...;
#对哪种浏览器禁⽤⻓连接
limit_except method ... { ... },仅⽤于location
限制客⼾端使⽤除了指定的请求⽅法之外的其它⽅法,head方法默认都允许
method:GET, HEAD, POST, PUT, DELETE,MKCOL, COPY, MOVE, OPTIONS, PROPFIND,PROPPATCH, LOCK, UNLOCK, PATCH
limit_except GET {
allow 192.168.0.0/24;
allow 192.168.7.101;
deny all;
}

#除了GET和HEAD 之外其它⽅法仅允许192.168.1.0/24⽹段主机使⽤
[root@s2 about]# mkdir /data/nginx/html/pc/upload
[root@s2 about]# echo "upload" > /data/nginx/html/pc/upload/index.html
[root@s2 about]# vim /apps/nginx/conf/conf.d/pc.conf
  location /upload {
	root /data/nginx/pc;
	index index.html;
	limit_except GET {
	allow 172.18.200.101;
	deny all;
	}
}
~]# curl -XPUT /etc/issue http://pc.likai.tech/upload
curl: (3) <url> malformed
<html>
<head><title>405 Not Allowed</title></head>   #Nginx已经允许但是程序未⽀持上传功能
<body bgcolor="white">
<center><h1>405 Not Allowed</h1></center>
<hr><center>nginx</center>
</body>
</html>
~]# curl -XPUT /etc/issue http://pc.likai.tech/upload
curl: (3) <url> malformed
<html>
<head><title>403 Forbidden</title></head>         #Nginx拒绝上传
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx</center>
</body>
</html>
aio on | off #是否启⽤asynchronous file I/O(AIO)功能,需要编译开启 编译添加 --with-file-aio
linux 2.6以上内核提供以下⼏个系统调⽤来⽀持aio:
1、SYS_io_setup:建⽴aio 的context
2、SYS_io_submit: 提交I/O操作请求
3、SYS_io_getevents:获取已完成的I/O事件
4、SYS_io_cancel:取消I/O操作请求
5、SYS_io_destroy:毁销aio的context

小文件用sendfile传输即可,但是对于大文件的传输就需要用aio

directio size | off; #操作完全和aio相反,aio是读取⽂件⽽directio是写⽂件到磁盘,启⽤直接I/O,默认为关闭,当⽂件⼤
于等于给定⼤⼩时,例如directio 4m,同步(直接)写磁盘,⽽⾮写缓存。
open_file_cache off; #是否缓存打开过的⽂件信息
open_file_cache max=N [inactive=time];
nginx可以缓存以下三种信息:
(1) ⽂件元数据:⽂件的描述符、⽂件⼤⼩和最近⼀次的修改时间
(2) 打开的⽬录结构
(3) 没有找到的或者没有权限访问的⽂件的相关信息
max=N:可缓存的缓存项上限数量;达到上限后会使⽤LRU(Least recently used,最近最少使⽤)算法实现管理

inactive=time:缓存项的⾮活动时⻓,在此处指定的时⻓内未被命中的或命中的次数少于open_file_cache_min_uses指令所指定
的次数的缓存项即为⾮活动项,将被删除
open_file_cache_errors on | off;
是否缓存查找时发⽣错误的⽂件⼀类的信息
默认值为off
open_file_cache_min_uses number;
open_file_cache指令的inactive参数指定的时⻓内,⾄少被命中此处指定的次数⽅可被归类为活动项
默认值为1
open_file_cache_valid time;
缓存项有效性的检查验证频率,默认值为60s
open_file_cache max=10000 inactive=60s; #最⼤缓存10000个⽂件,⾮活动数据超时时⻓60s
open_file_cache_valid 60s; #每间隔60s检查⼀下缓存数据有效性
open_file_cache_min_uses 5; #60秒内⾄少被命中访问5次才被标记为活动数据
open_file_cache_errors on; #缓存错误信息
server_tokens off; #隐藏Nginx server版本。

官方指令指南

你可能感兴趣的:(Nginx,Ubantu,Nginx基础配置介绍)