普通的(静态的)虚拟主机配置
客户端通过域名访问服务器时会将域名与被解析的ip一同放在请求中。当请求到了nginx中时。nginx会先去匹配ip,如果listen中没有找到对应的ip,就会通过域名进行匹配,匹配成功以后,再匹配端口。当这三步完成,就会找到对应的server的location对应的资源。
当listen出现了ip时,server_name就失去了意义。
server {
listen 80;
server_name server.example.com;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html/1/;
index index.html index.htm;
}
Nginx的匹配规则
语法规则: location [=|~|~*|^~] /uri/ { … }
-
=
开头表示精确匹配 -
^~
开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。 -
~
开头表示区分大小写的正则匹配 以xx结尾 -
~*
开头表示不区分大小写的正则匹配 以xx结尾 -
!~
和!~*
分别为区分大小写不匹配及不区分大小写不匹配 的正则 -
/
通用匹配,任何请求都会匹配到。
#直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理。
#这里是直接转发给后端应用服务器了,也可以是一个静态首页
# 第一个必选规则
location = / {
proxy_pass http://tomcat:8080/index
}
# 第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项
# 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ^~ /static/ { //以xx开头
root /webroot/static/;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ { //以xx结尾
root /webroot/res/;
}
#第三个规则就是通用规则,用来转发动态请求到后端应用服务器
#非静态文件请求就默认是动态请求,自己根据实际把握
location / {
proxy_pass http://tomcat:8080/
自定义错误界面
首先要创建一个错误的目录
mkdir /usr/share/nginx/html/error
cd /usr/share/nginx/html/error
echo error > 40x.html
server {
listen 80;
server_name server.example.com;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html/1/;
index index.html index.htm;
}
# redirect server error pages to the static page /40x.html
#
error_page 403 404 /40x.html;
location = /40x.html {
root /usr/share/nginx/html/error/;
}
在浏览器输入一个不存在的地址 http://server.example.com/data/
Nginx的自动索引功能
server {
listen 80;
server_name server.example.com;
#charset koi8-r;
access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html/1/;
index index.html index.htm;
}
location /index {
autoindex on; #开启该功能
}
在对应的服务器上面
nginx -s reload
mkdir /usr/share/nginx/html/index
cd /usr/share/nginx/html/index
cp /etc/passwd .
cp /etc/group .
在浏览器输入地址 http://server.example.com/index/
Nginx的别名功能
server {
listen 80;
server_name server.example.com;
#charset koi8-r;
access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html/1/;
index index.html index.htm;
}
location /index {
autoindex on;
}
location /b {
alias /usr/share/nginx/html/alise;
}
mkdir /usr/share/nginx/html/alise
cd /usr/share/nginx/html/alise
echo 123456 > index.html
nginx -s reload
在浏览器输入地址 http://server.example.com/b/
Nginx状态检查
location /nginx_status {
stub_status on;
access_log off;
}
nginx -s reload
在浏览器输入地址 http://server.example.com/nginx_status/
结果如下:
Nginx rewrite
- rewrite主要的功能是实现url的重写,nginx的rewrite规则采用pcre perl兼容正则表达式的语法,进行规则匹配,如果需要nginx的rewrite功能,在编译nginx之前,需要安装pcre库。
- 规则语法 IF 指令
if ($http_user_agent ~ MSIE){
rewrite ^(.*)$ /msie/$1 break;
}
if (!-f $request_filename) {
rewrite ^/img/(.*) /site/$host/image/$1 last;
}
- 含义
= ,!= 比较的一个变量和字符串。
~, ~* 与正则表达式匹配的变量,如果这个正则表达式中包含},;则整个表达式需要用"或'包围。
-f,!-f 检查一个文件是否存在。
-d, !-d 检查一个目录是否存在。
-e,!-e 检查一个文件、目录、符号链接是否存在。
-x, !-x 检查一个文件是否可执行。
return 指令
- 示例,如果访问的URL 以 “.sh” ,".bash" 结尾,则返回状态码403
location ~ .*\.(sh|bash)?$
{
return 403;
}
rewrite 指令
flag可以是如下参数
last 停止处理后续rewrite指令集,然后对当前重写的新URI在rewrite指令集上重新查找。
break 停止处理后续rewrite指令集,并不在重新查找,但是当前location内剩余非rewrite语句和location外的的非rewrite语句可以执行。
redirect 如果replacement不是以http:// 或https://开始,返回302临时重定向
permant 返回301永久重定向
最终完整的重定向URL包括请求scheme(http://,https://等),请求的server_name_in_redirect和 port_in_redirec三部分 ,说白了也就是http协议 域名 端口三部分组成。
last 和 break用来实现URL重写,浏览器地址栏URL地址不变,redirect和permanent用来是实现URL跳转,浏览器地址栏会显示跳转后的URL地址。
server {
listen 80;
server_name server.example.com;
rewrite ^/data/(\.*)$ /bbs last; #访问data目录则会转向bbs目录
#charset koi8-r;
access_log /var/log/nginx/host.access.log main;
location /bbs {
index index.html;
mkdir -p /usr/share/nginx/html/bbs
cd /usr/share/nginx/html/bbs
echo bbs > index.html
通过浏览器访问 http://server.example.com/data/ 则会重新自动定义为http://server.example.com/bbs/
Nginx日志管理
log_format 指令用来设置日志的记录模式,语法如下:
log_format name(格式名称) type(格式样式)
举例说明如下:
log_format main '$server_name
$remote_addr - $remote_user
[$time_local] "$request" '
'$status $uptream_status
$body_bytes_sent
"$http_referer" ''
"$http_user_agent" "$http_x_forwarded_for"'
'$ssl_protocol $ssl_cipher $upstream_addr$request_time
$upstream_response_time';
每个样式的含义如下:
$server_name:虚拟主机名称。
$remote_addr:远程客户端的IP地址。
-:空白,用一个“-”占位符替代,历史原因导致还存在。
$remote_user:远程客户端用户名称,用于记录浏览者进行身份验证时提供的名字,如登录百度的用户名scq2099yt,如果没有登录就是空白。
[$time_local]:访问的时间与时区,比如18/Jul/2012:17:00:01 +0800,时间信息最后的"+0800"表示服务器所处时区位于UTC之后的8小时。
$request:请求的URI和HTTP协议,这是整个PV日志记录中最有用的信息,记录服务器收到一个什么样的请求
$status:记录请求返回的http状态码,比如成功是200。
$uptream_status:upstream状态,比如成功是200.
$upstream_addr:后端服务器的IP地址
$upstream_status:后端服务器返回的HTTP状态码
$body_bytes_sent:发送给客户端的文件主体内容的大小,比如899,可以将日志每条记录中的这个值累加起来以粗略估计服务器吞吐量。
$http_referer:记录从哪个页面链接访问过来的。
$http_user_agent:客户端浏览器信息
$http_x_forwarded_for:客户端的真实ip,通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。
$ssl_protocol:SSL协议版本,比如TLSv1。
$ssl_cipher:交换数据中的算法,比如RC4-SHA。
$upstream_addr:upstream的地址,即真正提供服务的主机地址。
$request_time:整个请求的总时间。
$upstream_response_time:请求过程中,upstream的响应时间。
日志的输入路径在 /var/log/nginx/host.access.log
日志的错误日志在 /var/log/nginx/error.log
server {
listen 80;
server_name server.example.com;
rewrite ^/data/(\.*)$ /bbs last;
#charset koi8-r;
access_log /var/log/nginx/host.access.log main;
error_log /var/log/nginx/error.log warn;
location /bbs {
index index.html;
}
日志如下:
定义日志
- access_log /data/log/$server_name.log mylogformat buffer=32k (从0.7.4之后nginx支持变量) buffer=32K : 表示设置内存缓冲区的大小
- access_log [存储路径] [buff=大小] [gzip=压缩级别] [flush=time 刷新时间]
开启日志打开缓存
- 对于每一条日志记录,日志文件都将先打开文件,在写入日志记录,然后马上关闭,为了提高包含变量的日志文件的存放路径的性能,可以使用open_log_file_cache指令来设置,格式如下:
open_log_file_cache max=N [inactive=time] [min_users=N] [vaild=time] | off
max: 设置缓存中的最大文件描述符数量
inactive:设置时间默认是10s,如果在设置的时间内没有使用此文件描述符,则自动删除此描述符。
min_uses:在参数inactive指定的时间范围内,如果日志文件超过被使用的次数,则将该日志文件的描述符计入缓存,默认为10秒钟。
valid:设置检查频率,默认60s,设置多长时间检查一次,看日志文件路径与文件名是否仍然存在。
off:禁用缓存
open_log_file_cache max=1000 inactive=20s min_user=2 vaild=1m;
Nginx开启压缩输出
gzip on;
//该指令用于开启或关闭gzip模块(on/off)
gzip_min_length 1k;
//设置允许压缩的页面最小字节数,页面字节数从header头得content-length中进行获取。默认值是0,不管页面多大都压缩。建议设置成大于1k的字节数,小于1k可能会越压越大。
gzip_buffers 4 16k;
//设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。4 16k代表以16k为单位,安装原始数据大小以16k为单位的4倍申请内存。
gzip_http_version 1.1;
//识别http的协议版本(1.0/1.1)
gzip_comp_level 2;
//gzip压缩比,1压缩比最小处理速度最快,9压缩比最大但处理速度最慢(传输快但比较消耗cpu)
gzip_types text/plain application/x-javascript text/css application/xml
//匹配mime类型进行压缩,无论是否指定,”text/html”类型总是会被压缩的。
gzip_vary on;
//和http头有关系,加个vary头,给代理服务器用的,有的浏览器支持压缩,有的不支持,所以避免浪费不支持的也压缩,所以根据客户端的HTTP头来判断,是否需要压缩
Nginx设定限速
配置文件
location /data {
limit_rate 100K
}
通过另外一台服务器访问该网站的地址wget http://server.example.com/data
[root@192 ~]# wget http://server.example.com/data/
--2021-02-19 23:29:07-- http://server.example.com/data/
Resolving server.example.com (server.example.com)... 192.168.1.1
Connecting to server.example.com (server.example.com)|192.168.1.1|:80... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: http://server.example.com/bbs/ [following]
--2021-02-19 23:29:07-- http://server.example.com/bbs/
Reusing existing connection to server.example.com:80.
HTTP request sent, awaiting response... 200 OK
Length: 4 [text/html]
Saving to: ‘index.html’
100%[===================================================>] 4 --.-K/s in 0s
2021-02-19 23:29:07 (38.7 KB/s) - ‘index.html’ saved [4/4]
可以看到传递的速度都是在100K以下的
硬件的负载均衡,比如 F5,深信服,Array等。软件负载均衡,比如 Nginx,lvs。Nginx 通过在nginx.conf 文件进行配置即可实现负载均衡。
events {
worker_connections 1024; #配置每个worker进程连接数上限,nginx支持的总连接就等于worker_connections
}
[root@192 nginx]# vi mime.types
配置nginx支持哪种多类型,可以在conf/mime.types 查看支持哪种多媒体类型
include mime.types;
# sendfile on ; #开启高效文件传输模式
# 配置access.log日志及存放路径,并使用上面定义的main日志格式
keepalive_timeout 65; 长时间连接超时时间,单位是秒
Nginx主要应用有
- 静态网络部署
- 负载均衡
- 静态代理
- 动静分离
- 虚拟主机