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的基础配置

[[email protected] ~] # 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;

?

[[email protected] ~] # 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?后面的内容

?

[[email protected] ~] # 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

?

[[email protected] ~] # 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

}

?

[[email protected] ~] # curl -A iPhone 10.0.0.8

OK ????????????????????????????????????结果是OK

[[email protected] ~] #

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测试)

[[email protected] ~] # nc -lk 6666

18.2.5.3 正式测试结果

发现4层适合是nginx的负载均衡(反向代理)

原文地址:https://www.cnblogs.com/liangyuxing/p/12079580.html

时间: 2024-10-13 00:37:32

nginx服务优化大全的相关文章

企业级Web Nginx 服务优化(1)

企业级Web Nginx 服务优化 总结配置文件: nginx.conf httpd.conf httpd-vhosts httpd-mpm.conf my.cnf php.ini php-fpm.conf 1.1nginx.conf 配置文件基本参数优化 1.1.1 隐藏nginx header 内版本号信息 一些特定的系统及服务漏洞一般都和热定的软件及版本号有关,我们应尽量隐藏服务器的敏感信息(软件名称及版本等信息),这样黑客无法猜到有漏洞的服务是否是对应服务的版本,从而确保web服务器最大

企业级Web Nginx 服务优化

企业级Web Nginx 服务优化 http://blog.51cto.com/search/result?q=%E4%BC%81%E4%B8%9A%E7%BA%A7Web+Nginx+%E6%9C%8D%E5%8A%A1%E4%BC%98%E5%8C%96%285%29 企业级nginx服务优化合集 企业级nginx服务优化(一) 企业级nginx服务优化(二 ) 企业级Web Nginx 服务优化(1) 企业级Web Nginx 服务优化(2) 企业级Web Nginx 服务优化(3) 企业

Nginx服务优化及优化深入

在企业信息化应用环境中,服务器的安全性和响应速度需要根据实际情况进行参数配置,以达到最优的用户体验.默认的Nginx安装参数只能提供最基本的服务,还需要调整如网页缓存时间.连接超时.网页压缩等相应参数,才能发挥出服务器的最大作用. Ngnix服务的安装详细介绍请参考 部署Nginx网站服务实现访问状态统计以及访问控制功能 Nginx服务优化 可以从隐藏版本号.更改用户与组.配置网页缓存时间.日志切割.设置连接超时这几个方面进行优化. 1.隐藏版本号 在生产环境中需要隐藏Nginx的版本号,以避免

Nginx服务优化之隐藏版本号、修改用户与组、配置页面缓存与时间、日志分割以及设置连接超时

Nginx服务优化之隐藏版本号.修改用户与组.配置页面缓存与时间.日志分割以及设置连接超时 前言 ? 在企业信息化应用环境中,服务器的安全性和响应速度需要根据实际情况进行相应参数配置,以达到最优的用户体验. ? 默认的nginx安装参数只能提供最基本的服务,还需要调整如网页缓存时间.连接超时.网页压缩等相应参数,才能发挥出服务器的最大作用. 一.隐藏版本号 ? 我们为什么要隐藏版本号? ? 我们一定要有一个意识:对于软件或者说服务,其安全性必然不可能是无懈可击的,总会或多或少地存在各种bug或者

Nginx服务优化

1.1Nginx.conf配置文件基本参数优化 1.1.1  隐藏nginx header内版本号信息 一些特定的系统及服务漏洞一般都和特定的软件及版本号有关,我们应尽量隐藏服务器的敏感信息(软件名称及版本等信息)这样黑客无法猜到有漏洞的服务是否是对应服务的版本,从而确保web服务器最大的安全. 彻底修改nginx错误返回页面,在编译安装之前修改nginx.h文件 sed -n '13,17p' src/core/nginx.h #define NGINX_VERSION      "1.6.3

Nginx服务优化——性能与安全

1.隐藏Nginx的版本 一般来说,软件的漏洞都和版本有关的.为了减少被人针对某一版本的恶意攻击,我们可以把我们的Nginx版本隐藏起来,提高被攻击的门槛.在隐藏版本号之前,我们可以通过curl获取到软件版本. 隐藏Nginx的版本号可以通过修改nginx.conf配置文件,在http段标签内添加 "server_tokens off"的参数 修改之后检查语法问题,没有的话重载配置文件 /usr/local/nginx/sbin/nginx -t /usr/local/nginx/sb

Nginx服务优化(七)网页压缩与防盗链

配置Nginx实现网页压缩功能 Nginx的ngx_http_gzip_module压缩模块提供对文件内容压缩的功能,允许Nginx服务器将输出内容在发送客户端之前进行压缩,以节约网站带宽,提升用户的访问体验,默认已经安装.可在配置文件中加入相应的压缩功能参数对压缩性能进行优化. 压缩功能参数讲解 gzip on:开启gzip压缩输出 gzip_min_length 1k:用于设置允许压缩的页面最小字节数 gzip_buffers 4 16k:表示申请4个单位为16k的内存作为压缩结果流缓存,默

Nginx服务优化(三)配置网页缓存时间

配置Nginx网页缓存时间 当Nginx将网页数据返回给客户端后,可设置缓存的时间,以方便在日后进行相同内容的请求时直接返回,避免重复请求,加快了访问速度.一般针对静态网页设置,对动态网页不设置缓存时间.可在Windows客户端中使用fiddler查看网页缓存时间. 设置方法 可修改配置文件,在http段.或者server段. 或者location段加入对特定内容的过期参数 1.将图片复制到站点目录 [[email protected] nginx-1.12.2]# cd /mnt/tools/

企业级Web Nginx 服务优化(2)

2.worker_cpu_affinity参数官方说明: 查看cpu的核数的情况:[[email protected] conf]# grep "physical" /proc/cpuinfophysical id : 0address sizes : 42 bits physical, 48 bits virtual top命令很好记得总结 输入top 按 1 来进行查看. 3.压力测试配置结果: a.配置前压力测试结果: 通过观察,我们发现配置前不同CPU使用率相对平均. b.配置