码迷,mamicode.com
首页 > 其他好文 > 详细

nginx服务优化大全

时间:2019-12-22 14:18:53      阅读:98      评论:0      收藏:0      [点我收藏+]

标签:nec   for   权限   vim   cti   ams   erer   字符   普通用户   

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 nginxif语句的讲解

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下的rootalias的讲解

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变量限制nginxIP地址并发连接数

利用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为关闭

放置位置????????httpserverlocationif 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 nginx4层反向代理讲解

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服务优化大全

标签:nec   for   权限   vim   cti   ams   erer   字符   普通用户   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!