nginx服务优化大全
第18章 nginx服务优化
18.1 复习以前的nginx知识
18.1.1 复习nginx编译安装的3部曲
- ./configure 配置(开启/关闭功能),指定安装目录
- make 软件编译,将源代码编译成二进制文件
- make install 将一些目录进行复制,修改,文件进行修改,查看的操作
18.1.2 编译安装常用的nginx命令
- nginx -t 语法检查
- nginx -s reload nginx重新加载
- nginx 启动nginx
- pkill nginx/nginx -s stop 关闭nginx
18.1.3 nginx的基础配置
[root@web02 ~] # vim /application/nginx/conf/nginx.conf
worker_processes 1; main区域
events { even区域
worker_connections 1024;
}
http { http7层区域
include 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"'
'"$request_uri" "$args" "$url"';
access_log logs/access.log main;
sendfile on;
keepalive_timeout 65;
expires max;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
#gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php;
server { server区域
listen 80;
server_name localhost;
set $url $scheme://$host$request_uri;
location / { location区域
root /application/nginx/html;
index index.html index.htm;
}
#if ($http_user_agent ~* "android|ios|iphone") { if区域
# return 200 "OK \n";
#}
18.1.4 nginx的日志格式和内置变量
$remote_addr 客户端IP地址
$time_local 客户访问网站的时间
$request 请求报文请求行的内容
$status 响应报文的状态码信息
$body_bytes_sent 文件的大小(访问文件所需的流量信息)
$http_referer 用户请求的内容是从哪访问过来的
$http_user_agent 用户访问服务端所使用的的设备信息
$http_x_forwarded_for 前端负载均衡,后端的web服务器想知道真实的客户端地址
$http_uri 用户请求uri的部分
$args 用户请求中的参数 uri中?后面的内容
$scheme http或https
$host 用户请求的域名
18.1.4.1 http_uri的使用
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'
'"$request_uri"'; 配置http_uri
access_log logs/access.log main;
[root@web02 ~] # curl -I 10.0.0.8/oldboy.jpg
HTTP/1.1 404 Not Found
Connection: keep-alive
18.1.4.2 "$args"的使用
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'
'"$request_uri" "$args" http或者https?后面的内容
[root@web02 ~] # curl -I "10.0.0.8/oldboy.jpg?name=liangyuxing && password=123456"
HTTP/1.1 404 Not Found
Connection: keep-alive
18.1.4.3 set创建变量的使用
18.1.4.3.1 set创建变量的语法
Syntax: set $variable value;
Default: —
Context: server, location, if
18.1.4.3.2 set开始配置(设置一个变量为url)
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'
'"$request_uri" "$args" "$url"';
server {
listen 80;
server_name localhost;
set $url $scheme://$host$request_uri; $url变量名 $scheme表示http或者https
[root@web02 ~] # curl -I "10.0.0.8/oldboy.jpg?name=liangyuxing"
HTTP/1.1 404 Not Found
Connection: keep-alive
18.1.5 nginx的location配置
匹配用户请求的uri信息
location / 默认匹配
location /doc 匹配/doc
location ~ /doc 模糊匹配doc
location ~*/doc 忽略大小写匹配doc,进行正则匹配
location = /doc 精确匹配doc
location ^~ 优先匹配,不识别正则
location / {
return 200 "default \n";
}
location ~* "\.(jpg|jpeg|bmp|gif|png)$" {
return 200 "pic \n";
}
18.1.5.1 不进行匹配
?!属于perl正则,可以(man perlretut) 来查看更多的perl语言规则
18.1.6 rewrite跳转(匹配的是uri部分)
- 老域名向新域名跳转
- 长域名向短域名跳转
- http向https跳转
[0-9] 字
[^0-9] 字以外符号
[ \t\n\r\f] \s 匹配空字符 空格 tab 回车
[0-9a-zA-Z_] \w 数字 大小写字母 下划线
18.1.6.1 rewrite的操作
18.1.6.1.1 访问http://127.0.0.1:8914/batch_no/11122asbc.jpeg连接实现跳转到
http://127.0.0.1:8914/email_open_check?batch_no=11122asbc, 这个咋实现?
rewrite ^/batch_no/([0-9a-zA-Z]+)\.jpeg http://10.0.0.8/email_open_check?batch_no=$1 redirect;
18.2 nginx新的知识讲解
18.2.1 nginx的if语句的讲解
18.2.1.1 if语法结构
if一般与nginx内置变量联合起来使用(可以做取反的操作)
Syntax: if (condition) { ... }
Default: —
Context: server, location
18.2.1.2 if的实践操作
18.2.1.2.1 查看访问服务端的软件是什么类型的
server {
listen 80;
server_name localhost;
set $url $scheme://$host$request_uri;
root /application/nginx/html;
index index.html index.htm;
if ($http_user_agent ~* "android|ios|iphone") { 如果是安卓或者ios或者iphone,就返
return 200 "OK \n"; 回200
}
[root@web02 ~] # curl -A iPhone 10.0.0.8
OK 结果是OK
[root@web02 ~] #
18.2.1.2.2 匹配除了jsp以外的其他uri信息
location ~* "\.(jpg|jpeg|bmp|gif|png)$" {
if ($request_uri ~* "png|gif") {
return 404 "OK \n";
}
}
18.2.1.3 企业面试题
18.2.1.3.1 用户访问网站,客户端ip是172.1.x.x 并且 用户客户端是oldboy 则返回200
思路:采用标记法来做,先设置一个标记(flag=0),如果设置的变量=网段,标记为(flag=01),如果设置的变量=客户端oldboy,标记为(flag=012),最后在判断标记是不是012,如果是,则成功
set $flag 0; 0
if ( $remote_addr ~ "^172\.1\."){
set $flag "${flag}1"; 01
}
if ($http_user_agent ~ "yucheng"){
set $flag "${flag}2"; 012
}
if ($flag = "012"){
return 200; 如果是变量是012,则返回200
}
18.2.2 nginx下的root和alias的讲解
root 指定用户的站点目录
alias 替换用户请求的uri
18.2.2.1 root讲解
location /oldboy {
root /app/alex;
}
curl -v http://www.oldboy.com/oldboy/lyx.html curl -v http://www.oldboy.com/app/alex/oldboy/lyx.html
18.2.2.2 alias讲解
location /oldboy {
alias /app/alex
}
curl -v http://www.oldboy.com/oldboy/lyx.html curl -v http://www.oldboy.com/app/alex/lyx.html
18.2.3 nginx优化
18.2.3.1 nginx安全优化
18.2.3.1.1 nginx版本信息隐藏
server_tokens off; http服务区域
10.2.3.1.2 修改nginx版本信息优化
- 修改nginx的源代码(/server/tools/nginx-1.16.1/src/core/nginx.h)
- 修改nginx源代码(/server/tools/nginx-1.16.1/src/http/ngx_http_header_filter_module.c)
- 修改nginx源代码(/server/tools/nginx-1.16.1/src/http/ngx_http_special_response.c)
在重新配置,编译与安装
10.2.3.1.3 修改nginx用户的进程用户信息
user www www; #main区域
10.2.3.1.4 优化nginx服务的上传限制
client_max_body_size 10M; 将上传图片限制为10M
10.2.3.1.5 nginx防盗链解决
盗链:别人把你图片或者其他资源的链接复制下来,写入到他们的网站访问代码里面,这样客户在访问这张图片或者资源的时候可以正常的访问,但是消耗的流量是自己的流量
- 如何防止盗链信息的发生
在自己的照片上面加上水印信息
根据$http_referter来判断,这个请求图片是不是通过大型网站跳转过来( if ( $http_referer !~* "baidu.com|google.com") {
return 403;
}
根据cookie防盗链(cookie存放在客户端的,你第一次访问网站,服务端会给你个cookie,下次再访问的时候,通过cookile来验证你是不是能匹配到服务端存放的session)
项目 |
共同点 |
区别 |
cookie |
存放用户的信息 |
|
session |
键值对的方式出现 |
|
10.2.3.1.6 nginx站点目录及权限的改变
网站 root root file 644 dir 755
上传 www www file 644 dir 755
10.2.3.1.7 nginx防爬虫优化
爬虫工具
- linux命令:curl,wget
- python:模拟客户使用浏览器访问网页的情况
- 搜索引擎的使用:百度,goole,搜索引擎搜索是为了让客户能更快的访问需要的资源
防止爬虫
- 君子协议,robots.txt协议,当前网站站点目录下存放的一个robots.txt协议
- 使用内置变量$http_user_agent
if ($http_user_agent ~* "sogou|spider|bot") {
return 403;
}
10.2.3.1.8 利用nginx限制请求访问
- 让用户 只能下载(GET) 不能上传(POST)
location /static {
if ($request_method ~* "POST" ) {
return 403;
}
}
10.2.3.1.9 使用普通用户启动nginx(监牢模式)
10.2.3.1.10 控制nginx的并发连接数
limit_conn_zone connection (连接数量)even区域
利用limit_conn_zone参数和$binary_remote_addr变量限制nginx单IP地址并发连接数
利用limit_conn_zone参数和$server_name r变量限制nginx虚拟主机总连接数
10.2.3.1.11 控制nginx的并发请求速率
limit_conn_zone connection (连接速率)even区域
18.2.3.2 nginx性能优化
18.2.3.2.1 修改nginx的工作进程数量
nginx工作进程数量修改为本身的cpu核心数或者cpu核心数2倍
worker_processes 1; 在主区域上
- 如何查看cpu的核心数
- 使用命令lscpu来查看
- 使用文件信息/proc/cpuinfo
- 使用命令top +1
18.2.3.2.2 优化nginx服务的cpu亲和力(用户请求平均分配到每个核心上面)
worker_cpu_affinity 0101 1010; 2核心
worker_cpu_affinity 0001 0010 0100 1000; 4核心
worker_cpu_affinity 00000001 00000010 ………
worker_cpu_affinity auto 表示自动配置cpu的亲和力,工作场景一般使用这个
数据库可以使用taskset -c 1,2,3来指定不同的核心来处理事情
18.2.3.2.3 优化nginx处理事件的模型
nginx采用的是epoll模型(异步)
apache采用的是select模型(同步)
events {
use epoll;
}
18.2.3.2.4 优化nginx的单用户连接数
events {
use epoll;
worker_connections 10240; 配置为比默认值大
}
18.2.3.2.5 优化nginx的文件打开数
worker_rlimit_nofile 65535; main区域
扩展:linux下的文件打开数
- 临时打开 ulimit -n
- 查看全部信息 ulimit -a
- 临时修改 ulimit -n10240
- 永久修改 echo '* - nofile 65535 ' >>/etc/security/limits.conf
- 一个错误 文件打开数不够用造成的
18.2.3.2.6 优化nginx服务数据高效传输模式
参数语法 sendfile on | off; on为开启,off为关闭
放置位置 http,server,location,if in location
18.2.3.2.7 优化nginx服务超时信息
keepalive_timeout 65; http区域
18.2.3.2.8 优化nginx服务与FastCGI连接缓存与缓冲信息
18.2.3.2.9 配置nginx gzip压缩
注意:压缩之前的文件一定要大点,不要什么大小的文件都压缩,有时候压缩只会适得其反
gzip on; 开启压缩功能
gzip_min_length 1k; 适合压缩的文件最小为1K
gzip_buffers 4 16k; 设置压缩缓存
#gzip_http_version 1.0;
gzip_comp_level 2; 压缩级别,压缩数字越大,压缩率(占用空间)越小,cpu消耗越高
gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php; 哪些类型的文件进行压缩
18.2.3.2.10 配置Nginx expires实现让客户端缓存数据
location ~* \.(gif|jpg|jpeg|png|bmp|ico)$ {
root /var/www/img/;
expires 30d; 设置只要匹配上这些后缀的信息,在浏览器缓存30天
expires max; 设置只要匹配上这些后缀的信息,在浏览器缓存100年
}
18.2.4 proxy_cache的讲解
proxy_cache_path /soft/cache levels=1:2 keys_zone=code_cache:10m
max_size=10g inactive=60m use_temp_path=off;
server {
listen 80;
server_name cache.oldboy.com;
#proxy_cache 开启缓存
#proxy_cache_valid 状态码200|304的过期为12h, 其余状态码10分钟过期
#proxy_cache_key 缓存key
#add_header 增加头信息, 观察客户端respoce是否命中 Nginx-Cache
"$upstream_cache_status"; 缓存命中情况的信息 .
#proxy_next_upstream 出现502-504或错误, 会跳过此台服务器访问下台
location / {
proxy_pass http://cache;
proxy_cache code_cache;
proxy_cache_valid 200 304 12h;
proxy_cache_valid any 10m;
add_header Nginx-Cache "$upstream_cache_status";
proxy_next_upstream error timeout invalid_header
http_500 http_502 http_503 http_504;
include proxy_params;
}
}
18.2.5 nginx的4层反向代理讲解
18.2.5.1 配置文件编写
stream { 配置在主区域
upstream ports {
server 10.0.0.7:9999;
server 10.0.0.51:6666;
}
server {
listen 8888;
proxy_pass ports;
}
18.2.5.2 客户端配置(拿10.0.0.51测试)
[root@db ~] # nc -lk 6666
18.2.5.3 正式测试结果
发现4层适合是nginx的负载均衡(反向代理)
nginx服务优化大全的更多相关文章
- 【实战分享】又拍云 OpenResty / Nginx 服务优化实践
2018 年 11 月 17 日,由 OpenResty 主办的 OpenResty Con 2018 在杭州举行.本次 OpenResty Con 的主题涉及 OpenResty 的新开源特性.业界 ...
- Nginx服务优化详解
Nginx服务优化详解 1.隐藏Nginx版本信息 编辑主配置文件nginx.conf,在http标签中添加代码 server_tokens off;来隐藏软件版本号. 2.更改Nginx服务启动的默 ...
- 企业级Web Nginx 服务优化
企业级Web Nginx 服务优化 http://blog.51cto.com/search/result?q=%E4%BC%81%E4%B8%9A%E7%BA%A7Web+Nginx+%E6%9C% ...
- Nginx服务优化及优化深入(配置网页缓存时间、日志切割、防盗链等等)
原文:https://blog.51cto.com/11134648/2134389 默认的Nginx安装参数只能提供最基本的服务,还需要调整如网页缓存时间.连接超时.网页压缩等相应参数,才能发挥出服 ...
- Nginx服务优化
1.1Nginx.conf配置文件基本参数优化 1.1.1 隐藏nginx header内版本号信息 一些特定的系统及服务漏洞一般都和特定的软件及版本号有关,我们应尽量隐藏服务器的敏感信息(软件名称 ...
- 企业级web nginx服务优化
1.1)隐藏nginx header 内版本号信息 [root@aliyun ~]# vi /application/nginx/conf/nginx.conf http{ …… server_tok ...
- Nginx服务优化配置
1.expires缓存模块 具体配置可参考官方文档 http://nginx.org/en/docs/http/ngx_http_headers_module.html#expires [root@c ...
- Nginx web服务优化 (一)
1.Nginx基本安全优化 a.更改配置文件参数隐藏版本 编辑nginx.conf配置文件增加参数,实现隐藏Nginx版本号的方式如下.在nginx配置文件nginx.conf中的http标签段内加入 ...
- nginx web服务优化
nginx基本安全优化 1. 调整参数隐藏nginx软件版本号信息 软件的漏洞和版本有关,我们应尽量隐藏或消除web服务对访问用户显示各类敏感信息(例如web软件名称及版本号等信息),这样恶意的用户就 ...
随机推荐
- vulhub漏洞环境搭建
(搭建之前建议更换成阿里的源) 在纯净ubuntu中部署vulhub环境: 1.安装docker,并用docker -v命令验证安装结果: curl -s https://get.docker.com ...
- hutool包里的ObjectUtil.isNull和ObjectUtil.isEmpty的区别
大家都用过hutool包把,包路径为:cn.hutool.core.util,最近再使用的过程中一直没高明白ObjectUtil.isEmpty和ObjectUtil.isNull两者到底有那些区别, ...
- java反射笔记(学习尚硅谷java基础教程)
反射一.概述:Reflection Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性 ...
- 半吊子菜鸟学Web开发 -- PHP学习2-正则,cookie和session
1正则表达式 1.1基本的匹配字符串 $p = '/apple/'; $str = "apple banna"; if (preg_match($p, $str)) { echo ...
- java代码常用知识点
1.Assert java断言assert是jdk1.4引入的.assert这个关键字我们称之为"断言".当这个关键字后边的条件为假的时候,程序自动崩溃并抛出AssertionEr ...
- 什么是springcloud?springcloud断路器的作用是什么?springcloud的核心组件有什么?
一.什么是springcloud 1.springcloud概述 Spring Cloud是一个微服务框架,相比Dubbo等RPC框架, Spring Cloud提供的全套的分布式系统解决方案. Sp ...
- Elasticsearch 在部署时,对 Linux 的设置有哪些优化方法 ?
1.关闭缓存 swap; 2.堆内存设置为:Min(节点内存/2, 32GB); 3.设置最大文件句柄数: 4.线程池+队列大小根据业务需要做调整: 5.磁盘存储 raid 方式--存储有条件使用 R ...
- synchronized的原理
synchronized的使用 synchronized是一个java中的关键字,是基于JVM层面的,用于保证java的多线程安全,它具有四大特性,可用于完全替代volatile: 原子性:所谓原子性 ...
- jsp:useBean报错The value for the useBean class attribute X is invalid
一.解决方法 1.先检查<jsp:useBean id="dog" class="cn.edu.dgut.el.tools.Dog" scope=&quo ...
- Netty学习摘记 —— ByteBuf详解
本文参考 本篇文章是对<Netty In Action>一书第五章"ByteBuf"的学习摘记,主要内容为JDK 的ByteBuffer替代品ByteBuf的优越性 你 ...