第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

存放用户的信息

  1. cookie存放在用户浏览器中
  2. cookie存放的是用户的普通信息
  3. cookie是第一次访问网站的时候,网站在响应过程中给客户添加进去的

session

键值对的方式出现

  1. session存放在服务端
  2. session存放的是用户的机密信息
  3. session存放在服务端的文件上,数据库,redis中都是可以的
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的核心数
  1. 使用命令lscpu来查看

  1. 使用文件信息/proc/cpuinfo

  1. 使用命令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服务优化大全的更多相关文章

  1. 【实战分享】又拍云 OpenResty / Nginx 服务优化实践

    2018 年 11 月 17 日,由 OpenResty 主办的 OpenResty Con 2018 在杭州举行.本次 OpenResty Con 的主题涉及 OpenResty 的新开源特性.业界 ...

  2. Nginx服务优化详解

    Nginx服务优化详解 1.隐藏Nginx版本信息 编辑主配置文件nginx.conf,在http标签中添加代码 server_tokens off;来隐藏软件版本号. 2.更改Nginx服务启动的默 ...

  3. 企业级Web Nginx 服务优化

    企业级Web Nginx 服务优化 http://blog.51cto.com/search/result?q=%E4%BC%81%E4%B8%9A%E7%BA%A7Web+Nginx+%E6%9C% ...

  4. Nginx服务优化及优化深入(配置网页缓存时间、日志切割、防盗链等等)

    原文:https://blog.51cto.com/11134648/2134389 默认的Nginx安装参数只能提供最基本的服务,还需要调整如网页缓存时间.连接超时.网页压缩等相应参数,才能发挥出服 ...

  5. Nginx服务优化

    1.1Nginx.conf配置文件基本参数优化 1.1.1  隐藏nginx header内版本号信息 一些特定的系统及服务漏洞一般都和特定的软件及版本号有关,我们应尽量隐藏服务器的敏感信息(软件名称 ...

  6. 企业级web nginx服务优化

    1.1)隐藏nginx header 内版本号信息 [root@aliyun ~]# vi /application/nginx/conf/nginx.conf http{ …… server_tok ...

  7. Nginx服务优化配置

    1.expires缓存模块 具体配置可参考官方文档 http://nginx.org/en/docs/http/ngx_http_headers_module.html#expires [root@c ...

  8. Nginx web服务优化 (一)

    1.Nginx基本安全优化 a.更改配置文件参数隐藏版本 编辑nginx.conf配置文件增加参数,实现隐藏Nginx版本号的方式如下.在nginx配置文件nginx.conf中的http标签段内加入 ...

  9. nginx web服务优化

    nginx基本安全优化 1. 调整参数隐藏nginx软件版本号信息 软件的漏洞和版本有关,我们应尽量隐藏或消除web服务对访问用户显示各类敏感信息(例如web软件名称及版本号等信息),这样恶意的用户就 ...

随机推荐

  1. vulhub漏洞环境搭建

    (搭建之前建议更换成阿里的源) 在纯净ubuntu中部署vulhub环境: 1.安装docker,并用docker -v命令验证安装结果: curl -s https://get.docker.com ...

  2. hutool包里的ObjectUtil.isNull和ObjectUtil.isEmpty的区别

    大家都用过hutool包把,包路径为:cn.hutool.core.util,最近再使用的过程中一直没高明白ObjectUtil.isEmpty和ObjectUtil.isNull两者到底有那些区别, ...

  3. java反射笔记(学习尚硅谷java基础教程)

    反射一.概述:Reflection Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性 ...

  4. 半吊子菜鸟学Web开发 -- PHP学习2-正则,cookie和session

    1正则表达式 1.1基本的匹配字符串 $p = '/apple/'; $str = "apple banna"; if (preg_match($p, $str)) { echo ...

  5. java代码常用知识点

    1.Assert java断言assert是jdk1.4引入的.assert这个关键字我们称之为"断言".当这个关键字后边的条件为假的时候,程序自动崩溃并抛出AssertionEr ...

  6. 什么是springcloud?springcloud断路器的作用是什么?springcloud的核心组件有什么?

    一.什么是springcloud 1.springcloud概述 Spring Cloud是一个微服务框架,相比Dubbo等RPC框架, Spring Cloud提供的全套的分布式系统解决方案. Sp ...

  7. Elasticsearch 在部署时,对 Linux 的设置有哪些优化方法 ?

    1.关闭缓存 swap; 2.堆内存设置为:Min(节点内存/2, 32GB); 3.设置最大文件句柄数: 4.线程池+队列大小根据业务需要做调整: 5.磁盘存储 raid 方式--存储有条件使用 R ...

  8. synchronized的原理

    synchronized的使用 synchronized是一个java中的关键字,是基于JVM层面的,用于保证java的多线程安全,它具有四大特性,可用于完全替代volatile: 原子性:所谓原子性 ...

  9. 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 ...

  10. Netty学习摘记 —— ByteBuf详解

    本文参考 本篇文章是对<Netty In Action>一书第五章"ByteBuf"的学习摘记,主要内容为JDK 的ByteBuffer替代品ByteBuf的优越性 你 ...