资讯专栏INFORMATION COLUMN

Nginx常见配置

Anleb / 1837人阅读

摘要:只需要两个配置,个,个,分别用来做反向代理,和负载均衡。以反向代理为例,不自己处理的相关请求,而是把的相关请求转发给来处理。

</>复制代码

  1. 二话不说,直接进入配置主题,若对nginx毫无了解的请跳转Nginx入门到实战(1)基础篇

在此之前,先把配置参数所在位置分为四层

1. conf 全局层
2. http 服务器层
3. server 虚拟主机层
4. location 定位层

一、全局层

</>复制代码

  1. #有1个工作的子进程,可以自行修改,但太大无益,因为要争夺CPU,一般设置为 CPU数*核数
  2. worker_processes 1;
  3. #一般是配置nginx连接的特性,如1个子进程能同时允许多少连接
  4. Event {
  5. #这是指一个子进程最大允许连1024个连接
  6. worker_connections 1024;
  7. }
  8. #这是配置http服务器的主要段
  9. http {
  10. #这是虚拟主机段
  11. Server1 {
  12. #定位,把特殊的路径或文件再次定位,如image目录多带带处理,如.php多带带处理
  13. Location {
  14. ...
  15. }
  16. }
  17. Server2 {
  18. ...
  19. }
  20. }
二、HTTP服务器层 1. 网页内容的压缩编码与传输速度优化

</>复制代码

  1. 请求:
  2. Accept-Encoding:gzip,deflate,sdch
  3. 响应:
  4. Content-Encoding:gzip
  5. Content-Length:36093

原理:
浏览器---请求----> 声明可以接受 gzip压缩 或 deflate压缩 或compress 或 sdch压缩。

从http协议的角度看--请求头 声明 acceopt-encoding: gzip deflate sdch (是指压缩算法,其中sdch是google倡导的一种压缩方式,目前支持的服务器尚不多)

服务器-->回应---把内容用gzip方式压缩---->发给浏览器
浏览<-----解码gzip-----接收gzip压缩内容

</>复制代码

  1. gzip #配置的常用参数
  2. gzip on|off; #是否开启gzip
  3. gzip_buffers 32 4K | 16 8K #缓冲(压缩在内存中缓冲几块? 每块多大?)
  4. gzip_comp_level #[1-9] #推荐6 压缩级别(级别越高,压的越小,越浪费CPU计算资源)
  5. gzip_disable #正则匹配UA 什么样的Uri不进行gzip
  6. gzip_min_length 200 #开始压缩的最小长度(再小就不要压缩了,意义不在)
  7. gzip_http_version 1.0|1.1 # 开始压缩的http协议版本(可以不设置,目前几乎全是1.1协议)
  8. gzip_proxied #设置请求者代理服务器,该如何缓存内容
  9. gzip_types text/plain application/xml #对哪些类型的文件用压缩如txt,xml,html ,css ,若不知道类型名称,可以查看nginx下conf文件夹的mime.types
  10. gzip_vary on|off #是否传输gzip压缩标志

注意:
图片/mp3这样的二进制文件,不必压缩因为压缩率比较小,比如100->80字节,而且压缩也是耗费CPU资源的。比较小的文件不必压缩。

2. 缓存设置

对于网站的图片,尤其是新闻站,图片一旦发布,改动的可能是非常小的。我们希望 能否在用户访问一次后,图片缓存在用户的浏览器端,且时间比较长的缓存。
可以, 用到nginx的expires设置。

</>复制代码

  1. #在location或if段里
  2. expires 30s;
  3. expires 30m;
  4. expires 2h;
  5. expires 30d;
  6. location ~ image {
  7. expires 1d;
  8. }

另: 304 也是一种很好的缓存手段

原理是: 服务器响应文件内容是,同时响应etag标签(内容的签名,内容一变,他也变), 和 last_modified_since 2个标签值。浏览器下次去请求时,头信息发送这两个标签, 服务器检测文件有没有发生变化,如无,直接头信息返回 etag,last_modified_since
浏览器知道内容无改变,于是直接调用本地缓存。
这个过程,也请求了服务器,但是传着的内容极少。
对于变化周期较短的,如静态html,js,css,,比较适于用这个方式

