Nginx
(发音同engine x)是一个异步框架的 Web
服务器,也可以用作反向代理,负载平衡器 和 HTTP
缓存.
作为一个后起之秀的http服务器,nginx
与他的老大哥apache
相比,在性能上,nginx
占用更少的系统资源,
特定的场景应用(静态数据)能支持更多的并发连接,达到更高的访问效率;
Nginx
配置管理
初始化的nginx默认主配置
执行 grep -Evi "#|^$" nginx.conf
得到如下结果!
或者直接找到 nginx.conf
打开即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| 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 } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
|
Nginx
配置段
全局配置区
指有一个工作的子进程,可以自行修改,因为要争CPU
资源,一般设置为CPU*核数
。
也可以设置成自动: worker_processes auto;
Event
配置区
一般是配置Nginx连接的特性
指一个worker能同时允许产生多少个连接
配置值的时候需要结合系统参数
http
服务器配置区
server
虚拟主机配置区
提 示: 如果未明确配置服务器IP地址访问配置,将使用第一个server
配置。
基于域名的虚拟主机
使用域名www.caoxl.com
为例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| server { listen 80; server_name www.caoxl.com; error_page 404 /404.html; }
location / { root html/www; index index.html; access_log logs/www.caoxl.com_access.log main; error_loh logs/www.caoxl.com_error.log; }
location ~ .+\.php.*$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name; fastcgi_param SCRIPT_FILENAME $request_filename; include fastcgi_params; }
|
Nginx
日志管理
我们观察Nginx
的server
段,可以看到如下内容:
access_log logs/www.caoxl.com_access.log main;
- 参数1: 配置名
- 参数2: 指定访问日志的文件是
logs/www.caoxl.com_access.log
- 参数3: 使用的日志格式
main
格式, 同时我们也可以通过log_format
配置其他格式的日志记录方式
1 2 3
| log_format main '$remote_addr - $remote_user [$time_local] "$request"' '$status $body_bytes_sent "$http_referer"' '"$http_user_agent" "$http_x_forwarded_for"';
|
另外和其他的web服务器一样,nginx
可以针对不同的server
配置不同的log
基于端口的虚拟主机
以端口8080
为例,域名依然使用www.caoxl.com
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| server { listen 8080; server_name www.caoxl.com; error_page 404 /404.html; location / { root html/port; index index.html; access_log logs/www.caoxl.com_access.log main; error_log logs/www.caoxl.com.com_error.log; } location ~ .+\.php.*$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name; fastcgi_param SCRIPT_FILENAME $request_filename; include fastcgi_params; } }
|
基于IP
虚拟主机
以 192.168.0.200
为默认IP
配置虚拟主机
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| server { listen 80; server_name 192.168.0.200; error_page 404 /404.html; location / { root html/ipvhosts; index index.html; access_log logs/192.168.0.200_access.log main; error_log logs/192.168.0.200_error.log; } location ~ .+\.php.*$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name; fastcgi_param SCRIPT_FILENAME $request_filename; } }
|
Nginx
定时任务完成日志切割
任务需求:每日凌晨将nginx
日志根据日期重命名日志文件进行切割。
- 昨天时间命令
date -d yesterday +%Y%m%d
1 2 3 4 5 6 7 8 9 10 11 12
| #!/bin/bash
DATE=$(date -d yesterday + %Y%m%d) LOG_PATH=/usr/local/nginx/logs/ LOG_NAME=access.log BASE_PATH=/var/log/ SAVE_LOG_NAME=${DATE}.${LOG_NAME}
mv ${LOG_PATH}${LOG_NAME} ${BASE_PATH}${SAVE_LOG_NAME}
kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid)
|
定时执行任务
1
| 1/* 0 * * * /usr/bin/crontab /root/cutlog.sh > /dev/null 2 > &1
|
Nginx
的location
详解
location
语法
1 2 3
| location [=|~|~*|^~\ patt {
}
|
参数解释:
=
开头表示精确匹配
^~
开头表示uri
以某个常规字符串开头,理解为匹配url
路径即可
nginx
不对url
做编码,因此请求为/static/20%/aa
,可以被规则^~ /static/ /aa
匹配到(注意是空格)。
~
开头表示区分大小写的正则匹配
~*
开头表示不区分大小写的正则匹配
!~
开头表示区分大小写不匹配的正则
!~*
开头表示不区分大小写不匹配的正则
location
匹配类型
location
匹配之精准匹配
1 2 3 4 5 6 7
| location = / { # 规则A }
location = /login { }
|
location
匹配之正则匹配
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| location ^~ /static/ { }
location ~ \.(gif|jpg|png|js|css)$ { }
location ~* \.png$ { }
location !~ \.xhtml$ { }
location !~* \.xhtml$ { }
|
location
匹配之一般匹配
location
配置优先级
- 先判断精准匹配,如果匹配,立即返回结果并结束解析过程
- 然后,判断普通命中没如果有多个命中,记录最长的匹配结果
- 再然后判断正则表达式的解析过程,按配置里的正则表达式顺序为准,由上到下开始匹配,一旦匹配成功立即返回结果并结束解析过程。
通过上面的分析我们可以知道:
- 普通匹配与顺序无关,因为按照匹配的长短来取匹配结果。
- 正则匹配与顺序有关,因为是从上往下匹配。(首先匹配,取其之。结束解析过程)
nginx
的rewrite
语法详解
rewrite
使用环境
重写过程中可能用到的指令
1 2 3 4 5 6 7 8 9 10 11
| if (条件) { }
set # 设置变量
return # 返回状态码
break # 跳出rewrite
rewrite # 重写
|
nginx
缓存expires
模块
控制图片等过期时间为30
天,当然这个时间可以设置的更长。
具体视情况而定,将下列的location
配置写入server
下。
1 2 3
| location ~\.(gif|jpg|jpeg|png|bmp|ico)$ { expires 30d; }
|
nginx.conf
配置文件
Nginx
配置文件主要分成四部分:
main
(全局设置)、
server
(主机设置)、
upstream
(上游服务器设置,主要为反向代理、负载均衡相关配置)
location
(URL匹配特定位置后的设置)
main部分设置的指令将影响其它所有部分的设置;
server部分的指令主要用于指定虚拟主机域名、IP和端口;
upstream的指令用于设置一系列的后端服务器,设置反向代理及后端服务器的负载均衡;
location部分用于匹配网页位置(比如,根目录“/”,“/images”,等等)
他们之间的关系式:server继承main,location继承server;upstream既不会继承指令也不会被继承。它有自己的特殊指令,不需要在其他地方的应用。
通用
下面的nginx.conf
简单的实现nginx
在前端做反向代理服务器的例子,
处理js
、png
等静态文件,jsp
等动态请求转发到其它服务器tomcat
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
|
user www www; worker_processes 2;
error_log logs/error.log;
pid logs/nginx.pid;
events { use epoll; worker_connections 2048; }
http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.0; gzip_comp_level 6; gzip_types text/html text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml; gzip_vary on; client_max_body_size 10m; client_body_buffer_size 128k; proxy_connect_timeout 75; proxy_send_timeout 75; proxy_read_timeout 75; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; proxy_temp_path /usr/local/nginx/proxy_temp 1 2; upstream backend { server 192.168.10.100:8080 max_fails=2 fail_timeout=30s ; server 192.168.11.100:8080 max_fails=2 fail_timeout=30s ; } server { listen 80; server_name itoatest.example.com; root /apps/oaapp; charset utf-8; access_log logs/host.access.log main; location / { root /apps/oaapp; index index.jsp index.html index.htm; proxy_pass http://backend; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; } location ~* /download/ { root /apps/oa/fs;
} location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ { root /apps/oaapp; expires 7d; } location /nginx_status { stub_status on; access_log off; allow 192.168.10.0/24; deny all; }
location ~ ^/(WEB-INF)/ { deny all; }
error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
|
参考