一、配置文件语法格式
先来看一个简单的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 {
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;
}
}
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、防盗链
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黑名单
deny 192.168.0.1;
allow 192.168.0.1;
allow 192.168.0.0/24;
deny all;
allow all;
echo 'deny 192.168.0.132;' >> balck.ip
include black.ip;
四、日志配置
日志格式: log_format main '$remote_addr -
r
e
m
o
t
e
u
s
e
r
[
remote_user [
remoteu?ser[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 "
bodyb?ytess?ent"http_referer” ’ ‘“
h
t
t
p
u
s
e
r
a
g
e
n
t
"
"
http_user_agent" "
httpu?sera?gent""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)
|