回炉重造之 nginx
Posted zfyolo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了回炉重造之 nginx相关的知识,希望对你有一定的参考价值。
一 模块介绍
核心模块
user: 用来指定运行 nginx worker 进程的用户名
daemon: 是否指定以后台的方式运行,默认为on
error_log: 用来定义nginx错误日志的输出位置以及格式 基本格式如下:
Syntax: error_log file [level];
Default: error_log logs/error.log error;
Context: main, http, mail, stream, server, location
默认输出到本地 也可以输出到文件系统
error_log syslog:server=192.168.1.1 debug;
access_log syslog:server=unix:/var/log/nginx.sock,nohostname;
另外,错误日志也可以发送到内存中。。。这个目前没用到,不谈
include:用来指定Nginx主配置文件中引入一些配置段
Default: —
Context: any
生产比较常用的是
include /etc/nginx/default.d/*.conf;
include /usr/share/nginx/modules/*.conf;
include mime.types;
include vhosts/*.conf;
load_module 用来加载nginx模块 基本用法
Syntax: load_module file;
Default: —
Context: main
This directive appeared in version 1.9.11.
实例
load_module modules/ngx_mail_module.so;
一般使用load——modele来手动加载某个后编译的模块,一般nginx的默认配置是先通过加载配置文件,然后再修改配置文件中引用load_module来指定具体加载的模块比如
include /usr/share/nginx/modules/*.conf
里面的
[root@localhost modules]# cat mod-stream.conf
load_module "/usr/lib64/nginx/modules/ngx_stream_module.so";
pid 用来指定nginx的pid文件,需要注意 我们再通过systemctl对nginx进程或直接使用nginx进行管理,是基于该配置文件的,如果删除了pid会报错这个适合只能kill 你滚下master
http 核心模块
通过epel下载的nginx 默认如下
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
listen:用来指定虚拟主机的监听地址(可以是IPV4或者IPV6)与端口,以及
一些与套接字的相关配置
Syntax: listen address[:port] [default_server] [ssl] [http2 | spdy]
[proxy_protocol]
[setfib=number] [fastopen=number] [backlog=number]
[rcvbuf=size]
[sndbuf=size] [accept_filter=filter] [deferred] [bind]
[ipv6only=on|off]
[reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:
[keepcnt]];
listen port [default_server] [ssl] [http2 | spdy] [proxy_protocol]
[setfib=number] [fastopen=number] [backlog=number]
[rcvbuf=size] [sndbuf=size]
[accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport]
[so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
listen unix:path [default_server] [ssl] [http2 | spdy]
[proxy_protocol] [backlog=number] [rcvbuf=size]
[sndbuf=size] [accept_filter=filter]
[deferred] [bind] [so_keepalive=on|off|[keepidle]:[keepintvl]:
[keepcnt]];
Default: listen *:80 | *:8000;
Context: server
示例
listen 127.0.0.1:8000;
listen 127.0.0.1;
listen 8000;
listen *:8000;
listen localhost:8000;
如果没有指定端口的话,则默认是再80端口; 另外,还可以监听再unix套接字上,实现本机的快速访问,如
listen unix:/var/run/nginx.sock;
在listen 指令中,有几个和调优相关的参数,比如:
listen 0.0.0.0:80 backlog=10240 reuseport so_keepalive=10m::10
default_server: 用来指定默认的虚拟主机,即当用户请求的域名和当前节点配置的域名均不符合时,由该虚拟主机进行响应,如果所有的主机都没有配置default_server,那么第一个虚拟主机作为默认的虚拟主机
ssl: 配置https类型的虚拟主机,指定ssl时,需要指定ssl监听端口,默认为443
使用openssl快速创建私有证书
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./nginx.key
-out ./nginx.crt
查看证书信息:
openssl x509 -in nginx.crt -noout -text
使用ssl绘画加密时,我们至少要指定监听的端口号,域名证书以及域名私钥,ex
server {
listen 443 ssl;
server_name www.a.com a.com;
ssl_certificate /data/nginx/a/ssl/nginx.crt;
ssl_certificate_key /data/nginx/a/ssl/nginx.key;
}
证书和私钥我们最好设置为600或者400权限
server_name用来指定虚拟主机域名,可以指定多个域名,比如:
server_name{
example.com www.example.com;
}
也支持使用*作为通配符 左侧通配符高于右侧通配符
server {
server_name example.com *.example.com www.example.*;
}
也支持正则,但是非常影响性能
server {
server_name www.example.com ~^wwwd+.example.com$;
}
root:用以定义资源路径,该指令出现在http,server,location,if not location段中,内层未定义是会继承外层,内层会覆盖外层,基本语法
Syntax: root path;
Default: root html;
Context: http, server, location, if in location
示例
server {
listen 443 ssl;
server_name www.a.com a.com;
ssl_certificate /data/nginx/a/ssl/nginx.crt;
ssl_certificate_key /data/nginx/a/ssl/nginx.key;
root /data/nginx/a;
}
此时:我们访问url:http://www.a.com/fstab.txt 那么访问文件路径为 /data/nginx/a/fstab.txt;
location: 用来设定不同URI 的文件系统的路径映射,一个server中可以设置多个location,nginx会根据URI来诸葛判断。语法:
Syntax: location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
Default: —
Context: server, location
其中:
=:是对URI的精确匹配,优先级最高,如果匹配成功,则停止向下搜索
location =/{
... ...
}
当请求 http://www.byte-edu.com/ 时匹配,但是 http://www.byte-edu.com/index.html则不匹配
^~:对URI起始字符做字符串匹配,区分大小写,会检测所有匹配项,以匹配长度为有限,一旦匹配上,则不再进行正则匹配
~ 对uri(可以不是起始字符)做正则匹配,区分大小写;
~对url(可以不是起始字符)做正则匹配,不区分大小写;
不带符号: 匹配起始于此字符串的所有uri*,区分大小写;
注意 字符串匹配(无论是^~还是无符号匹配,后面都必须以为/开头
= > ^~ > ~= ~* > 不带符号
我们还可以以 @符号前缀来定义location段,这种定义 一般用于内部跳转!!
**
location @fallback{
proxy_pass http:backend;
}
**
需要注意的是,前缀匹配根据匹配长度作为优先级,正则表达式更具配置文件的顺序。
示例文件如下
server{
listen 80;
server_name www.a.com a.com *.a.com;
root /data/nginx/domain/;
location = /img {
return 701;
}
location ^~ /img {
return 702;
}
location ~ /img{
return 703;
}
location ~* /img{
return 704;
}
location /img{
return 705;
}
location /{
return 666;
}
}
nginx -t 会报错
nginx: [emerg] unexpected "}" in /etc/nginx/conf.d/domain.conf:13
是因为 location /img{} 和 location ^~ /img {} nginx认为是一样的,唯一的区别是 带 ^~ 的优先级比正则表达式高
所以修改之后
server{
listen 80;
server_name www.a.com a.com *.a.com;
root /data/nginx/domain/;
location = /img {
return 701;
}
location ^~ /img {
return 702;
}
location ~ /img{
return 703;
}
location ~* /img{
return 704;
}
location /imgs{
return 705;
}
location /{
return 666;
}
}
测试用例1
[root@localhost ~]# curl -I www.a.com/img
HTTP/1.1 701
Server: nginx/1.16.1
Date: Mon, 06 Jul 2020 15:01:29 GMT
Content-Length: 0
Connection: keep-alive
访问uri img 发现是精确匹配
修改配置文件
server{
listen 80;
server_name www.a.com a.com *.a.com;
root /data/nginx/domain/;
location = / {
return 701;
}
location ^~ /img {
return 702;
}
location ~ /img{
return 703;
}
location ~* /img{
return 704;
}
location /imgs{
return 705;
}
location /{
return 666;
}
}
再次请求
[root@localhost ~]# curl -I www.a.com/img
HTTP/1.1 701
Server: nginx/1.16.1
Date: Mon, 06 Jul 2020 15:01:29 GMT
Content-Length: 0
Connection: keep-alive
[root@localhost ~]# curl -I www.a.com/img
HTTP/1.1 702
Server: nginx/1.16.1
Date: Mon, 06 Jul 2020 15:03:22 GMT
Content-Length: 0
Connection: keep-alive
** 说明^~ 这种字符串匹配优先级高于正则**
测试用例2
server{
listen 80;
server_name www.a.com a.com *.a.com;
root /data/nginx/domain/;
location = / {
return 701;
}
location ^~ /img {
return 702;
}
location ~ /img{
return 703;
}
location ~* /img{
return 704;
}
location /imgs{
return 705;
}
location /{
return 666;
}
}
在以上配置文件的基础上
[root@localhost ~]# curl -I www.a.com/imgs
HTTP/1.1 703
Server: nginx/1.16.1
Date: Mon, 06 Jul 2020 15:06:18 GMT
Content-Length: 0
Connection: keep-alive
发现703 这里需要注意首先匹配到的应该是location ^~ /img 和 location /imgs这两个字符串匹配,在字符串匹配中,会继续匹配,按照谁匹配多的原则 应该是匹配到 location /imgs 但是!!!location /imgs 这种匹配它的特点就是比正则表达式的优先级低 所以它又会去找正则表达式, 这个时候就找到了 location ~ /img 和location ~* /img ,正则都匹配的情况下,去看谁的顺序在前面就选址谁!!
另外还需要注意的是字符串匹配 匹配的是以XXX开头的,XXX后面有没有都能匹配到
字符串匹配需要比较长度 正则比较看先后,location /imgs 这种优先级低于正则!!!!
location 示例
做为静态服务
location ^~ /static/ {
root /webroot/static/;
}
location ~* .(gif|jpg|jpeg|png|css|js|ico)$ {
root /webroot/res/;
}
做为代理服务器
至少要有一条规则,可以在其他规则都不匹配时能生效
location / {
proxy_pass http://tomcat:8080 ;
}
以上是关于回炉重造之 nginx的主要内容,如果未能解决你的问题,请参考以下文章