一、配置文件语法格式
先来看一个简单的nginx 配置
worker_processes 1;
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;
}
location /nginx_status {
stub_status on;
access_log off;
}
}
}
在整个Nginx的配置中,分为3个类别:配置块、配置块中的属性、特定参数
配置块:
比如上述配置中的:events、http、server等,由一对{}包围。
配置块中的属性
比如上述配置中的:worker_processes 、worker_connections、include、listen等。
是配置块中的单行记录,配置块中的属性包含属性名和属性值(属性值不仅仅会有一个,也可能会有多个)
特定参数
比如上述配置中的: /nginx_status 其中server块嵌套于http块,其可以直接继承访问Http块当中的参数。
可以理解为语句块名称和 { 之间的部分
配置块 | 名称开头用 {} 包裹其对应属性 |
属性 | 基于空格切分属性名与属性值,属性值可能有多个项 都以空格进行切分 如:access_log logs/host.access.log main |
参数 | 其配置在 块名称与大括号间,其值如果有多个也是通过空格进行拆 |
server匹配
worker_processes 1;
#events 事件模块
events {
worker_connections 1024; #配置最连接数
}
# http是最最常用的一个配置
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65; #最大超时时间
#可配置一个具体的站点(可配置多个server也就是多个站点)
server { #server和 { 之间一定要加空格,不然就会识别不了
listen 80; #站点监听的端口(只能监听一个端口)
server_name localhost; #监听站点的名称(说白了也就是域名)
location / { #具体路径
root html;
index index.html index.htm;
}
location /nginx_status {
stub_status on;
access_log off;
}
}
server {
listen 80; #站点监听的端口(只能监听一个端口)
server_name www.project.com; #监听站点的名称
}
}
问题1:两个server都监听80端口,不会冲突么?
回答::不会,两个server共用一个80端口,在一个进程里面,所以是不会冲突的
问题2:server_name可以写多个么?
回答::可以,多个值之间使用空格隔开即可,比如以下例子:
server {
listen 80;
server_name www.project.com www.pj.com *.project.com www.project.*;
}
.project.com 只要是project.com结尾的都会进入对应的server,这是左边匹配
www.project. 只要是project.com开头的都会进入对应的server,这是右边匹配
问题3:如果某个域名匹配到多个server,那么最终会进入哪个呢?比如有以下配置
server {
listen 80;
server_name www.project.com www.pj.com *.project.com www.project.*;
}
server {
listen 80;
server_name www.pj.com *.project.com www.project.*;
}
回答:
①、基于最大匹配原则,若访问的域名为www.project.com,那么则会进入第一个server,因为server中有和访问域名完全相同的值
②、左边匹配大于右边匹配
③、若所有的优先级都是一样的,则谁的位置在前,就会匹配到哪个
④、若所有的属性都不匹配,则会默认进入第一个server,当然我们可以加关键字default来决定这种情况下默认进入的server
server {
listen 80 default;
server_name www.project.com www.pj.com *.project.com www.project.*;
}
server {
listen 80;
server_name www.pj.com *.project.com www.project.*;
}
location匹配
localtion是根据具体的目录来匹配的,可以有多个,存在多种匹配方式
location / {
root html;
index index.html index.htm;
}
location /nginx_status {
stub_status on;
access_log off;
}
二、配置第一个静态WEB服务
基础站点演示:
创建站点目录 mkdir -p /usr/www/luban
编写静态文件
配置 nginx.conf
配置server
配置location
基本配置介绍说明:
(1)监听端口
语法:listen address:
默认:listen 80;
配置块:server
(2)主机名称
语法:server_name name[……];
默认:server_name “”;
配置块:server
server_name后可以跟多个主机名称,如server_name www.testweb.com、download.testweb.com;。
支持通配符与正则
(3)location
语法:location[=|~|~*|^~|@]/uri/{……}
配置块:server
1.=表示把URI作为字符串,以便与参数中的uri做完全匹配。
2./ 基于uri目录匹配
3.~表示正则匹配URI时是字母大小写敏感的。
4.~*表示正则匹配URI时忽略字母大小写问题。
5.^~表示正则匹配URI时只需要其前半部分与uri参数匹配即可。
location的匹配优先级规则
精确匹配 =
字符串前缀匹配 ^~
按照匹配顺序的正则匹配(AB正则都匹配上了,谁在前配置,谁匹配上)
不带任何修饰的前缀匹配
当有匹配成功时,停止匹配,按照当前匹配规则处理请求
前缀匹配,有包含关系式,按照最大匹配长度原则匹配
最低优先级是通配符/
(4)root 指定站点根目录
可配置在 server与location中,基于ROOT路径+URL中路径去寻找指定文件。
(5)alias 指定站点别名
只能配置location 中。基于alias 路径+ URL移除location 前缀后的路径来寻找文件。
如下示例:
location /V1 {
alias /www/old_site;
index index.html index.htm;
}
#防问规则如下
URL:http://xxx:xx/V1/a.html
最终寻址:/www/old_site/a.thml
server {
listen 80;
server_name localhost;
location = /images{
return 205;
}
location ^~ /images {
return 200;
}
location ^~ /images/test.png {
return 201;
}
location ~ \.(gif|jpg|png|js|css)$ {
return 202;
}
location ~* \.png$ {
return 203;
}
location / {
return 204;
}
}
http://localhost/ 返回204
http://localhost/images 返回205
http://localhost/images/id 返回200
http://localhost/images/test.png 返回201
http://localhost/haha.png返回202
三、配置案例
1、动静分离实现
创建静态站点
配置 location /static
配置 ~* .(gif|png|css|js)$
基于目录动静分离
server {
listen 80;
server_name *.luban.com;
root /usr/www/luban;
location / {
index luban.html;
}
location /static {
alias /usr/www/static;
}
}
基于正则动静分离
location ~* \.(gif|jpg|png|css|js)$ {
root /usr/www/static;
}
2、防盗链
#加入至指定location 即可实现
valid_referers none blocked *.aaa.com;
if ($invalid_referer) {
return 403;
}
3、下载限速
location /download {
limit_rate 1m; //限制每S下载速度
limit_rate_after 30m; // 超过30 之 后在下载
}
4、IP 黑名单
创建IP黑名单
#封禁指定IP
deny 192.168.0.1;
allow 192.168.0.1;
#开放指定IP 段
allow 192.168.0.0/24;
#封禁所有
deny all;
#开放所有
allow all;
#创建黑名单文件
echo 'deny 192.168.0.132;' >> balck.ip
#http 配置块中引入 黑名单文件
include black.ip;
四、日志配置
日志格式:
log_format main '$remote_addr -
r
e
m
o
t
e
u
s
e
r
[
remote_user [
remoteuser[time_local] “KaTeX parse error: Double superscript at position 33: … '̲status
b
o
d
y
b
y
t
e
s
s
e
n
t
"
body_bytes_sent "
bodybytessent"http_referer” ’
‘“
h
t
t
p
u
s
e
r
a
g
e
n
t
"
"
http_user_agent" "
httpuseragent""http_x_forwarded_for”’;
access_log logs/access.log main;
#基于域名打印日志
access_log logs/$host.access.log main;
error日志的设置
语法:error_log /path/file level;
默认:error_log logs/error.log error;
level是日志的输出级别,取值范围是debug、info、notice、warn、error、crit、alert、emerg,
针对指定的客户端输出debug级别的日志
语法:debug_connection[IP|CIDR]
events {
debug_connection 192.168.0.147;
debug_connection 10.224.57.0/200;
}
注意:debug 日志开启 必须在安装时 添加 --with-debug (允许debug)