三、虚拟主机层

</>复制代码

  1. #基于域名的虚拟主机
  2. server {
  3. listen 80; #监听端口
  4. server_name a.com; #监听域名
  5. location / {
  6. root /var/www/a.com; #根目录定位
  7. index index.html;
  8. }
  9. }
  10. #基于端口的虚拟主机配置 访问 192.xxx.xx.xxx:8080
  11. server {
  12. listen 8080; #监听8080端口
  13. server_name 192.xxx.xx.xxx; #服务器IP地址
  14. location / {
  15. root /var/www/html8080;
  16. index index.html;
  17. }
  18. }
1. 日志管理

</>复制代码

  1. #不同的server可以使用不同的log
  2. #此处定义了日志格式,最好定位在顶层,方便其他server公用
  3. log_format main "$remote_addr - $remote_user [$time_local] "$request" "
  4. # "$status $body_bytes_sent "$http_referer" "
  5. # ""$http_user_agent" "$http_x_forwarded_for"";
  6. $remote_addr 用户ip
  7. $remote_user [$time_local] 用户访问时间
  8. $request 请求类型 get,post...
  9. $status 请求状态 200 304...
  10. $body_bytes_sent 请求的内容有多少字节
  11. $http_referer 上一个页面来自哪里(从哪里跳转过来)
  12. $http_user_agent 用户代理(用了什么浏览器访问)
  13. #这说明 该server, 它的访问日志的文件,使用的格式main格式.
  14. access_log logs/host.access.log main;

写一个sh脚本,每天半夜切分log日志,避免log每天累积造成文件过大

</>复制代码

  1. #!/bin/bash
  2. base_path="/usr/local/nginx/logs"
  3. log_path=$(date -d yesterday +"%Y%m")
  4. day=$(date -d yesterday +"%d")
  5. mkdir -p $base_path/$log_path
  6. mv $base_path/access.log $base_path/$log_path/access_$day.log
  7. #echo $base_path/$log_path/access_$day.log
  8. kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
  9. #Crontab 编辑定时任务
  10. 01 00 * * * /xxx/path/b.sh 每天0时1分(建议在02-04点之间,系统负载小)
四、定位层 1. location定位

location 有“定位”的意思,根据Uri来进行不同的定位,在虚拟主机的配置中,是必不可少的。location可以把网站的不同部分,定位到不同的处理方式上。

当我们碰到“.php”, 如何调用PHP解释器? --这时就需要location

</>复制代码

  1. #location 的语法
  2. location [=|~|~*|^~] patt {
  3. ...
  4. }
  5. #中括号可以不写任何参数,此时称为一般匹配
  6. #也可以写参数
  7. #因此,大类型可以分为3种
  8. #首先看有没有精准匹配,如果有,则停止匹配过程,若没有向下匹配到最符合的location
  9. location = patt {} #[精准匹配]
  10. location patt{} #[一般匹配]
  11. location ~ patt{} #[正则匹配]

匹配顺序实例1

</>复制代码

  1. location / {
  2. root /usr/local/nginx/html;
  3. index index.html index.htm;
  4. }
  5. location ~ image {
  6. root /var/www/image;
  7. index index.html;
  8. }
  9. #如果我们访问 http://xx.com/image/logo.png
  10. #此时, “/” 与”/image/logo.png” 匹配
  11. #同时,”image”正则 与”image/logo.png”也能匹配,谁发挥作用?
  12. #正则表达式的成果将会使用.
  13. #图片真正会访问 /var/www/image/logo.png
  14. #注意,若在roo最后加了"/",那么将访问/var/www/image/image/logo.png

匹配顺序实例2

