一、部署多个server在一台服务器上面
1.基于多个IP实现方式(很少)
目标:
10.0.0.7返回hello 10.7
172.16.1.7返回hello 172.7
[root@web01 ~]# cat /etc/nginx/conf.d/ip.conf
server {
listen 10.0.0.7:80;
location / {
root /ip1;
index index.html;
}
}
server {
listen 172.16.1.7:80;
location / {
root /ip2;
index index.html;
}
}
[root@web01 ~]# mkdir /ip1
[root@web01 ~]# mkdir /ip2
[root@web01 ~]# echo "hello,10.7" > /ip1/index.html
[root@web01 ~]# echo "hello,172.7" > /ip2/index.html
[root@web01 ~]# systemctl restart nginx
测试
[root@web01 ~]# curl 10.0.0.7:80
hello,10.7
[root@web01 ~]# curl 172.16.1.7:80
hello,172.7
2.基于不同的端口方式(测试)
[root@web01 ~]# cat /etc/nginx/conf.d/port.conf
server {
listen 8081;
location / {
root /port1;
index index.html;
}
}
server {
listen 8082;
location / {
root /port2;
index index.html;
}
}
[root@web01 ~]# mkdir /port1
[root@web01 ~]# mkdir /port2
[root@web01 ~]# echo "8081" > /port1/index.html
[root@web01 ~]# echo "8082" > /port2/index.html
[root@web01 ~]# nginx -t
[root@web01 ~]# systemctl reload nginx
5.基于不用域名的方式
目标:
docs.ux.com返回 docs
test.xu.com返回 test
cat /etc/nginx/conf.d/all.xu.com.conf
#在一个文件中,编写三个站点(实际生产都是一个域名对应一个文件,这样能够清晰找到对应的配置)
server {
listen 80;
server_name docs.xu.com;
location / {
root /docs;
index index.html;
}
}
server {
listen 80;
server_name test.xu.com;
location / {
root /test;
index index.html;
}
}
[root@web01 ~]# mkdir /docs
[root@web01 ~]# mkdir /test
[root@web01 ~]# echo "docs" > /docs/index.html
[root@web01 ~]# echo "test" > /test/index.html
[root@web01 ~]# nginx -t
[root@web01 ~]# systemctl restart nginx
记得配置域名解析(我们由于是假的域名,所以配置DNS劫持即可)
二、创建本地YUM仓库
server{
listen 80;
server_name mirrors.xu.com;
charset utf-8;
location / {
root /mirrors;
index index.html;
autoindex on;
}
#提供yum源的仓库
location /mirrors/repo {
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
}
#同步源至本地
[root@web01 mirror]# rsync -avz rsync://rsync.mirrors.ustc.edu.cn/repo/centos/ /mirror/repo/
添加用户名和密码
1.准备一个密码文件
[root@web01 mirror]# yum install httpd-tools -y
[root@web01 mirror]# htpasswd -cb /etc/nginx/auth_pass xu 123456
2.给mirrors.xu.cm的/repo添加用户密码认证
[root@web01 ~]# cat /etc/nginx/conf.d/mirrors.xu.com.conf
server{
listen 80;
server_name mirrors.xu.com;
charset utf-8;
root /mirrors;
location / {
index index.html;
autoindex on;
}
#提供yum源的仓库
location /repo {
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
auth_basic "hello";
auth_basic_user_file "/etc/nginx/auth_pass";
}
}
三、访问限制
1.请求限制(limit_req)
[root@web01 mirror]# cat /etc/nginx/conf.d/limit.oldxu.com.conf
#定义了一个10m内存空间,名称叫req_one 限制的速率是 每S 1个请求,针对的来源的IP地址
limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s;
server {
listen 80;
server_name limit.oldxu.com;
# 请求超过1r/s,剩下的将被延迟处理,请求数超过burst定义的数量,则返回503
limit_req zone=req_one burst=3 nodelay;
location / {
root /limit;
index index.html;
}
}
2.连接限制(limit_conn)
[root@web01 mirror]# cat /etc/nginx/conf.d/limit.oldxu.com.conf
#请求限制:定义了一个10m内存空间,名称叫req_one 限制的速率是 每S 1个请求,针对的来源的IP地址
limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s;
#连接限制: 定义了一个10m内存空间,名称叫conn_od,针对的是来源的IP
limit_conn_zone $binary_remote_addr zone=conn_od:10m;
server {
listen 80;
server_name limit.oldxu.com;
limit_conn conn_od 2;
limit_rate_after 100m; #先让其最快速下载100m,然后开始限速
limit_rate 200k; #限速
location / {
root /limit;
index index.html;
}
}
实际案例
[root@web01 mirror]# cat /etc/nginx/conf.d/limit.oldxu.com.conf
limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s;
limit_conn_zone $binary_remote_addr zone=conn_od:10m;
server {
listen 80;
server_name limit.oldxu.com;
charset utf-8;
limit_req zone=req_one burst=5 nodelay; #请求限制
limit_conn conn_od 1; #连接限制
limit_rate_after 100m; #100m不限速
limit_rate 500k; #限速500k
location / {
root /limit;
index index.html;
}
#错误接收 @err是一个特殊的重定向
error_page 503 @err;
location @err {
default_type text/html;
return 200 '请联系oldxu充值,联系qq:552408925';
}
}
四、监控模块(stub_stauts)
#开启nginx的状态模块
location /status{
stub_status
}
提供以下状态信息 7种状态指标
状态 | 含义 |
---|---|
Active connections | 当前活跃连接数,包括Waiting等待连接数。 |
accepts | 已接收的总TCP连接数量。 |
handled | 已处理的TCP连接数量。 |
requests | 当前总http请求数量。 |
Reading | 当前读取的请求头数量。 |
Writing | 当前响应的请求头数量。 |
Waiting | 当前等待请求的空闲客户端连接数 |
五、location匹配
1.匹配规则
匹配符 | 匹配规则 | 优先级 |
---|---|---|
= | 精确匹配 | 1 |
^~ | 以某个字符串开头 | 2 |
~ | 区分大小写的正则匹配 | 3 |
~* | 不区分大小写的正则匹配 | 4 |
/ | 通用匹配,任何请求都会匹配到 | 5 |
server {
listen 80;
server_name location2.oldxu.com;
# 通用匹配,任何请求都会匹配到
location / {
root html;
index index.html;
}
# 精准匹配,必须请求的uri是/nginx_status
location = /nginx_status {
stub_status;
}
# 严格区分大小写,匹配以.php结尾的都走这个location xx.com/1.php
location ~ \.php$ {
default_type text/html;
return 200 'php访问成功';
}
# 严格区分大小写,匹配以.jsp结尾的都走这个location
location ~ \.jsp$ {
default_type text/html;
return 200 'jsp访问成功';
}
# 不区分大小写匹配,只要用户访问.jpg,gif,png,js,css 都走这条location
location ~* \.(jpg|gif|png|js|css)$ {
return 403;
}
# 不区分大小写匹配
location ~* \.(sql|bak|tgz|tar.gz|.git)$ {
deny all;
}
}
2.location(@ 内部重定向)
error_page 404 403 401 @err;
location @err {
default_type text/html;
return 200 '你可能是不小心走丢了。';
}
六、nginx日志
1.日志格式 log_format
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
$remote_addr # 记录客户端IP地址
$remote_user # 记录客户端用户名
$time_local # 记录通用的本地时间
$time_iso8601 # 记录ISO8601标准格式下的本地时间
$request # 记录请求的方法以及请求的http协议
$status # 记录请求状态码(用于定位错误信息)
$body_bytes_sent # 发送给客户端的资源字节数,不包括响应头的大小
$bytes_sent # 发送给客户端的总字节数
$msec # 日志写入时间。单位为秒,精度是毫秒。
$http_referer # 记录从哪个页面链接访问过来的
$http_user_agent # 记录客户端浏览器相关信息
$http_x_forwarded_for #记录客户端IP地址
$request_length # 请求的长度(包括请求行, 请求头和请求正文)。
$request_time # 请求花费的时间,单位为秒,精度毫秒
2.访问日志
- access_log /var/log/nginx/access.log main
- 每一个server都会定义一个access_log。为了区分网站的访问记录
http {
access_log /var/log/nginx/access.log main;
server {
# access_log /var/log/nginx/log.oldxu.com.log main;
}
- 如果某个网站不想记录日志,则可以通过如下两种方式去实现
server {
access_log off;
#access_log /dev/null;
}
3.错误日志
- error_log /var/log/nginx/error.log warn;