02架构 03.3 Nginx 详细配置
Nginx 和 Tomcat 静态页面访问速度nginx 是所有 web 服务中处理静态资源速度最快的配置 Nginx 页面#配置nginx[root@web01 ~]# vim /etc/nginx/conf.d/ab.linux.com.confserver {listen 80;server_name ab.linux.com;location / {root /code/ab;try_fi
·
Nginx 和 Tomcat 静态页面访问速度
nginx 是所有 web 服务中处理静态资源速度最快的
配置 Nginx 页面
#配置nginx
[root@web01 ~]# vim /etc/nginx/conf.d/ab.linux.com.conf
server {
listen 80;
server_name ab.linux.com;
location / {
root /code/ab;
try_files $uri $uri/ @tomcat;
index index.html;
}
location @tomcat {
proxy_pass http://172.16.1.31:8080;
}
}
#给nginx配置一个静态页面
mkdir -p /code/ab
echo nginx_linux > /code/ab/index.html
chown -R www.www /code
#重启 Nginx
[root@web01 ~]# systemctl restart nginx
#添加解析
C:\Windows\System32\drivers\etc\hosts
10.0.0.31 ab.linux.com
#访问
ab.linux.com = ab.linux.com/index.html
#显示结果
nginx_linux
配置 Tomcat 页面
#给 Tomcat 配置一个静态页面
echo tomcat_linux > /usr/local/tomcat/webapps/ROOT/tomcat.html
#重启 Tomcat
[root@web01 ~]# systemctl restart tomcat
#访问
ab.linux.com/tomcat.html
#显示结果
nginx_linux
使用 ab 压测
#安装 ab 压测工具
yum -y install httpd-tools
#使用ab命令
ab 选项
-n 在测试会话中所执行的请求个数。默认时,仅执行一个请求。请求的总数量
-c 一次产生的请求个数。默认是一次一个。请求的用户量
-t 测试所进行的最大秒数。其内部隐含值是-n 50000,它可以使对服务器的测试限制在一个固定的总时间以内。默认时,没有时间限制。
#注意:压测域名一定要加 / 或 URI 结尾【测试的网址一定要做好解析】
#压测结果含义
Server Software: #服务的软件版本
Server Hostname: #域名或IP
Server Port: #服务端口
Document Path: #被请求的静态资源文件路径
Document Length: #被请求的静态资源文件大小
Concurrency Level: #并发数
Time taken for tests: #完成时间
Complete requests: #请求数
Failed requests: #失败的请求
Write errors: #写入错误的请求
Total transferred: #1W次请求的总字节数
HTML transferred: #去掉请求头剩下下的字节数
Requests per second: #每秒能请求的次数
Time per request: #浏览器等待每次请求的时间
Time per request: #服务器处理每次请求平均耗时【单位:毫秒】
Transfer rate: #每秒能处理的请求数据大小
#压测工具测试 Nginx 处理静态资源
[root@web01 ~]# ab -n 10000 -c 200 http://ab.linux.com/
Server Software: nginx/1.18.0
Server Hostname: ab.linux.com
Server Port: 80
Document Path: /
Document Length: 12 bytes
Concurrency Level: 200
Time taken for tests: 0.836 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 2420000 bytes
HTML transferred: 120000 bytes
Requests per second: 11961.61 [#/sec] (mean)
Time per request: 16.720 [ms] (mean)
Time per request: 0.084 [ms] (mean, across all concurrent requests)
Transfer rate: 2826.86 [Kbytes/sec] received
#停止 Nginx 后再测 Tomcat 减少跳转,对比结果更真实【其实停不停差别不大】
systemctl stop nginx
#压测工具测试 Tomcat 处理静态资源
[root@web01 ~]# ab -n 10000 -c 200 http://ab.linux.com:8080/tomcat.html
Server Software:
Server Hostname: ab.linux.com
Server Port: 8080
Document Path: /tomcat.html
Document Length: 13 bytes
Concurrency Level: 200
Time taken for tests: 2.131 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 2270000 bytes
HTML transferred: 130000 bytes
Requests per second: 4693.11 [#/sec] (mean)
Time per request: 42.616 [ms] (mean)
Time per request: 0.213 [ms] (mean, across all concurrent requests)
Transfer rate: 1040.37 [Kbytes/sec] received
Concurrency Level: 并发级别:
Time taken for tests:测试所需时间:
Complete requests: 完成请求:
Failed requests: 失败的请求:
Write errors: 写入错误:
Total transferred: 传输数据总量:
HTML transferred: HTML已传输的数据量:
Requests per second: 每秒请求数:
Time per request: 每次请求的时间:
Time per request: 每次请求的时间:
Transfer rate: 传输速率:
Http、server、location
包含文件Include
一台服务器配置多个网站,如果配置都写在nginx.conf主配置文件中,会导致nginx.conf主配置文件变得非常庞大而且可读性非常的差。那么后期的维护就变得麻烦。
假设现在希望快速的关闭一个站点,该怎么办?
1.如果是写在nginx.conf中,则需要手动注释,比较麻烦
2.如果是include的方式,那么仅需修改配置文件的扩展名,即可完成注释 Include包含的作用是为了简化主配置文件,便于可读。
inlcude /etc/nginx/online/*.conf #线上使用的配置
/etc/nginx/offline #保留配置,不启用(下次使用在移动到online中)
模块语法
# 可以在下面网站中找到 nginx 每种模块的写法
http://nginx.org/en/docs 页面向下找到 Modules reference 下面就是
使用方法 Syntax:
默认状态 Default:
写在哪里 Context:
1、目录索引模块
语法
ngx_http_autoindex_module
Syntax: autoindex on | off;
Default:autoindex off;
Context:http, server, location
范例
#设置站点目录
mkdir -p /code/web01
cp /etc/services /code/web01/a
echo '地球是个美丽的世界' > /code/web01/地球很美丽.txt
chown -R www.www /code
#设置站点配置文件
vim /etc/nginx/conf.d/web01.conf
server {
listen 80;
server_name www.web01.com;
#单独设置日志文件,方面查看
access_log /var/log/nginx/www.web01.com.log main;
#如果不设置中文字符集,网页上的中文就会出现乱码
charset 'utf-8,gbk';
location / {
root /code/web01;
#开启目录模块【还要去除/code/web01/index.html文件】
autoindex on;
#显示具体大小 off 单位是 K\M\G on 单位是比特 bytes
autoindex_exact_size off;
#显示文件最后修改的准确时间 如果是 off 需要加 8小时,是西区时间
autoindex_localtime on;
}
}
# Windows 解析
C:\Windows\System32\drivers\etc\hosts
10.0.0.31 www.web01.com
# 访问web页面查看
www.web01.com
# 网页显示结果如下:
Index of /
-------------------------------
../
a 08-Jul-2020 17:36 655K
地球很美丽.txt 08-Jul-2020 17:00 28
-------------------------------
2、访问控制模块
语法
ngx_http_access_module
#允许访问语法
Syntax: allow address | CIDR | unix: | all;
Default: —
Context: http, server, location, limit_except
#拒绝访问语法
Syntax: deny address | CIDR | unix: | all;
Default: —
Context: http, server, location, limit_except
范例
#适用场景:公司内部网段访问后台,或在家连接公司VPN后再访问后台。其他所有网络地址请求都会被拒绝访问
#设置站点目录
mkdir -p /code/web02
echo 'web02' > /code/web02/index.html
chown -R www.www /code
#设置站点配置文件
vim /etc/nginx/conf.d/web02.conf
server {
listen 80;
server_name www.web02.com;
access_log /var/log/nginx/www.web01.com.log main;
charset 'utf-8,gbk';
location / {
root /code/web02;
index index.html;
#允许来自10.0.0网段的主机访问我的/web目录
allow 10.0.0.0/24;
#拒绝所有来自10.0.0以外的网段的主机访问我的/web目录
deny all;
#上面是先允许后拒绝,下面是先拒绝后允许,可以设置只允许,也可以设置只拒绝
#允许与拒绝的目标可以是 10.0.0.0/24 或者 10.0.0.1
#拒绝来自10.0.0网段的主机访问我的/web目录
#deny 10.0.0.0/24;
#允许所有来自10.0.0以外的网段的主机访问我的/web目录
#allow all;
}
}
# Windows 解析
C:\Windows\System32\drivers\etc\hosts
10.0.0.31 www.web02.com
# 访问web页面查看
www.web02.com
3、访问认证模块
语法
ngx_http_auth_basic_module
#开启认证,注释必须写(内容随意,谷歌浏览器不可以看见,360浏览器兼容模式才看的见)
Syntax: auth_basic string | off;
Default: auth_basic off; 或者 auth_basic 123;
Context: http, server, location, limit_except
#指定认证的文件(包含)
Syntax: auth_basic_user_file file;
Default: —
Context: http, server, location, limit_except
范例
#适用场景:访问的时候需要输入账号密码
#先创建用户名和密码
[root@web01 ~]# htpasswd -c /etc/nginx/conf.d/auth_basic mcy
New password:
Re-type new password:
Adding password for user mcy
#也可以这样设置abc账户的密码为321【这种方式容易被别人看到】
[root@web01 ~]# htpasswd -cb /etc/nginx/conf.d/auth_basic abc 321
Adding password for user abc
#可以设置多个用户,但一个页面只能使用一个用户
htpasswd -cb /etc/nginx/conf.d/m1 test01 1
htpasswd -cb /etc/nginx/conf.d/m2 test02 2
#设置站点目录
mkdir -p /code/web03
echo 'web03' > /code/web03/index.html
chown -R www.www /code
#设置站点配置文件
vim /etc/nginx/conf.d/web03.conf
server {
listen 80;
server_name www.web03.com;
access_log /var/log/nginx/www.web03.com.log main;
charset 'utf-8,gbk';
location / {
root /code/web03;
index index.html;
#开启认证,注释告知来访者'不允许非法用户访问'【注释必须写,但是可以随便写】
auth_basic "Do not allow illegal user access!";
#指定认证的文件是 auth_basic 这个文件,只能用最后一次设置的用户密码
auth_basic_user_file /etc/nginx/conf.d/auth_basic;
}
}
# Windows 解析
C:\Windows\System32\drivers\etc\hosts
10.0.0.31 www.web03.com
# 访问web页面查看
www.web03.com
4、状态模块
语法
ngx_http_stub_status_module
Syntax: stub_status;
Default: —
Context: server, location
范例
#设置站点配置文件
vim /etc/nginx/conf.d/web04.conf
server {
listen 80;
server_name www.web04.com;
access_log /var/log/nginx/www.web04.com.log main;
charset 'utf-8';
#增加一个 location 访问的 uri【/mcy 这个目录在系统中可以不存在】
location /mcy {
#设置可以看连接数量统计的页面
stub_status;
}
}
# Windows 解析
C:\Windows\System32\drivers\etc\hosts
10.0.0.31 www.web04.com
# 访问web页面查看
www.web03.com/mcy
Nginx 7种状态
#访问 http://www.web01.com/mcy 页面如下
------------------------------------------------------------
Active connections: 2
server accepts handled requests
4 4 8
Reading: 0 Writing: 1 Waiting: 1
------------------------------------------------------------
Active connections # 活跃的连接数
accepts # 当前的总连接数TCP
handled # 成功的TCP连接数
requests # 总的http请求数
Reading # 读取请求头部
Writing # 返回给客户端的头部
Waiting # 等待的请求数,开启了 keepalive 【主配置文件中配置了 keepalive_timeout 65;】
# 注意, 一次TCP的连接,可以发起多次http的请求, 如下参数可配置进行验证
keepalive_timeout 0; # 类似于关闭长连接
keepalive_timeout 65; # 65秒没有活动则断开连接
------------------------------------------------------------
收集请求数
#建议用方法3,安全且不用编辑新配置文件
# 方法1:上面的设置,再访问 http://www.web01.com/mcy 页面获取,大家都可以看到
# 方法2:在上面设置的基础上修改
vim /etc/nginx/conf.d/web04.conf
server {
listen 80;
server_name 127.0.0.1;
access_log /var/log/nginx/www.web04.com.log main;
charset 'utf-8';
#增加一个location访问url【/mcy 这个目录在系统中可以不存在】
location /mcy {
#设置可以看连接数量统计的页面
stub_status;
}
}
# 命令行获取每天的总请求数:
curl -s 127.0.0.1/mcy | awk 'NR==3{print $3}'
# 方法3:任意找一个 Nginx 配置文件,限制只允许本机查看
vim /etc/nginx/conf.d/web01.conf
server {
listen 80;
server_name www.web01.com;
location / {
root /code/web01;
autoindex on;
}
location /mcy {
stub_status;
allow 127.0.0.1;
deny all;
}
}
# 命令行获取每天的总请求数:
curl -s 127.0.0.1/mcy | awk 'NR==3{print $3}'
# 可以将收集的数据存入文件,发送给一台收集信息的主机
5、连接限制模块
语法
ngx_http_limit_conn_module
#限制同一时间连接的IP数量和IP占用内存空间大小
#设置限制的内存空间/条件
# 调用模块 空间里面存的内容 空间=空间名字:空间大小
Syntax: limit_conn_zone key zone=name:size;
Default: —
Context: http
#调用上面的内存空间
Syntax: limit_conn zone number;
Default: —
Context: http, server, location
范例
#配置在负载均衡,感觉生产中不会限制,因为希望来访用户越多越好
#设置主配置文件
vim /etc/nginx/nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
#调用限制内存空间模块 来访IP 空间=空间名字:空间大小【只能用m做单位】
limit_conn_zone $remote_addr zone=accessip:10m;
#调用上面空间名字【可以随意起名,但是上下要统一】,限制每次只允许1个IP访问
limit_conn accessip 1;
include /etc/nginx/conf.d/*.conf;
}
#测试方法
web01 配置好连接限制
web02 web03 同一时间进行访问
6、限制请求模块
语法
ngx_http_stub_status_module
#设置限制的内存空间/条件
#使用模块 空间保存内容 空间=空间名字:大小 速率=1r/s
Syntax: limit_req_zone key zone=name:size rate=rate;
Default: —
Context: http
#调用上面的模块
Syntax: limit_req zone number [burst=number] [nodelay];
Default: —
Context: http, server, location
范例
#在做限制的时候,要先查看自己的网页正常情况下请求的数量,不然网页显示不全
#设置站点目录
mkdir -p /code/web06
echo 'web06' > /code/web06/index.html
chown -R www.www /code
#配置请求限制模块
vim /etc/nginx/nginx.conf
...略...
http {
...略...
#配置限制请求模块 来访ip 空间=空间名称:空间大小10M 每秒只接受1个请求
limit_req_zone $remote_addr zone=req_zone:10m rate=1r/s;
...略...
}
#设置站点配置文件
vim /etc/nginx/conf.d/web06.conf
server {
listen 80;
server_name www.web06.com;
access_log /var/log/nginx/www.web06.com.log main;
charset 'utf-8,gbk';
location / {
root /code/web06;
index index.html;
#方法1:每秒只接受每个连接的1个请求
#调用限制请求模块,空间名称
limit_req zone=req_zone;
#方法2:【延时请求】每秒接受每个连接的1个请求之后再接受5个请求
#调用限制请求模块,空间名称 每秒接受6个请求,nodelay表示5个延时请求之后全部拒绝,如果不加 nodelay 就不限制了
#limit_req zone=req_zone burst=5 nodelay;
}
}
# Windows 解析
C:\Windows\System32\drivers\etc\hosts
10.0.0.31 www.web06.com
# 访问web页面查看,按住F5不放,快速刷新页面就会发现,有时会弹出 503
www.web06.com
验证请求限制
#在 /etc/hosts 里面做好域名解析
echo '172.16.1.31 www.web06.com' >> /etc/hosts
#安装 ab 压测工具
yum -y install httpd-tools
#使用ab命令
ab 选项
-n 在测试会话中所执行的请求个数。默认时,仅执行一个请求。请求的总数量
-c 一次产生的请求个数。默认是一次一个。请求的用户量
-t 测试所进行的最大秒数。其内部隐含值是-n 50000,它可以使对服务器的测试限制在一个固定的总时间以内。默认时,没有时间限制。
#注意:压测域名一定要加 / 或 URI 结尾【测试的网址一定要做好解析】
#压测结果含义
Server Software: #服务的软件版本
Server Hostname: #域名或IP
Server Port: #服务端口
Document Path: #被请求的静态资源文件路径
Document Length: #被请求的静态资源文件大小
Concurrency Level: #并发数
Time taken for tests: #完成时间
Complete requests: #请求数
Failed requests: #失败的请求
Write errors: #写入错误的请求
Total transferred: #1W次请求的总字节数
HTML transferred: #去掉请求头剩下下的字节数
Requests per second: #每秒能请求的次数
Time per request: #浏览器等待每次请求的时间
Time per request: #服务器处理每次请求平均耗时【单位:毫秒】
Transfer rate: #每秒能处理的请求数据大小
#每秒只接受1个请求
[root@web01 conf.d]# ab -n 20 -c 2 http://www.web06.com/
Server Software: nginx/1.16.1
Server Hostname: www.mario.com
Server Port: 80
Document Path: /download/
Document Length: 179 bytes
Concurrency Level: 2
Time taken for tests: 0.002 seconds
Complete requests: 20
Failed requests: 19
(Connect: 0, Receive: 0, Length: 19, Exceptions: 0)
#配置5个延时请求之后
[root@web01 code]# ab -n 20 -c 2 http://www.web06.com/
Server Software: nginx/1.16.1
Server Hostname: www.mario.com
Server Port: 80
Document Path: /download/
Document Length: 179 bytes
Concurrency Level: 2
Time taken for tests: 0.002 seconds
Complete requests: 20
Failed requests: 14
(Connect: 0, Receive: 0, Length: 14, Exceptions: 0)
7、上传文件大小
语法
Syntax: client_max_body_size size;
Default: client_max_body_size 1m;
Context: http, server, location
范例
#也可以放入http层,全局生效,根据需要放入server或location层也可以限制不同页面的上传大小
server {
listen 80;
server_name _;
client_max_body_size 200m;
}
Server 层
隐藏规则 default_server
# 前面我们在 nginx 的主配置文件中的 http 层有配置
include /etc/nginx/conf.d/*.conf
# 上面这条配置包含了所有 server 层的配置文件
# 先配2个 server 层配置文件
/etc/nginx/conf.d/a.conf
server {
listen 80;
server_name _;
root /data/code;
index 1.html;
}
/etc/nginx/conf.d/b.conf
server {
listen 80;
server_name _;
root /data/code;
index 2.html;
}
# 写2个对应的页面文件
echo 1 > /data/code/1.html
echo 2 > /data/code/2.html
# 检查没有错误后重启 nginx 服务
nginx -t
systemctl restart nginx
# 浏览器访问 web 服务器的IP 会看到页面显示 1
这是因为在 nginx 配置规则中有一个隐藏规则 default_server
listen 80 default_server;
在所有配置文件中都没有定义 default_server 时,nginx 会按 ascii 排序将配置的第一个 server 层配置文件作为 default_server,即当请求没有匹配到任何 server_name 时,此 a.conf 会处理此请求
server_name _;
这里的 '_' 只是作为一个和业务域名无关的请求回收服务而已,如果我们线上的业务都是明确的业务域名访问,那泛解析造成的一些非业务域名或ip访问都会被这个 sever 回收处理。
优先级
1.首先选择所有的字符串完全匹配的server_name 如 www.mumusir.com (完全匹配)
2.选择通配符在前面的server_name,如 *.mumusir.com,
3.再匹配通配符在后面的如 www.mumusir.*
4.最后选择使用正则表达式匹配的server_name,如 ~^www\.(.*)\.com$
5.如果全部都没有匹配到,那么将选择在listen配置项后加入[default_server]的server块
如 listen 80 default_server;
6.如果没写,那么就找到匹配listen端口的第一个Server块的配置文件
当出现多个相同的server_name情况下,配置文件排序优先使用则会被调用,所以建议配置相同端口,不同域名,这样不会出现域名访问冲突。
#如果出现单台机器多配置文件,页面访问错误的问题
1.如过直接报错,查看hosts是否解析
2.如果访问页面没有对应上
查看配置文件是否写错域名
检查nginx是否重启
访问网页的多种方式【多虚拟主机】
1、根据IP访问
根据IP访问【前提是主机有多个IP】【应用场景:适合公司内部人员访问后台页面,外网通过VPN访问】
vim /etc/nginx/conf.d/ip1.conf
server {
listen 10.0.0.8:80;
server_name _;
location / {
root /code;
index index.html;
}
}
vim /etc/nginx/conf.d/ip2.conf
server {
listen 172.16.1.8:80;
server_name _;
location / {
root /code1;
index index.html;
}
}
2、根据端口访问
根据端口访问【前提是端口不能被占用】
vim /etc/nginx/conf.d/port1.conf
server {
listen 80;
server_name localhost;
location / {
root /code/a;
index index.html;
}
}
vim /etc/nginx/conf.d/port2.conf
server {
listen 81;
server_name localhost;
location / {
root /code/b;
index index.html;
}
}
3、根据域名访问
根据域名访问【用的最多,一个IP可以匹配多个域名】
vim /etc/nginx/conf.d/server1.conf
server {
listen 80;
server_name www.web01.com;
location / {
root /web;
index index.html;
}
}
vim /etc/nginx/conf.d/server2.conf
server {
listen 80;
server_name www.web02.com;
location /mcy {
root /web;
index index.html;
}
}
#windows配置域名解析
C:\windows\System32\drivers\etc\hosts
10.0.0.8 www.web01.com www.web02.com
实际访问页面:
www.web01.com /web/index.html
www.web02.com /web/mcy/index.html
禁止IP直接访问
server {
listen 80 default_server;
server_name _;
return 500;
}
使用ip访问时跳转到指定页面
server {
listen 80 default_server;
server_name _;
return 302 http://www.baidu.com;
}
Location 层
1、语法
Syntax: location [ = | ~ | ~* | ^~ | / ] uri { ... }
location @name { ... }
Default: —
Context: server, location
#整体叫URL
https://timgsa.baidu.com/mhqcw16j30u01401kx.jpg
# / 后面的叫 URI
mhqcw16j30u01401kx.jpg
范例:
server {
listen 80;
server_name www.web01.com;
location /web01 {
root /code;
index index.html;
}
}
释义:
当我们在浏览器输入: www.web01.com
访问顺序是:拿着 location 匹配的内容 /web01 去站点目录 /code 下面的 /web01 里面去找 index.html
实际我们访问的资源是:/code/web01/index.html
2、匹配规则
[root@Nginx conf.d]# cat testserver.conf
server {
listen 80;
server_name www.server.com;
location / {
default_type text/html;
return 200 "location /";
}
location =/ {
default_type text/html;
return 200 "location =/";
}
location ~ / {
default_type text/html;
return 200 "location ~/";
}
# location / 与 location ^~ / 效果一样,同时存在会冲突
# location ^~ / {
# default_type text/html;
# return 200 "location ^~";
# }
}
3、优先级
匹配符 | 匹配规则 | 优先级 |
---|---|---|
= | 精确匹配 | 1 |
^~ | 以某个字符串开头 | 2 |
~ | 区分大小写的正则匹配 | 3 |
~* | 不区分大小写的正则匹配 | 4 |
/ | 通用匹配,任何请求都会匹配到 | 5 |
4、验证优先级
[root@web01 conf.d]# cat testserver.conf
server {
listen 80;
server_name www.server.com;
location / {
root /code;
}
#这里的 \ 是转义紧跟着的字符的含义,如下
location ~ \.php$ {
root /php;
}
location ~ \.jsp$ {
root /jsp;
}
location ~* .*\.(jpg|gif|png|js|css)$ {
root /pic;
}
location ~* "\.(sql|bak|tgz|tar.gz|.git)$" {
root /package;
}
}
#通过日志查看 localtion 的匹配规则
tailf /var/log/nginx/error.log
#访问
www.server.com/test.php
www.server.com/test.jsp
www.server.com/test.jpg
5、自定义报错跳转页面
#设置站点目录
mkdir -p /code/request
echo 'request' > /code/request/index.html
echo '出错了,你刷新太快' > /code/request/503.html
chown -R www.www /code
#设置站点配置文件
vim /etc/nginx/conf.d/request.conf
limit_req_zone $remote_addr zone=req_zone:10m rate=1r/s;
server {
listen 80;
server_name www.request.com;
access_log /var/log/nginx/www.request.com.log main;
charset 'utf-8';
location / {
root /code/request;
index index.html;
limit_req zone=req_zone;
#访问错误页面,报错跳转指定页面
error_page 503 /503.html;
}
}
# Windows 解析
C:\Windows\System32\drivers\etc\hosts
10.0.0.31 www.request.com
# 访问web页面查看,按住F5不放,快速刷新页面就会发现,有时会弹出 503
www.request.com
# 示例
#跳转本地页面,错误页面是由web服务器返回的
vim server1.conf
server {
listen 80;
server_name test1.linux.com;
root /code/test1;
index index.html;
error_page 404 /404.html;
error_page 403 /403.html;
error_page 502 /502.html;
error_page 503 /503.html;
location = /404.html {
root /code/error;
}
}
#跳转域名
vim server1.conf
server {
listen 80;
server_name test1.linux.com;
root /code/test1;
index index.html;
error_page 404 http://www.baidu.com;
}
6、root与alias
root与alias路径匹配主要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上,alias是一个目录别名的定义,root则是最上层目录的定义。
root的处理结果是:root路径+location路径
alias的处理结果是:使用alias定义的路径
# 使用root时
用户访问 http://web.com/picture/1.jpg
此时的 uri 是 /picture/1.jpg
Nginx 拿着 uri 去匹配 location 的值,匹配到,在前面加上 root 的值,后面加上uri 未匹配到的字符
root值+location值+uri未匹配的字符
/code/picture/1.jpg
server {
listen 80;
server_name web.com;
location /picture {
root /code
}
}
# 使用alias时
用户访问http://web.com/picture/1.jpg
此时的 uri 是 /picture/1.jpg
Nginx 拿着 uri 去匹配 location 的值,匹配到,就将location值替换为 alias值
alias值+uri未匹配的字符
/code/1.jpg
server {
listen 80;
server_name web.com;
location /picture {
alias /code;
}
#alias注意 配置的时候 lication 有 ‘/’ alias也要有‘/’,要是没有就都没有
#location /picture/ {
# alias /code/;
#}
}
#3.root 与 alias 同时使用
[root@web01 ~]# cat /etc/nginx/conf.d/web.conf
server {
listen 80;
server_name web.com;
location / {
root /data/code/web;
}
location ~* ^/tupian/(.+\.(?:gif|jpe?g|png))$ {
alias /data/code/images/$1;
}
}
用户访问 http://web.com/tupian/1.jpg
[root@web01 ~]# tail -1 /var/log/nginx/error.log
2021/12/20 00:48:48 [error] 115571#115571: *1 open() "/data/code/images/1.jpg" failed (2: No such file or directory), client: 10.0.0.1, server: web.com, request: "GET /tupian/1.jpg HTTP/1.1", host: "web.com"
用户访问 http://web.com/1.jpg
[root@web01 ~]# tail -1 /var/log/nginx/error.log
2021/12/20 00:50:27 [error] 115571#115571: *2 open() "/data/code/web/1.jpg" failed (2: No such file or directory), client: 10.0.0.1, server: web.com, request: "GET /1.jpg HTTP/1.1", host: "web.com"
[root@web01 ~]# cat /etc/nginx/conf.d/web.conf
server {
listen 80;
server_name web.com;
location / {
root /data/code/web;
}
location ~* ^/(.+\.(?:gif|jpe?g|png))$ {
alias /data/code/images/$1;
}
}
用户访问 http://web.com/tupian/1.jpg
[root@web01 ~]# tail -1 /var/log/nginx/error.log
2021/12/20 00:53:57 [error] 115846#115846: *1 open() "/data/code/images/tupian/1.jpg" failed (2: No such file or directory), client: 10.0.0.1, server: web.com, request: "GET /tupian/1.jpg HTTP/1.1", host: "web.com"
用户访问 http://web.com/1.jpg
[root@web01 ~]# tail -1 /var/log/nginx/error.log
2021/12/20 00:37:48 [error] 113758#113758: *4 open() "/data/code/images/1.jpg" failed (2: No such file or directory), client: 10.0.0.1, server: web.com, request: "GET /1.jpg HTTP/1.1", host: "web.com"
说一下上面正则的使用说明
(.+\.(?:gif|jpe?g|png))
第一层 () 会被下面的 $1 引用
.+ 任意字符1到N个
\. 标点 .
(?:) 匹配组,?: 用于标记该匹配组不应被捕获
gif|jpe?g|png gif 或者 jpg 或者 jpeg 或者 png
$ 末位符
# 实测6种写法访问的实际路径,浏览器访问 web.com/1.jpg
1-4 ok 目录不存在时 location 与 alias 分别加 / 的4种情况
1、
[root@web01 ~]# cat /etc/nginx/conf.d/web.conf
server {
listen 80;
server_name web.com;
location /ok {
alias /data/code/images;
}
}
[root@web01 ~]# tail -1 /var/log/nginx/error.log
2021/12/19 14:50:38 [error] 85344#85344: *2 open() "/usr/share/nginx/html/1.jpg" failed (2: No such file or directory), client: 10.0.0.1, server: web.com, request: "GET /1.jpg HTTP/1.1", host: "web.com"
2、
[root@web01 ~]# cat /etc/nginx/conf.d/web.conf
server {
listen 80;
server_name web.com;
location /ok/ {
alias /data/code/images/;
}
}
[root@web01 ~]# tail -1 /var/log/nginx/error.log
2021/12/19 15:01:13 [error] 85668#85668: *3 open() "/usr/share/nginx/html/1.jpg" failed (2: No such file or directory), client: 10.0.0.1, server: web.com, request: "GET /1.jpg HTTP/1.1", host: "web.com"
3、
[root@web01 ~]# cat /etc/nginx/conf.d/web.conf
server {
listen 80;
server_name web.com;
location /ok {
alias /data/code/images/;
}
}
[root@web01 ~]# tail -1 /var/log/nginx/error.log
2021/12/19 15:04:56 [error] 86096#86096: *1 open() "/usr/share/nginx/html/1.jpg" failed (2: No such file or directory), client: 10.0.0.1, server: web.com, request: "GET /1.jpg HTTP/1.1", host: "web.com"
4、
[root@web01 ~]# cat /etc/nginx/conf.d/web.conf
server {
listen 80;
server_name web.com;
location /ok/ {
alias /data/code/images;
}
}
[root@web01 ~]# tail -1 /var/log/nginx/error.log
2021/12/19 15:06:36 [error] 86201#86201: *1 open() "/usr/share/nginx/html/1.jpg" failed (2: No such file or directory), client: 10.0.0.1, server: web.com, request: "GET /1.jpg HTTP/1.1", host: "web.com"
5、location / 与 alias /data/code/images;
[root@web01 ~]# cat /etc/nginx/conf.d/web.conf
server {
listen 80;
server_name web.com;
location / {
alias /data/code/images;
}
}
[root@web01 ~]# tail -1 /var/log/nginx/error.log
2021/12/19 15:08:26 [error] 86308#86308: *1 open() "/data/code/images1.jpg" failed (2: No such file or directory), client: 10.0.0.1, server: web.com, request: "GET /1.jpg HTTP/1.1", host: "web.com"
6、location / 与 alias /data/code/images/;
[root@web01 ~]# cat /etc/nginx/conf.d/web.conf
server {
listen 80;
server_name web.com;
location / {
alias /data/code/images/;
}
}
[root@web01 ~]# tail -1 /var/log/nginx/error.log
2021/12/19 15:11:24 [error] 86443#86443: *1 open() "/data/code/images/1.jpg" failed (2: No such file or directory), client: 10.0.0.1, server: web.com, request: "GET /1.jpg HTTP/1.1", host: "web.com"
7、try_file 路径匹配
Nginx 的try_file路径匹配,会按顺序检查文件及目录是否存在(根据 root 和 alias 指令设置的参数构造完整的文件路径)
并用找到的第一个文件提供服务。
在 uri 元素名后面添加斜杠 / 表示这个是目录。
如果文件和目录都不存在,Nginx会执行内部重定向,跳转到命令的最后一个 uri 参数定义的 URI 中。
#重点注意:如果用了 try_file 那访问时域名后面一定要加 uri,不然就会匹配后一个参数
1、实例1
#1.try_file配置
[root@lb01 conf.d]# vim try.conf
server {
listen 80;
server_name try.linux.com;
root /code;
index index.html;
location / {
try_files $uri /404.html;
}
}
用户访问 try.linux.com
try_files $uri /404.html; # Nginx 先找URI,找不到就去找 404.html
try_files $uri/ /404.html; # Nginx 先找URI/,URI是空的,就找到 / = /code/index.html
try_files $uri $uri/ /404.html; # Nginx 先找URI,找不到就去找URI/,能找到就返回数据,找不到就去找 404.html
#2.创建实例目录与文件linux
[root@lb01 conf.d]# echo try11111 > /code/index.html
[root@lb01 conf.d]# echo '404 404 404' > /code/404.html
#3.尝试访问try.linux.com
[root@lb01 conf.d]# curl try.linux.com
404 404 404
#由于访问的是try.linux.com,而$uri取得是域名后面我们写的内容,它找不到,所以访问后面的内容,即404.html
#4.尝试访问try.linux.com/index.html
[root@lb01 conf.d]# curl try.linux.com/index.html
try11111
#由于访问的是try.linux.com/index.html,而$uri取到了index.html所以返回/code/index.html的内容
#5.修改配置为
location / {
try_files $uri $uri/ /404.html;
}
#6.再次尝试访问try.linux.com
[root@lb01 conf.d]# curl try.linux.com
try11111
#我们访问的是try.linux.com,而$uri我们没有写任何内容,于是他访问的便是“空/”,即匹配到/code/index.html
2、实例2
#1. 配置nginx
[root@lb01 conf.d]# cat try.conf
server {
listen 80;
server_name try.linux.com;
root /code;
index index.html;
location / {
try_files $uri $uri/ @java;
#当$uri和$uri/都匹配不到时,由后端的java来进行处理,名字可自定义,但一定要加@
# @ 内部跳转的意思 @java = 调用 @java
}
# 配置 @java
location @java {
#配置后端tomcat
proxy_pass http://172.16.1.8:8080;
}
}
#2. 配置后端tomcat
[root@web02 ~]# cd /usr/share/tomcat/webapps/ROOT
[root@web02 ROOT]# echo 'i am tomcat' > index.html
[root@web02 ROOT]# systemctl start tomcat
#3. 把文件都挪走
[root@lb01 code]# mv index.html index1.html /tmp/
#4. 测试访问
[root@lb01 code]# curl http://try.linux.com/index.html
i am tomcat
rewrite
理论
# 什么是 rewrite
Rewrite 主要实现 url 地址重写,以及重定向,就是把传入`web`的请求重定向到其他`url`的过程。
Rewrite 使用场景
1、地址跳转,用户访问blog.linux.com/test 这个URL时,将其定向至http://www.baidu.com
server {
listen 80;
server_name blog.linux.com;
location /test {
rewrite ^(.*)$ http://www.baidu.com;
}
}
2、协议跳转,用户通过http协议请求网站时,将其重新跳转至https协议方式
server {
listen 80;
server_name www.mumusir.com mumusir.com;
rewrite ^(.*)$ https://www.mumusir.com;
#rewrite ^(.*)$ https://$server_name$1;
#return 302 https://$server_name$request_uri;
}
3、伪静态,将动态页面显示为静态页面方式的一种技术,便于搜索引擎的录入,同时建上动态URL地址对外暴露过多的参数,提升更高的安全性。
4、搜索引擎,SEO优化依赖于url路径,好记的url便于智齿搜索引擎录入
Rewrite 配置语法
Syntax: rewrite regex replacement [flag];
Default: —
Context: server, location, if
#rewrite调用 访问的URL地址(支持正则) 跳转后的地址 标签
rewrite regex replacement [flag];
# 示例 if 层
server {
listen 80;
server_name www.jd.com;
if ($http_user_agent ~* "Android|Iphone") {
rewrite ^(.*)$ https://m.jd.com/ redirect;
}
}
flag
rewrite
指令根据表达式来重定向URL
,或者修改字符串,可以应用于server,location,if
环境下,每行rewrite
指令最后跟一个flag
标记,支持的flag
标记有如下表格所示:
flag | 作用 |
---|---|
last | 本条规则匹配完成后,停止匹配,不再匹配后面的规则 |
若没匹配成功,也不再匹配。 | |
break | 本条规则匹配完成后,停止匹配,不再匹配后面的规则 |
若没匹配成功,会在本server层继续匹配其他location层的规则 | |
redirect | 返回302临时重定向,地址栏会显示跳转后的地址 |
permanent | 返回301永久重定向,地址栏会显示跳转后的地址【不清理缓存就一直跳转】 |
1.last与break区别对比示例
[root@web01 ~]# vim /etc/nginx/conf.d/rw.linux.com.conf
server {
listen 80;
server_name rw.linux.com;
root /code/rw;
location ~ ^/break {
rewrite ^/break /test/ break;
}
location ~ ^/last {
rewrite ^/last /test/ last;
}
location /test/ {
#给请求加一个文件类型,不添加就会直接下载【也可以写 jpg|txt|json】
default_type application/json;
return 200 "ok";
}
}
# 相同点
break 只要匹配到规则,则会去本地配置路径的目录中寻找请求的文件;
last 只要匹配到规则,会对其所在的server(...)标签重新发起请求。
# 不同点
break请求:
1、请求rewrite.drz.com/break
2、匹配到相应的location,被rewrite重写为 rewrite.drz.com/test
3、接着会去查找本地的 /code/rw/test/index.html;
4、如果找到了,则返回 /code/rw/test/index.html; 的内容
5、如果没找到该目录,则报错404,如果找到该目录没找到对应的文件,则报错403
last请求:
1、请求rewrite.drz.com/last
2、匹配到相应的location,被rewrite重写为 rewrite.drz.com/test
3、接着会去查找本地的 /code/rw/test/index.html;
4、如果找到了,则返回 /code/rw/test/index.html; 的内容
5、如果没找到,会对当前server重新的发起一次请求,请求的 URL 为 rewrite.drz.com/test/
6、如果有location匹配上,则直接返回该location里面的内容。
7、如果也没有location匹配,再返回404;
简单来说
break 匹配之后 拿着重写的 URL 去本层 location 匹配,匹配不到就结束了
last 匹配之后 拿着重写的 URL 去本层 location 匹配,匹配不到就拿着重写的 URL 去 server 层去匹配其他的 location
2.redirect和permanent的区别示例
[root@web01 conf.d]# cat rw.linux.com.conf
server {
listen 80;
server_name rw.linux.com;
root /code;
location /test {
rewrite ^(.*)$ http://www.baidu.com redirect;
#return 302 http://www.baidu.com;
#rewrite ^(.*)$ http://www.163.com permanent;
#return 301 http://www.163.com;
}
}
# redirect和permanent的区别
redirect: 每次请求都会询问服务器,如果当服务器不可用时,则会跳转失败。
permanent: 第一次请求会询问,浏览器会记录跳转的地址 http://www.163.com,
第二次访问前先关闭web主机的nginx服务,再次访问 rw.linux.com 通过浏览器缓存的地址跳转至http://www.163.com
只要不清除缓存就一直会自动跳转
break 配置实例
0.为了方便排错,开启日志
[root@web01 ~]# vim /etc/nginx/nginx.conf
error_log /var/log/nginx/error.log notice;
http {
... ...
rewrite_log on;
... ...
}
1.实例一:
用户访问`/abc/1.html`实际上真实访问的是`/ccc/bbb/2.html`
#1.配置跳转后的文件
[root@web01 ~]# mkdir /code/rw/ccc/bbb -p
[root@web01 ~]# echo "ccc_bbb_222" > /code/rw/ccc/bbb/2.html
#配置nginx跳转
[root@web01 ~]# vim /etc/nginx/conf.d/rw.linux.com.conf
server {
listen 80;
server_name rw.linux.com;
root /code/rw;
location /abc {
rewrite ^/abc /ccc/bbb/2.html break;
}
}
#页面访问测试
http://rw.linux.com/abc/1.html
2.实例二:
用户访问`/2018/ccc/2.html`实际上真实访问的是`/2014/ccc/bbb/2.html`
#配置跳转后页面
[root@web01 ~]# mkdir /code/rw/2014/ccc/bbb/ -p
[root@web01 ~]# echo "/code/rw/2014/ccc/bbb/2.html" > /code/rw/2014/ccc/bbb/2.html
#配置nginx
[root@web01 ~]# vim /etc/nginx/conf.d/rw.linux.com.conf
server {
listen 80;
server_name rw.linux.com;
root /code/rw;
location /2018 {
rewrite ^/2018/(.*).html /2014/ccc/bbb/$1.html break;
}
}
#访问测试
http://rw.linux.com/2018/2.html
3.实例三:
用户访问/test实际上真实访问的是http://www.baidu.com
#配置nginx
[root@web01 ~]# vim /etc/nginx/conf.d/rw.linux.com.conf
server {
listen 80;
server_name rw.linux.com;
root /code/rw;
location /test {
rewrite (.*) http://www.baidu.com break;
}
}
4.实例四:
用户访问`course-11-22-33.html`实际上真实访问的是`/course/11/22/33/course_33.html`
#配置跳转后页面
[root@web01 ~]# mkdir /code/rw/course/11/22/33 -p
[root@web01 ~]# echo "/course/11/22/33/course_33.html" > /code/rw/course/11/22/33/course_33.html
#僵硬匹配
[root@web01 ~]# vim /etc/nginx/conf.d/rw.linux.com.conf
server {
listen 80;
server_name rw.linux.com;
root /code/rw;
location /course {
rewrite ^/course-11-22-33.html /course/11/22/33/course_33.html break;
}
}
#灵活匹配
[root@web01 ~]# vim /etc/nginx/conf.d/rw.linux.com.conf
server {
listen 80;
server_name rw.linux.com;
root /code/rw;
location / {
rewrite ^/(.*)-(.*)-(.*)-(.*).html /$1/$2/$3/$4/$1_$4.html break;
rewrite ^/course-11-22-33.html /course/11/22/33/course_33.html break;
}
}
rewrite 伪静态
# 原文链接:https://blog.csdn.net/qq_41718455/article/details/80593029
# html静态页(真静态):
优点:一是减少服务器对数据响应的负荷,二是加载不用调动数据库,响应速度快。
缺点:一是维护不方便,每次都要手动生成。三是空间占用比较大。三是生成的文件多了,服务器对html文件的响应负担也较重。
# 伪静态:
url 重写(伪静态)的好处:
一,可以方便的实现对化化引擎的优化,并且比生成静态更加方便。
二、占空间比较小。
三、首页每天都自动变化,不用维护。网站首页一般都有热点排行之类的,你可以设为,24小时排行,一周排行,再加上最新文章,最新点评等。这样首页天天是有变化的。
四,便于广告的轮显。比如:你可以把 art1234.aspx,这个虚成n个页,如art_1234.aspx,news_1234.aspx,top_1234.aspx,在不同的页面放 不同的广告.
总之是动态的,你就可以随意动。
url重写的缺点:那就是效率不如生成html的,因为它不是真正意义上的静态页,每次请求是要读取数据库的。但你可以用缓存技术来补偿一下。
1.搭建discuz
#上传代码
[root@web01 ~]# cd /code/
[root@web01 code]# rz Discuz_X3.3_SC_GBK.zip
#解压代码
[root@web01 code]# unzip Discuz_X3.3_SC_GBK.zip
#授权目录
[root@web01 ~]# chown -R www.www /code/
#配置站点配置nginx
[root@web01 ~]# vim /etc/nginx/conf.d/discuz.linux.com.conf
server {
listen 80;
server_name discuz.linux.com;
location / {
root /code/upload;
index index.php;
}
location ~ \.php$ {
root /code/upload;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
[root@web01 ~]# systemctl restart nginx
#创建数据库
[root@db01 ~]# mysql -uroot -p
Enter password:
MariaDB [(none)]> create database ultrax;
Query OK, 1 row affected (0.02 sec)
MariaDB [(none)]> grant all on 库名字.* to 用户@'主机地址' identified by '密码';
MariaDB [(none)]> grant all on *.* to root@'%' identified by '123456';
#配置host,访问页面配置
2.rewrite 配置伪静态
[root@web01 ~]# cat /etc/nginx/conf.d/discuz.linux.com.conf
server {
listen 80;
server_name discuz.linux.com;
location / {
root /code/upload;
index index.php;
#下面的 rewrite 来自 discuz 网站的 管理中心 页面,具体步骤看 48-2_rewrite伪静态.ev4 视屏
rewrite ^([^\.]*)/topic-(.+)\.html$ $1/portal.php?mod=topic&topic=$2 last;
rewrite ^([^\.]*)/article-([0-9]+)-([0-9]+)\.html$ $1/portal.php?mod=view&aid=$2&page=$3 last;
rewrite ^([^\.]*)/forum-(\w+)-([0-9]+)\.html$ $1/forum.php?mod=forumdisplay&fid=$2&page=$3 last;
rewrite ^([^\.]*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=viewthread&tid=$2&extra=page%3D$4&page=$3 last;
rewrite ^([^\.]*)/group-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=group&fid=$2&page=$3 last;
rewrite ^([^\.]*)/space-(username|uid)-(.+)\.html$ $1/home.php?mod=space&$2=$3 last;
rewrite ^([^\.]*)/blog-([0-9]+)-([0-9]+)\.html$ $1/home.php?mod=space&uid=$2&do=blog&id=$3 last;
rewrite ^([^\.]*)/(fid|tid)-([0-9]+)\.html$ $1/archiver/index.php?action=$2&value=$3 last;
rewrite ^([^\.]*)/([a-z]+[a-z0-9_]*)-([a-z0-9_\-]+)\.html$ $1/plugin.php?id=$2:$3 last;
if (!-e $request_filename) {
return 404;
}
}
location ~ \.php$ {
root /code/upload;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
#具体步骤
管理中心》全局》SEO设置》URL静态化》把需要静态化的页面都勾上,rewrite 兼容性选 是》提交
》查看当前的 rewrite 规则》选择对应的 Nginx Web Server
rewrite 扩展
1.rewrite匹配优先级
1.先执行server块的rewrite指令
2.其次执行location匹配规则
3.最后执行location中if语句的rewrite
server {
listen 80;
server_name rew.linux.com;
rewrite (.*) http://www.baidu.com;
location / {
rewrite (.*) http://www.jd.com;
if ($http_user_agent ~* Windows) {
rewrite (.*) http://www.taobao.com;
}
}
}
2.Rewrite与Nginx全局变量
Rewrite在匹配过程中,会用到一些Nginx全局变量
$server_name #当前用户请求的域名
server {
listen 80;
server_name test.drz.com;
rewrite ^(.*)$ https://$server_name$1;
}
$request_filename 请求的文件路径名(带网站的主目录/code/images/test.jpg)
$request_uri 当前请求的文件路径(不带网站的主目录/inages/test.jpg)
#大多数用于http协议转https协议
server {
listen 80;
server_name php.drz.com;
return 302 https://$server_name$request_uri;
}
$scheme 用的协议,比如http或者https
3.rewrite 规范写法
server {
listen 80;
server_name www.drz.com drz.com;
if ($http_host = drz.com){
rewrite (.*) http://www.drz.com$1;
}
}
#推荐书写格式
server {
listen 80;
server_name drz.com;
rewrite ^ http://www.drz.com$request_uri;
}
server {
listen 80;
server_name www.drz.com;
}
Nginx 优化
压测工具 ab
#安装 ab 压测工具
yum -y install httpd-tools
#使用ab命令
ab 选项
-n 在测试会话中所执行的请求个数。默认时,仅执行一个请求。请求的总数量
-c 一次产生的请求个数。默认是一次一个。请求的用户量
-t 测试所进行的最大秒数。其内部隐含值是-n 50000,它可以使对服务器的测试限制在一个固定的总时间以内。默认时,没有时间限制。
#注意:压测域名一定要加 / 或 URI 结尾【测试的网址一定要做好解析】
#压测结果含义
Server Software: #服务的软件版本
Server Hostname: #域名或IP
Server Port: #服务端口
Document Path: #被请求的静态资源文件路径
Document Length: #被请求的静态资源文件大小
Concurrency Level: #并发数
Time taken for tests: #完成时间
Complete requests: #请求数
Failed requests: #失败的请求
Write errors: #写入错误的请求
Total transferred: #1W次请求的总字节数
HTML transferred: #去掉请求头剩下下的字节数
Requests per second: #每秒能请求的次数
Time per request: #浏览器等待每次请求的时间
Time per request: #服务器处理每次请求平均耗时【单位:毫秒】
Transfer rate: #每秒能处理的请求数据大小
ab -n 10000 -c 200 http://ab.linux.com/
影响性能指标
1、首先需要了解我们当前系统的结构和瓶颈,了解当前使用的是什么,运行的是什么业务,都有哪些服务,了解每个服务最大能支撑多少并发。
比如nginx作为静态资源服务并发是多少,最高瓶颈在哪里,能支持多少qps(每秒查询率)的访问请求,那我们怎么得出这组系统结构瓶颈呢,比如top查看系统的CPU负载、内存使用率、总得运行进程等,也可以通过日志去分析请求的情况,当然也可以通过我们前面介绍到的stub_status模块查看当前的连接情况,也可以对线上的业务进行压力测试(低峰期),去了解当前这套系统能承担多少的请求和并发,已做好响应的评估。这个是我们做性能优化最先考虑的地方。
2、其次我们需要了解业务模式,虽然我们是做性能优化,但每一个性能的优化都是为业务所提供的服务的,我们需要了解每个业务接口的类型,比如:电商网站中的抢购模式,这种情况下面,平时没什么流量,但到了抢购时间流量会突增。
我们还需要了解系统层次化的结构,比如:我们使用nginx做的是代理、还是动静分离、还是后端直接服务用户,那么这个就需要我们对每一层做好相应的梳理。以便更好的服务业务。
3、最后我们需要考虑性能与安全,往往注重了性能,但是忽略了安全。往往过于注重安全,对性能又会产生影响。比如:我们在设计防火墙功能时,检测过于严密,这样就会给性能带来影响。那么如果对于性能完全追求,却不顾服务的安全,这个也会造成很大的隐患,所以需要评估好两者的关系,把握好两者的孰重孰轻。以及整体的相关性,权衡好对应的点。
从OSI模型考虑优化方向
硬件 代理(CPU) 静态(磁盘IO) 动态(cpu、内存)
网络 贷款、丢包、延迟
系统 文件描述符(文件句柄数)
应用 服务与服务保持长连接 http1.1
服务 静态资源服务优化
#优化前先归纳下哪些会影响到用户访问
#每个服务与服务之间都或多或少有一些关联,需要将整个架构进行分层,找到对应系统或服务的短板,然后进行优化
1、网络
(1)网络的流量
(2)网络是否丢包
(3)这些会影响http的请求与调用
2、系统
(1)硬件有没有磁盘损坏,磁盘速率
(2)系统的负载、内存、系统稳定性
3、服务
(1)连接优化。请求优化
(2)根据业务形态做对应的服务设置
4、程序
(1)接口性能
(2)处理速度
(3)程序执行效率
5、数据库
系统性能优化
介绍
文件句柄,Linux一切皆文件,文件句柄可以理解为就是一个索引,文件句柄会随着我们进程的调用频繁而增加,系统默认文件句柄是有限制的1024,不能让一个进程无限的调用,所以我们需要限制每个 进程和每个服务使用多大的文件句柄,文件句柄也是必须要调整的优化参数。
文件句柄的设置方式:
1、系统全局性修改
2、用户局部性修改
3、进程局部性修改【针对服务如:nginx】
设置
#查看现在的文件句柄数
[root@web01 ~]# ulimit -n
65535
#设置的数值不能大于 cat /proc/sys/fs/nr_open 的值,否则注销后将无法正常登录
[root@web01 ~]# cat /proc/sys/fs/nr_open
1048576
# 系统全局性修改【根据实际需要可以改更大,不超过 /proc/sys/fs/nr_open 的值】
# soft 小于或等于 hard
cat >> /etc/security/limits.conf << EOF
* soft nofile 32768
* hard nofile 65535
EOF
# www 用户局部性修改
cat >> /etc/security/limits.conf << EOF
www soft nofile 32768
www hard nofile 65535
EOF
# 进程局部性修改
vim /etc/nginx/nginx.conf
user www;
worker_processes auto;
worker_rlimit_nofile 30000 #添加此行
端口重用
开启长链接优点降低三次握手四次挥手次数,缺点是结束连接后会处于time_wait状态,占用端口
#调整内核参数:让time_wait状态占用的端口重用
vim /etc/sysctl.conf
net.ipv4.tcp_tw_reuse = 1
#生效
sysctl -p
代理服务器优化
在高并发短连接的TCP服务器上,当服务器处理完请求后立刻主动正常关闭连接。这个场景下会出现大量socket处于TIME_WAIT状态。
如果客户端的并发量持续很高,此时部分客户端就会显示连接不上。主动正常关闭TCP连接,都会出现TIMEWAIT。
为什么要关注这个高并发短连接呢?有两个方面需要注意:
1. 高并发可以让服务器在短时间范围内同时占用大量端口,而端口有个0~65535的范围,并不是很多,刨除系统和其他服务要用的,剩下的就更少了。
2. 在这个场景中,短连接表示业务处理+传输数据的时间 远远小于 TIMEWAIT超时的时间的连接。
这里有个相对长短的概念,比如取一个web页面,1秒钟的http短连接处理完业务,在关闭连接之后,这个业务用过的端口会停留在TIMEWAIT状态几分钟,而这几分钟,其他HTTP请求来临的时候是无法占用此端口的(占着茅坑不拉翔)。单用这个业务计算服务器的利用率会发现,服务器干正经事的时间和端口(资源)被挂着无法被使用的时间的比例是 1:几百,服务器资源严重浪费。(说个题外话,从这个意义出发来考虑服务器性能调优的话,长连接业务的服务就不需要考虑TIMEWAIT状态。同时,假如你对服务器业务场景非常熟悉,你会发现,在实际业务场景中,一般长连接对应的业务的并发量并不会很高。
#该指令出现在1.1.4版中
Syntax: keepalive connection;
Default: -
Context: upstream
#该指令出现在1.15.3版中
Syntax: keepalive_requests number;
Default: keepalive_requests 10000; #一次连接后可以请求1万次,超过1W次就断开,一般不用
Context: upstream
#该指令出现在1.15.3版中
Syntax: keepalive_timeout timeout;
Default: keepalive_timeout 60s; #一次连接后没有请求动作,保持60秒后才断开,一般也不用
Context: upstream
# 7层负载均衡
upstream http_backend {
server 172.16.1.31:8080;
server 172.16.1.32:8080;
keepalive 16; #被代理的31、32web服务器优先使用16条长连接,不够用的时候再使用其他连接
} #长链接过程中可以无限请求
server {
...
location /http/ {
proxy_pass http://http_backend;
proxy_http_version 1.1; #对于http协议应该指定为1.1
proxy_set_header Connection ""; #清除请求头的“connection”头字段信息,变为‘keep-alive’,1.14版本以后不用设置
proxy_next_upstream error timeout http_500 http_502 http_503 http_504; #31访问失败后平滑过渡到32,不会报错
proxy_set_header Host $http_host; #传递请求的域名给后端服务器
#proxy_set_header X-Real-IP $remote_addr; #传递上一层IP给后方
proxy_set_header X-Forwared-For $proxy_add_x_forwarded_for; #传递用户IP给后方,一般都用这个
proxy_connect_timeout 30s; # 代理连接web超时时间
proxy_read_timeout 60s; # 代理等待web响应超时时间
proxy_send_timeout 60s; # web回传数据至代理超时时间
proxy_buffering on; # 开启代理缓冲区,web回传数据至缓冲区,代理边收边传返回给客户端
proxy_buffer_size 32k; # 代理接收web响应的头信息的缓冲区大小
proxy_buffers 4 128k; # 缓冲代理接收单个长连接内包含的web响应的数量和大小
...
}
}
#代理PHP
#本机【web服务器】IP 172.16.1.31,41、42是PHP服务器
#假设用户访问的是 ab.linux.com/fastcgi/1/2/3/1.php
upstream fastcgi_backend {
server 172.16.1.41:9000;
server 172.16.1.42:9000;
keepalive 8;
}
server {
...
location /fastcgi/ {
#用户访问URI为/fastcgi/时,就跳转到 41、42 的PHP上
fastcgi_pass fastcgi_backend;
# 标准格式 站点目录/code/ab 1/2/3/1.php
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#开启长链接
fastcgi_keep_conn on;
#连接超时时间为60秒
fastcgi_connect_timeout 60s;
#包含的文件
include fastcgi_params;
...
}
}
# 注意:scgi和uwsgi协议没有保持连接的概念。2.但无论是proxy、fastcgi、uwsgi协议都有cache缓存的功能,开启后可加速网站访问的效率。(取决硬件)
静态资源优化
环境准备
主机名称 | 应用环境 | 外网地址 | 内网地址 |
---|---|---|---|
backup | rsync服务端 | 10.0.0.11 | 172.16.1.11 |
nfs | rsync客户端+inotify-tools=Sersync+nfs | 10.0.0.31 | 172.16.1.21 |
web01 | nginx+php | 10.0.0.31 | 172.16.1.31 |
web02 | nginx+php | 10.0.0.32 | 172.16.1.32 |
db01 | mysql | 10.0.0.51 | 172.16.1.51 |
静态资源介绍
静态资源指的是非WEB服务器端运行处理而生成的文件
静态资源类型 | 种类 |
---|---|
浏览器渲染 | HTML、CSS、JS |
图片文件 | JPEG、GIF、PNG |
视频文件 | FLV、Mp4、AVI |
其他文件 | TXT、DOC、PDF、… |
静态资源缓存
介绍
#浏览器访问过程
0、# 判断有没有缓存,没有缓存直接想web服务器请求数据,有缓存再进行下面的判断
1、# 浏览器请求服务器,首先会验证 Expires、Cache-Control 检查缓存是否过期,没有过期则直接从缓存文件中读取
Expires: Sun, 11 Jul 2021 10:54:06 GMT # 本地缓存目录中,文件过期的时间(由服务器指定具体的时间)
cache-control: max-age=31536000 #本地缓存目录中,文件过期的时间(由服务器指定过期的间隔时间,由于浏览器根据间隔生成具体的时间)
2、# 如果缓存过期检查是否存在Etag,存在Etag浏览器会向web服务器请求对比If-None-Match与Etag的值,由服务器决策返回200还是304
ETag: "5d8444bf-3790" # 响应头中的:文件标识【服务器返回的】
If-None-Match: "5d8444bf-3790" # 请求头中的:文件标识【请求后服务器放在浏览器上的值】
3、# 如果Etag不存在,浏览器向web服务器请求if-Modified-Since的值与Last-Modified的值进行对比,由服务器决策返回200还是304
Last-Modified: Fri, 20 Sep 2019 03:17:19 GMT # 响应头中的:服务器上文件的最后修改时间
If-Modified-Since: Fri, 20 Sep 2019 03:17:19 GMT # 请求头中的:服务器上文件的最后修改时间
示例
#语法
#作用:添加Cache-Control Expires头
Syntax: expires [modified] time;
epoch | max | off;
Default: expires off;
Context: http, server, location, if in location
server {
listen 80;
server_name static.drz.com;
location ~ .*\.(jpg|gif|png)$ {
expires 7d;
}
location ~ .*\.(js|css)$ {
expires 30d;
}
}
#开发过程中不想读取缓存,取消js、css、html等静态文件缓存
location ~ .*\.(js|css|html)$ {
add_header Cache-Control no-store;
add_header Pragma no-cache;
#在响应头增加一行内容为 Server: nginx/1.11.1
add_header Server nginx/1.11.1;
}
静态资源读取
介绍
# 静态资源高效读取 on 开启 | off 关闭
Syntax: sendfile on | off;
Default: sendfile off;
Context: http, server, location, if in location
# 将多个包一次发送,用于提升网络传输效率,大文件推荐打开,需要开启sendfile才行
Syntax: tcp_nopush on | off;
Default: tcp_nopush off;
Context: http, server, location
# 提高网络传输实时性,需要开启keepalive,来一个包发一个包不等待
Syntax: tcp_nodelay on | off;
Default: tcpnodelay off;
Context: http, server, location
示例
#组合使用
sendfile on;
tcp_nopush on;
#组合使用
keepalive_timeout 65;
tcp_nodelay on;
#tcp_nopush 和 tcp_nodelay 不能同时开启,但是1.20.1版本yum安装的配置文件中同时存在了,实际生产没同时用过。
#网上找到一个解说:
只能说看似矛盾,同时打开sendfile,tcp_nopush与tcp_nodelay时,针对资源发送nginx会参考如下:
1、确保数据包在发送给客户之前是已满的
2、对于最后一个数据包,tcp_nopush将被删除,允许TCP立即发送,没有延迟
静态资源压缩
介绍
#gzip传输压缩,传输前压缩,传输后解压,一般对文档压缩效果较好,图片压缩效果一般般
Syntax: gzip on | off;
Default: gzip off;
Context: http, server, location, if in location
#gzip压缩哪些文件
Syntax: gzip_types mime-type ...;
Default: gzip_types text/html;
Context: http, server, location
#gzip压缩比率,加快传输,但压缩本身比较耗费服务器性能
Syntax: gzip_comp_level level;
Default:gzip_comp_level 1;
Context: http, server, location
#gzip压缩协议版本,压缩使用在http哪个协议,主流选择1.1版本
Syntax: gzip_http_version 1.0 | 1.1;
Default:gzip_http_version 1.1;
Context: http, server, location
示例
[root@web01 code]# vim /etc/nginx/conf.d/ab.linux.com.conf
upstream daili {
server 10.0.0.7:8080;
keepalive 16;
}
server {
listen 80;
server_name ab.linux.com;
root /code;
index index.html;
location / {
proxy_pass http://daili;
proxy_http_version 1.1;
}
location ~ \.(jpg|png|gif|txt)$ {
gzip on;
gzip_types image/jpeg image/gif image/png text/plain;
gzip_comp_level 9;
gzip_http_version 1.1;
}
}
防止资源盗链
1.测试盗链页面
[root@web01 code]# vim /etc/nginx/conf.d/ab.linux.com.conf
server {
listen 80;
server_name ab.linux.com;
root /code;
index index.html;
location ~ \.(jpg|png|gif|txt)$ {
gzip on;
gzip_types image/jpeg image/gif image/png text/plain;
gzip_comp_level 9;
gzip_http_version 1.1;
}
}
2.防盗链配置
#语法
Syntax: valid_referers none | blocked | server_name | string ...;
Default: -;
Context: server, location
#none: referer来源头部为空的情况 配置 none 则可以访问 来源头部为空
(日志格式为:10.0.0.7 - - [02/Jan/2020:15:26:08 +0800] "HEAD /2.jpg HTTP/1.1" 200 0 "-" "curl/7.29.0" "-" "-")
#blocked: referer来源头部不为空,这些都不以http://或者https://开头 配置该值则可以访问 来源头部不为空
(日志格式为:10.0.0.7 - - [02/Jan/2020:15:27:48 +0800] "HEAD /2.jpg HTTP/1.1" 403 0 "www.baidu.com" "curl/7.29.0" "-" "-")
#server_name: 来源头部信息包含当前域名,可以正则匹配 配置该值则可以访问
(日志格式为:10.0.0.7 - - [02/Jan/2020:15:31:42 +0800] "HEAD /2.jpg HTTP/1.1" 200 0 "http://static.linux.com" "curl/7.29.0" "-" "-")
#防盗链示例1【来源头部 空、不为空、域名符合*.linux.com 才可以访问】
location ~ .*\.(jpg|png|gif) {
root /code/pic;
valid_referers none blocked server_name *.linux.com;
if ( $invalid_referer ) {
return 403;
}
}
#防盗链示例2【域名符合*.linux.com 才可以访问】
location ~ .*\.(jpg|png|gif) {
root /code;
valid_referers server_name *.linux.com ~\.linux\.;
if ( $invalid_referer ) {
rewrite ^(.*)$ /pic/fangdao.jpg break;
}
}
#允许某些网站【谷歌、百度】盗链
location ~ .*\.(jpg|png|gif) {
root /data;
valid_referers none blocked *.linux.com server_name ~\.google\. ~\.baidu\.;
if ( $invalid_referer ) {
return 403;
}
}
3.配置web02作为资源的网站
#配置nginx
[root@web02 conf.d]# vim static.conf
server {
listen 80;
server_name static.linux.com;
root /code;
location / {
index index.html;
}
}
#重启nginx
[root@web02 conf.d]# systemctl restart nginx
#上传几张图片
配置hosts访问测试
4.配置web01作为盗链的网站
#1.配置nginx
[root@web01 conf.d]# vim dl.conf
server {
server_name dl.linux.com;
listen 80;
root /code;
location / {
index index.html;
}
}
#2.配置盗链的页面
[root@web01 conf.d]# vim /code/index.html
<html>
<head>
<meta charset="utf-8">
<title>linux7.com</title>
</head>
<body style="background-color:pink;">
<center><img src="http://static.linux.com/2.jpg"/></center>
</body>
</html>
#3.配置服务器hosts文件和电脑的hosts文件
[root@web01 conf.d]# vim /etc/hosts
10.0.0.32 static.linux.com
5.访问页面测试
# Windows 解析
C:\Windows\System32\drivers\etc\hosts
10.0.0.31 static.linux.com
# 访问web页面查看
static.linux.com
6.演示
#当然这种防护并不能百分百保证资源不被盗链,因为我们可以通过命令来修改来源的refer信息
-e 模拟来源网址为 http://static.linux.com
-I 只显示请求URL的响应头信息
[root@web01 conf.d]# curl -e "http://static.linux.com" -I http://static.linux.com/2.jpg
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Thu, 02 Jan 2020 07:31:42 GMT
Content-Type: image/jpeg
Content-Length: 12517
Last-Modified: Wed, 18 Dec 2019 01:41:33 GMT
Connection: keep-alive
ETag: "5df983cd-30e5"
Accept-Ranges: bytes
允许跨域访问
#一般使用在
1.服务器迁移
2.域名更改
1.配置被跨域的网站
#配置nginx
[root@web02 ~]# vim /etc/nginx/conf.d/beikuayu.conf
server {
listen 80;
server_name beikuayu.linux.com;
root /code;
location / {
index index.html;
}
}
#配置网站页面文件
[root@web02 ~]# echo 'test' > /code/index.html
2.配置跨域的网站
#配置nginx
[root@web01 ~]# vim /etc/nginx/conf.d/kuayu.conf
server {
listen 80;
server_name kuayu.linux.com;
location / {
root /code;
}
}
#配置跨域站点
[root@web01 ~]# vim /code/kuayu.html
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>测试ajax和跨域访问</title>
<script src="http://libs.baidu.com/jquery/2.1.4/jquery.min.js"></script>
</head>
<script type="text/javascript">
$(document).ready(function(){
$.ajax({
type: "GET",
url: "http://beikuayu.linux.com",
success: function(data) {
alert("sucess 卧槽 卧槽 卧槽 成功了!!!");
},
error: function() {
alert("fail!!,跨不过去啊,不让进去啊,只能蹭蹭!");
}
});
});
</script>
<body>
<h1>测试跨域访问</h1>
</body>
</html>
3.访问测试失败
# 访问测试失败
http://kuayu.linux.com/kuayu.html
# Windows 解析
C:\Windows\System32\drivers\etc\hosts
10.0.0.32 beikuayu.linux.com
10.0.0.31 kuayu.linux.com
# 访问web页面查看
kuayu.linux.com
4.配置允许跨域访问
[root@web02 ~]# vim /etc/nginx/conf.d/beikuayu.conf
server {
listen 80;
server_name beikuayu.linux.com;
root /code;
location / {
index index.html;
}
location ~ .*\.(html|htm)$ {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
}
}
CPU亲和
CPU亲和(affinity)减少进程之间不断频繁切换,减少性能损耗,其实现原理是建CPU核心和Nginx工作进程绑定方式,把每个worker进程固定到对应的cpu上执行,减少切换CPU的cache miss,获得更好的性能。
1.查看cpu
[root@tomcat01 ~]# lscpu | grep "CPU(s)"
CPU(s): 8
On-line CPU(s) list: 0-7
NUMA node0 CPU(s): 0-7
#以上服务器有一颗物理CPU,上面有8个核心
2.配置方法
# 第一种绑定组合方式(不推荐)
worker_processes 12;
worker_cpu_affinity 000000000001 000000000010 000000000100 000000001000 000000010000 000000100000 000001000000 000010000000 000100000000 001000000000 010000000000 10000000000;
# 第二种方式(使用较少)
worker_processes 2;
worker_cpu_affinity 101010101010 010101010101;
# 第三种最佳绑定方式,修改nginx启动的work进程为自动。
worker_processes auto;
worker_cpu_affinity auto;
3.查看绑定cpu
[root@web01 ~]# ps -eo pid,args,psr|grep [n]ginx
1242 nginx: master process /usr/ 2
1243 nginx: worker process 0
1244 nginx: worker process 1
1245 nginx: worker process 2
1246 nginx: worker process 3
通用优化配置
网上 高并发优化参考 https://www.cnblogs.com/aaron-agu/p/12317211.html
#设置一个不用登陆的统一用户
groupadd -g 666 www
useradd -u 666 -g 666 -Ms /sbin/nologin www
#创建一个目录,并给他授权
mkdir /web
chown -R www.www /web
1、#设置主配置文件
[root@web01 ~]# vim /etc/nginx/nginx.conf
#------------------------------核心模块--------------------------------
#用户原来是nginx,替换为前面设置的用户和用户组
user www www;
worker_processes auto; #启动的worker数量与cpu核心数一致即可,或者 auto
worker_cpu_affinity auto; #cpu亲和,多核时使用
#日志级别有: debug/info/notice/warn/error/crit/alter/emerg
#每个级别含义 调试 | 信息 | 通知 |警告| 错误| 临界| 改变| 紧急状态
#设置日志级别为warn【表示会记录warn/error/crit/alter/emerg】
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
#每个worker能打开的文件描述符,调整至1w以上,负荷较高建议2-3w
worker_rlimit_nofile 35535;
#------------------------------事件驱动模块-----------------------------
#表示核心模块中的每一个worker_processes 1;同一时间可以进行1024次连接
events {
use epoll; #使用epoll高效网络模型【如果不写默认就是这个】
worker_connections 1024; #限制每个进程能处理多少个连接
}
#-----------------------------http内核模块-----------------------------
http {
#包含在mime.types文件内的类型都会显示在网页中
include /etc/nginx/mime.types;
#默认不包含在mime.types文件内的类型都会进行下载
default_type application/octet-stream;
charset 'utf-8,gbk'; #统一使用utf-8和gbk字符集
#日志格式内容设置 main
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#日志格式内容设置 json_access
log_format json_access '{"@timestamp":"$time_iso8601",'
'"host":"$server_addr",'
'"clientip":"$remote_addr",'
'"size":$body_bytes_sent,'
'"responsetime":$request_time,'
'"upstreamtime":"$upstream_response_time",'
'"upstreamhost":"$upstream_addr",'
'"http_host":"$host",'
'"url":"$uri",'
'"domain":"$host",'
'"xff":"$http_x_forwarded_for",'
'"referer":"$http_referer",'
'"status":"$status"}';
#日志设置路径及包含内容为 main 中的内容
access_log /var/log/nginx/access.log main;
server_tokens off; #禁止浏览器显示nginx版本号
client_max_body_size 200m; #文件上传大小限制调整
#优化部分【分别在动静分离的web服务器上设置,2种设置要分开】
#文件高效传输,静态资源服务器建议打开
sendfile on;
tcp_nopush on; #【网页内容都拿到了,再一次性推送给用户】
#文件实时传输,动态资源服务建议打开,需要打开keepalive【查看多少就传送多少数据】
tcp_nodelay on;
#保持长连接的时间65秒限制【建议使用】
keepalive_timeout 65;
#网页的内容是否进行压缩【图片压缩不明显,文字压缩效果才明显】
gzip on;
#gzip_disable "MSIE [1-6]\."; #针对IE浏览器1-6版本,不进行压缩,一般不用
gzip_http_version 1.1; #gzip通过http1.1协议传输
gzip_comp_level 5; #压缩级别
gzip_buffers 16 8k; #压缩的缓冲区
gzip_min_length 1024; #文件大于1024字节才进行压缩,默认值20
#压缩的文件类型
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript image/jpeg;
#虚拟主机,包含每个网站的配置文件路径
#/etc/nginx/conf.d/目录下的文件内容如果有冲突就会以文件名排名靠前的文件为准
include /etc/nginx/conf.d/*.conf;
}
2、设置server层配置文件【路径就是上方主配置文件中的,文件名只要以.conf结尾就可以】
#删除默认的server层配置文件
rm -f /etc/nginx/conf.d/default.conf
#根据需要编辑一个新的server层配置文件
vim /etc/nginx/conf.d/web.conf
#使用Server配置网站, 每个Server{}代表一个网站(简称虚拟主机)
#一个文件中可以有多个server {} ,建议还是每个网站设置一个server {}
server {
#监听端口, 默认80
listen 80;
#提供给用户访问的域名
server_name www.web01.com;
#日志保存路径和保存内容【调用主配置main里面的设置】
access_log /var/log/nginx/www.web01.com.log main;
#支持的字符集,有时候不起作用,就需要在utf-8外面加上 ' ' 如下:
charset 'utf-8,gbk';
#控制网站访问路径
location / {
#存放网站源代码的目录位置
root /code/html;
#默认返回网站的文件
index index.html index.htm index.php;
}
#包含每个网站内的页面的文件【一般不用】
#include /etc/nginx/location.d/*.conf
#上传文件大小限制
client_max_body_size 200m;
#出现错误的时候根据返回值跳转到不同的页面
error_page 404 /404.html;
location = /404.html {
root /usr/share/nginx/html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ \.php$ {
root /web/php;
#关联的php软件的地址和端口
fastcgi_pass 127.0.0.1:9000;
#关联的页面
fastcgi_index index.php;
#关联的站点目录和PHP文件名
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#包含的fastcgi模块的一些内容
include fastcgi_params;
}
}
# fastcgi_params 一般用在动态资源web服务器
# Nginx 的 fastcgi 模块提供了 fastcgi_param 指令来主要处理这些映射关系,下面 Nginx 的一个配置文件,其主要完成的工作是将 Nginx 中的变量翻译成 PHP 中能够理解的变量。
cat /etc/nginx/fastcgi_params
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# 脚本文件请求的路径,也就是说当访问127.0.0.1/index.php的时候,需要读取网站根目录下面的index.php文件,如果没有配置这一配置项时,nginx不回去网站根目录下访问.php文件,所以返回空白
fastcgi_param QUERY_STRING $query_string; #请求的参数;如?app=123
fastcgi_param REQUEST_METHOD $request_method; #请求的动作(GET,POST)
fastcgi_param CONTENT_TYPE $content_type; #请求头中的Content-Type字段
fastcgi_param CONTENT_LENGTH $content_length; #请求头中的Content-length字段。
fastcgi_param SCRIPT_NAME $fastcgi_script_name; #脚本名称
fastcgi_param REQUEST_URI $request_uri; #请求的地址不带参数
fastcgi_param DOCUMENT_URI $document_uri; #与$uri相同。
fastcgi_param DOCUMENT_ROOT $document_root; #网站的根目录。在server配置中root指令中指定的值
fastcgi_param SERVER_PROTOCOL $server_protocol; #请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
fastcgi_param REQUEST_SCHEME $scheme; #页面跳转?
fastcgi_param HTTPS $https if_not_empty; #如果变量非空?
fastcgi_param GATEWAY_INTERFACE CGI/1.1; #cgi 版本
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; #nginx 版本号,可修改、隐藏
fastcgi_param REMOTE_ADDR $remote_addr; #客户端IP
fastcgi_param REMOTE_PORT $remote_port; #客户端端口
fastcgi_param SERVER_ADDR $server_addr; #服务器IP地址
fastcgi_param SERVER_PORT $server_port; #服务器端口
fastcgi_param SERVER_NAME $server_name; #服务器名,域名在server配置中指定的server_name
fastcgi_param PATH_INFO $path_info; #可自定义变量
-- PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
# proxy_params 一般用在负载均衡服务器
vim /etc/nginx/proxy_params
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 60s;
proxy_read_timeout 60s;
proxy_send_timeout 60s;
proxy_buffering on;
proxy_buffer_size 8k;
proxy_buffers 8 8k;
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
#注释
proxy_set_header Host $http_host; #带着客户访问的域名去访问后方服务器
proxy_http_version 1.1; #使用http1.1版本协议去访问web服务器
#带着客户的IP告诉后方web服务器来访用户的IP是什么【多次跳转会累加】
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#带着前端的ip告诉后方【多次跳转会覆盖,建议只配在第一层负载均衡服务器上】
#proxy_set_header X-Real-IP $remote_addr;
proxy_connect_timeout 60s; #用户连接负载均衡超时时间
proxy_read_timeout 60s; #负载均衡连接后端服务器的超时时间
proxy_send_timeout 60s; #后端服务器返回上级服务器超时时间
proxy_buffering on; #是否开启缓冲区
#设置读取从代理服务器接收的响应的第一部分的缓冲区的大小,这部分通常包含一个小的响应头,默认情况下,缓冲区大小等于一个内存页。这是4K还是8K,取决于平台。然而,它可以做得更小。
proxy_buffer_size 8k;
proxy_buffers 8 8k; #设置缓冲区的数量和大小
#访问负载均衡后方主机如果出现错误就跳转另一台
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
安全与优化总结
1、CPU亲和、worker进程数、调整每个worker进程打开的文件数
2、使用epoll网络模型、调整每个worker进程的最大连接数
3、文件的高效读取sendfile、nopush
4、文件的传输实时性、nodealy
5、开启tcp长连接,以及长连接超时时间keepalived
6、开启文件传输压缩gzip
7、开启静态文件expires缓存
8、隐藏nginx版本号
9、禁止通过ip地址访问,禁止恶意域名解析,只允许域名访问
10、配置防盗链、以及跨域访问
11、防DDOS、cc攻击,限制单IP并发连接,以及http请求
12、优雅显示nginx错误页面
13、nginx加密传输https优化
14、nginx proxy_cache、fastcgi_cache、uwsgi_cache 缓存,第三方工具(squid、varnish)
优化总结
1.硬件
nginx作为代理服务器,需要提高他的内存和cpu
nginx作为静态文件服务器,需要配置很大的磁盘
2.网络
带宽给的大一些
丢包处理
3.系统
打开文件句柄数
长链接time_wait端口重用【一定要做】
4.应用
nginx作为代理,配置长链接
5.服务
nginx作为静态网站:静态缓存、静态资源读取、静态资源压缩、防盗链、跨域访问、cpu亲和
Nginx 应用场景
静态服务 代理服务 安全服务 流行架构
浏览器缓存 协议类型 访问控制 Nginx+PHP(fastcgi_pass)LNMP
防资源盗用 正向代理 访问限制 Nginx+java(proxy_pass)LNMT
资源分类 反向代理 流量限制 Nginx+Python(uwsgi_pass)
资源压缩 负载均衡 拦截攻击
资源缓存 代理缓存 拦截异常请求
跨域访问 动静分离 拦截SQL注入
更多推荐
已为社区贡献1条内容
所有评论(0)