</>复制代码

  1. location / {
  2. root /usr/local/nginx/html;
  3. index index.html index.htm;
  4. }
  5. location /foo {
  6. root /var/www/html;
  7. index index.html;
  8. }
  9. #我们访问 http://xxx.com/foo
  10. #对于uri “/foo”, 两个location的patt,都能匹配他们
  11. #即 ‘/’能从左前缀匹配 ‘/foo’, ‘/foo’也能左前缀匹配’/foo’,
  12. #此时, 真正访问 /var/www/html/index.html
  13. #原因:’/foo’匹配的更长,因此使用之

总结:

先判断精准命中,如果命中,立即返回结果并结束解析过程

判断普通命中,如果有多个命中,记录下最长的命中结果为准(记录但不结束)

继续判断正则表达式的解析结果,按配置里的正则表达式顺序为准,由上往下,一旦匹配成功1个,立即返回结果,并结束解析

分析:

普通命中顺序无所谓,按命中长短来决定

正则命中,按顺序

2. rewrite 重写

</>复制代码

  1. #重写中用到的指令
  2. if (条件) {} #设定条件,再进行重写
  3. set #设置变量
  4. return #返回状态码
  5. break #跳出rewrite
  6. rewrite #重写
  7. #If 语法格式
  8. If 空格 (条件) {
  9. 重写模式
  10. }
  11. #条件语法
  12. 1: “=”来判断相等, 用于字符串比较
  13. 2: “~” 用正则来匹配(此处的正则区分大小写)
  14. ~* 不区分大小写的正则
  15. 3: -f -d -e来判断是否为文件,为目录,是否存在.

例子

</>复制代码

  1. location / {
  2. #当访问ip相等时,返回403
  3. if ($remote_addr = 192.xxx.xx.xx) {
  4. return 403;
  5. }
  6. #如果是IE浏览器访问
  7. if ($http_user_agent ~ MSIE) {
  8. rewrite ^.*$ /ie.htm;
  9. break; #若不brea,重定向后又会匹配到IE浏览器,又走到这一步,会循环重定向
  10. }
  11. #若访问目录、文件不存在,重定向到404页面
  12. if (!-e $document_root$fastcgi_script_name) {
  13. rewrite ^.*$ /404.html break;
  14. }
  15. root html;
  16. index index.html
  17. }

xx.com/dsafsd.html这个不存在页面为例,我们观察访问日志,日志中显示的访问路径,依然是GET /dsafsd.html HTTP/1.1。提示:服务器内部的rewrite和302跳转不一样。
跳转的话URL都变了,变成重新http请求404.html,而内部rewrite, 上下文没变,
就是说 fastcgi_script_name 仍然是 dsafsd.html,因此会循环重定向。

set 是设置变量用的, 可以用来达到多条件判断时作标志用,达到apache下的 rewrite_condition的效果

</>复制代码

  1. #使用set方式防止重定向死循环
  2. if ($http_user_agent ~* msie) {
  3. set $isie 1;
  4. }
  5. if ($fastcgi_script_name = ie.html) {
  6. set $isie 0;
  7. }
  8. if ($isie 1) {
  9. rewrite ^.*$ ie.html;
  10. }
3. Nginx与PHP配合

</>复制代码

  1. #当碰到访问 .php 的时候时候
  2. location ~ .php$ {
  3. root html;
  4. #把请求的信息转发给9000端口的PHP进程
  5. fastcgi_pass 127.0.0.1:9000;
  6. fastcgi_index index.php;
  7. #告诉php进程想运行哪个php文件
  8. fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  9. include fastcgi_params;
  10. }
  11. #1: 碰到php文件,
  12. #2: 把根目录定位到 html,
  13. #3: 把请求上下文转交给9000端口PHP进程,
  14. #4: 并告诉PHP进程,当前的脚本是 $document_root$fastcgi_scriptname
  15. # (注:PHP会去找这个脚本并处理,所以脚本的位置要指对)
4. 反向代理 + 负载均衡

用nginx做反向代理和负载均衡非常简单。

只需要两个配置, 1个proxy, 1个upstream,分别用来做反向代理,和负载均衡。

以反向代理为例,nginx不自己处理php的相关请求,而是把php的相关请求转发给apache来处理。

</>复制代码

  1. #将php程序交给8080端口的apache处理,实现动静分离
  2. location ~ .php$ {
  3. proxy_pass http://xxx.xxx.xx:8080
  4. }

</>复制代码

  1. http {
  2. ...
  3. #负载均衡服务器池
  4. upstream xxx {
  5. server 127.xx.xx.xx1;
  6. server 127.xx.xx.xx2;
  7. }
  8. server {
  9. liseten 80;
  10. server_name localhost;
  11. location / {
  12. #用户真实IP
  13. proxy_set_header X-Real-IP $remote_addr;
  14. proxy_pass http://xxx #upstream 对应自定义名称
  15. include proxy.conf;
  16. }
  17. }
  18. }

有收获的朋友记得点个 收藏 哦~

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/39954.html

相关文章

  • Nginx反向代理跨域基本配置常见误区

    摘要:同时由于跨域了,就想利用的反向代理去处理一下跨域,但是在解决问题的同时,发现网上有些方案的确是存在一些问题,在这里总结一下基本配置,也聊一下常见的配置问题。 最近公司前后端分离,前端独立提供页面和静态服务很自然的就想到了用nginx去做静态服务器。同时由于跨域了,就想利用nginx的反向代理去处理一下跨域,但是在解决问题的同时,发现网上有些方案的确是存在一些问题,在这里总结一下基本配置...

    lindroid 评论0 收藏0
  • Nginx反向代理跨域基本配置常见误区

    摘要:同时由于跨域了,就想利用的反向代理去处理一下跨域,但是在解决问题的同时,发现网上有些方案的确是存在一些问题,在这里总结一下基本配置,也聊一下常见的配置问题。 最近公司前后端分离,前端独立提供页面和静态服务很自然的就想到了用nginx去做静态服务器。同时由于跨域了,就想利用nginx的反向代理去处理一下跨域,但是在解决问题的同时,发现网上有些方案的确是存在一些问题,在这里总结一下基本配置...

    JasonZhang 评论0 收藏0
  • Nginx 内容缓存及常见参数配置

    摘要:设置一个共享内存区,该内存区用于存储缓存键和元数据,有些类似计时器的用途。注意,非活动内容有别于过期内容。在两次缓存管理器启动的间隔,缓存的数据量可能短暂超过配置的大小。为在缓存响应之前必须使用相同密钥的请求的最小次数。 原文链接:何晓东 博客 使用场景:项目的页面需要加载很多数据,也不是经常变化的,不涉及个性化定制,为每次请求去动态生成数据,性能比不上根据请求路由和参数缓存一下结果,...

    KnewOne 评论0 收藏0
  • Nginx 内容缓存及常见参数配置

    摘要:设置一个共享内存区,该内存区用于存储缓存键和元数据,有些类似计时器的用途。注意,非活动内容有别于过期内容。在两次缓存管理器启动的间隔,缓存的数据量可能短暂超过配置的大小。为在缓存响应之前必须使用相同密钥的请求的最小次数。 原文链接:何晓东 博客 使用场景:项目的页面需要加载很多数据,也不是经常变化的,不涉及个性化定制,为每次请求去动态生成数据,性能比不上根据请求路由和参数缓存一下结果,...

    olle 评论0 收藏0
  • Nginx 内容缓存及常见参数配置

    摘要:设置一个共享内存区,该内存区用于存储缓存键和元数据,有些类似计时器的用途。注意,非活动内容有别于过期内容。在两次缓存管理器启动的间隔,缓存的数据量可能短暂超过配置的大小。为在缓存响应之前必须使用相同密钥的请求的最小次数。 原文链接:何晓东 博客 使用场景:项目的页面需要加载很多数据,也不是经常变化的,不涉及个性化定制,为每次请求去动态生成数据,性能比不上根据请求路由和参数缓存一下结果,...

    felix0913 评论0 收藏0

发表评论

0条评论

Anleb

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<