`
brandNewUser
  • 浏览: 446535 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

nginx基本配置学习

阅读更多
最近由于线上用到nginx,对其中的结构不太熟悉,故对其进行详细的分析和学习总结,其中借鉴了https://www.zybuluo.com/phper/note/89391http://seanlook.com/2015/05/17/nginx-install-and-config/(写得非常好)。
 

关于代理

 
正向代理:也就是一个代理,其工作原理就是一个跳板,加入我要访问google.com,但不能直接访问,可以通过访问A,A可以访问到google.com,A此时就可以作为一个正向代理。正向代理是一个位于客户端和原始服务器(例如google)之间的服务器,然后代理向原始服务器转交请求并将获得的内容返回给客户端。
 
反向代理:正好相反,对于客户端来说它就像是原始服务器,并且客户端不需要进行任何特别的设置,客户端向反向代理的命名空间中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这部分内容就是它自己的一样。
 
nginx就是一个非常优秀的反向代理服务器,nginx中的配置文件主要是 nginx.conf,其结构相对来说比较清晰和简单,大致的分块:
 
main (全局设置)
events (nginx工作模式)  {
  ....
}
http        {
  ....
  upstream myproject (负载均衡器设置) {
    .....
  }
  server (主机设置) {
    ....
    location (url匹配) {
        ....
    }
  }
  server  {
    ....
    location {
        ....
    }
  }
  ....
}
 
 
nginx文件中的注释行以#开头, main部分主要属性配置有:
 
user nobody
 
worker_processes auto;
pid logs/nginx.pid;
 
worker_cpu_affinity auto;
 
 
运行nginx的用户,这也决定了该进程能否访问的文件系统读写权限。
 
在linux/unix系统中,一般的进程都会将本进程的pid写到一个磁盘文件中,其中只有一行,用cat命令可以查看。使用文件作为进程锁,可以防止进程启动多个副本,只有获得pid(固定路径固定文件名)写入权限的进程才能正常启动并把自身的pid写入到该文件中,其他同一个程序的多余进程则自动退出。
 
对于worker_processes,应该为worker角色进程个数,nginx启动后会有多个worker处理http请求,master角色进程并不处理请求,而是根据相应配置文件信息管理worker进程,master进程主要负责接收客户端的请求,并将请求分配给多个worker,每个worker进程负责真正处理请求。
 
最理想的worker_processes值取决于很多因素,包含但不限于cpu核数,如果设置成自动(auto),会自动检测cpu cores并设置worker_processes参数。如果nginx处理的是cpu密集型,比较耗费cpu的操作,建立将此值设置为cpu个数或cpu核数。
  
events模块用来指定nginx的工作模式以及连接数上限
 
events {
    use kqueue; #mac
    worker_connections  51200;
}
 
 
use用来指定nginx的工作模式,支持的有:select, poll, kqueue, epoll, rtsig, /dev/poll,其中select和poll都是标准的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平台上,而kqueue用在BSD系统中,因为Mac基于BSD,所以Mac也得用这个模式,对于Linux系统,epoll工作模式是首选。
 
worker_connections,每个worker进程能够并发处理(发起)的最大连接数(包含所有连接数)。需要注意的是,这个数量包括了所有连接,与被代理服务之间的连接数,与其他角色之间的,不仅仅是与客户端的,另一个需要注意的是这个实际的值不能超过当前最大文件打开数量(worker_rlimit_nofile)。
 
进程的最大连接数受Linux系统进程的最大打开文件数限制,在执行操作系统命令“ulimit -n 65536”后worker_connections的设置才能生效。
 
http模块是最核心的模块,负责http服务器相关属性的配置:
 
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"';
 
     access_log on;
     log_format main '[$time_local] $remote_addr - $remote_user - $server_name  to: $upstream_addr: $request upstream_response_time $upstream_response_time msec $msec request_time $request_time';
     access_log  /usr/local/etc/nginx/logs/access.log  main;
 
     sendfile        on;
     #tcp_nopush     on;
 
     #keepalive_timeout  0;
     keepalive_timeout  65;
 
     #gzip  on;
 
 
include 来用设定文件的mime类型,类型在配置文件目录下的mime.type文件定义,来告诉nginx来识别文件类型。
 
default_type设定了默认的类型为二进制流,也就是当文件类型未定义时使用这种方式,例如在没有配置asp 的locate 环境时,Nginx是不予解析的,此时,用浏览器访问asp文件就会出现下载了。
 
sendfile on可以开启高效文件传输模式,将tcp_nopush和tcp_nodelay两个属性设置成on用于防止网络阻塞。
 
keepalive_timeout设置客户端连接保持活动的超时时间,超过后服务器会关闭该连接。
 
server模块在http模块范围内,为子模块,用来定义一个虚拟主机,一个简单的server定义实例:
 
server {  #定义虚拟主机开始
        listen       8080; #指定虚拟机主机的服务端口
        server_name  localhost 192.168.1.130 www.aaa.com; #指定ip地址或者域名,多个域名用空格分开
        # 全局定义,如果都是这一个目录,这样定义最简单。
        root   /Users/yangyi/www; #server虚拟机内全部的root web根目录
        index  index.php index.html index.htm; #定义全局访问默认地址
        charset utf-8; # 网页默认编码格式
        access_log  usr/local/var/log/host.access.log  main; #访问日志
        error_log  usr/local/var/log/host.error.log  error; #错误日志
        ....
}
  
 
location模块是nginx中使用率非常高的,也很重要,用来定位和解析URL,提供了强大的正则表达式功能,同时支持条件判断匹配,用户可以通过location指令实现nginx对动静网页进行过滤处理。
 
location / 表示匹配访问根目录,root指定指定访问根目录时虚拟主机的web目录,该目录可以是相对路径(相对nginx),也可以为绝对路径。
 
默认的首页和虚拟机目录,index用于设定我们只输入域名后的默认首页地址。
 
location / {
            root   /Users/aaa/www;
            index  index.php index.html index.htm;
        }
 
 
此外,location还可以进行正则匹配,例如php环境的配置:
 
location ~ \.php$ {
            root           /Users/aaa/www;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            include        fastcgi.conf;
        }
 
 
 
 
server-虚拟主机配置
 
 
nginx中提供了强大而简单的负载均衡功能,使用的是upstream模块,一个简单的例子:
 
upstream webservers{
    server 192.168.33.11 weight=10;
    server 192.168.33.12 weight=10;
    server 192.168.33.13 weight=10;
}
server {
    listen 80;
    server_name upstream.iyangyi.com;
    access_log /usr/local/var/log/nginx/upstream.iyangyi.access.log main;
    error_log /usr/local/var/log/nginx/upstream.iyangyi.error.log error;
    location / {
        proxy_pass http://webservers;
        proxy_set_header  X-Real-IP  $remote_addr;
    }
}
 
通过 location的proxy_pass来将请求导至 webservers中(名称可自定义),定义的upstream将请求根据weight(权重)分发至对应的3台服务器中,在upstream模块中还有另外的参数:
 
  • max_fails: 允许请求失败的次数,默认为1,当超过最大次数时,返回proxy_next_upstream模块定义的错误;
  • fail_timeout: 在经理max_fails次失败后,暂停服务的时间,与max_fails一起使用,进行服务器健康状态检查。
 
当失败2次后,就停止30秒该服务。
 
server 192.168.1.130 weight=1 max_fails=2 fail_timeouts=30s;
  
 
  • down:该服务器暂时不参与负载均衡,相当于注释;
  • backup:这台机器是备份服务器,当其他服务器不可用时才使用;
 
upstream可以使用某种负载均衡算法来进行调度,当前支持的有:
 
  • weight轮询(默认),每个请求按照顺序逐一分配,会自动剔除宕机的服务器;
  • ip_hash,每个请求按访问ip的hash结果分配,同一个ip的访客会固定访问同一台服务器,解决动态网页存在的session共享问题;
  • fair,只能负载均衡算法,根据页面大小和加载时间长短智能地进行负载均衡,根据后端服务器的响应时间来分配请求,需要下载upstream_fair来支持该算法;
  • url_hash,根据访问url进行hash的结果来分配请求,使得每个url定向到同一个服务器,进一步提高后端缓存服务器的效率,需要下载hash软件包支持该算法;
 
注意,当选择ip_hash时,weight和backup参数会失效。
 
日志
 
nginx中有两种日志,访问日志和错误日志。其中访问日志记录客户端访问nginx的每一个请求,包括用户地域来源,跳转来源,使用终端某个url访问量等,访问日志可以自定义;错误日志则记录用户访问nginx出错时的日志,格式不支持自定义,通过错误日志可以得到系统某个服务或server的性能瓶颈。
 
在http中打开访问日志,access_log属性为on,access_log指定日志的地址
 
access_log on;
log_format main '[$time_local] $remote_addr - $remote_user - $server_name  to: $upstream_addr: $request upstream_response_time $upstream_response_time msec $msec request_time $request_time';
access_log  /usr/local/etc/nginx/logs/access.log  main;
 
 
log_format指定日志的格式,其中$后面就是nginx中定义的变量,如果按照上面的配置,日志如下:
 
[31/Oct/2016:20:43:27 +0800] 127.0.0.1 - - - localhost  to: 119.254.109.163:8081: GET /home/homePage/getHomeImg.json HTTP/1.1 upstream_response_time 0.165 msec 1477917807.635 request_time 0.165
 
 
日志中属性的含义:
 
 
属性名称 属性含义  
$remote_addr 与$http_x_forwarded_for 用以记录客户端的ip地址  
$time_local 记录访问时间与时区  
$remote_user 记录客户端用户名称  
$request 记录请求的url与http协议  
$request_uri    /stat.php?id=1585378&web_id=1585378
$request_time 请求的耗时 0.205
$connection 所用连接序号  
$http_referer 用来记录从哪个页面链接过来的  
$http_user_agent 记录客户端浏览器的相关信息 “Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SV1; GTB7.0; .NET4.0C;
$body_bytes_sent 记录发送给客户端文件主体内容大小  
$status 记录请求状态;成功是200  
$http_host 请求地址,即浏览器中你输入的地址(IP或域名)
img.alipay.com
 
10.253.70.103
$upstream_status upstream状态 200
$ssl_protocol SSL协议版本 TLSv1
$ssl_cipher 交换数据中的算法 RC4-SHA
 
 
nginx常见问题
 
出现nginx pid文件失败,使用nginx -s reload时,需要根据pid文件中的进程id(pid)来重新加载配置,如果没有一个已经运行的nginx进程,就无法向其发送信号(signal),此时直接运行nginx即可。
 
nginx: [error] open() "/usr/local/var/run/nginx.pid" failed (2: No such file or directory)
  
 
在淘宝改进的tengine中,有些访问日志字段不支持,例如在我们的环境中$upstream_addr就不起作用。
 
关于nginx中location模块的具体用法,可以查看https://www.zybuluo.com/phper/note/133244
 
 
 
 
分享到:
评论

相关推荐

    Nginx全套学习指南

    第3章 Nginx的基本配置与优化 第4章 Nginx与PHP(FastCGI)的安装、配置与优化 第5章 Nginx与JSP、ASP.NET、Perl的安装与配置 第6章 Nginx HTTP负载均衡和反向代理的配置与优化 第7章 Nginx的Rewrite规则与实例 第8章 ...

    Nginx技术的学习 加油

    Nginx基础: 对Nginx的基本概念、架构和工作原理进行介绍,包括事件驱动的异步架构。 安装和配置: 提供关于如何安装和配置Nginx的详细指南,包括常见的配置文件和参数。 虚拟主机和代理: 解释如何配置虚拟主机和...

    使用nginx部署前端项目(超详细教程).pdf

    然后,文章详细讲解了如何在Linux系统上安装Nginx,并介绍了Nginx的一些基本配置和使用方式。接下来,文章详细讲解了如何使用Nginx来部署前端项目,包括如何设置静态文件目录和如何配置反向代理和HTTPS。文章还包含...

    ruby on rails环境搭建学习笔记;passenger+nginx环境配置

    本人学习ruby on rails 的开发和部署过程中的环境搭建的笔记 基本涵盖了ruby开发中用到的所有软件的安装 也给自己留个存档

    Nginx:取代apache的高性能服务器

    第4部分为模块篇,对Nginx的基本模块和第三方模块进行了集中介绍。, 本书是为对配置管理Nginx服务器感兴趣的读者准备的,适用于以前没有接触过Nginx,或者对Nginx有一些了解并希望能够 进一步深入学习的专业系统...

    lua-nginx-module完全指南.docx

    使用Lua编写Nginx脚本的基本构建块是指令。指令用于指定何时运行用户Lua代码以及如何使用结果。 在nginx.conf文件中各种*_by_lua,*_by_lua_block和*_by_lua_file配置指令内的用来配置的网关的Lua API。只能在这些...

    深入理解Nginx模块开发与架构解析.pdf

    这一部分介绍配置项的方式,更偏重于带领对Nginx还比较陌生的读者熟悉它,通过了解几个基本Nginx模块的配置修改方式,进而使读者可以通过查询官网、第三方网站来了解如何使用所有Nginx模块的用法。?  在第二部分的...

    Linux 系统 Nginx 按照部署文档

    Linux上部署Nginx的简单描述如下: 1. 安装Nginx:使用包管理工具(如apt、yum或dnf等)安装Nginx。...同时,为保障系统安全,建议参考Nginx的官方文档或相关资源,学习更多关于Nginx的配置和最佳实践。

    Ngnix学习指南电子版

    第3章 Nginx的基本配置与优化 第4章 Nginx与PHP(FastCGI)的安装、配置与优化 第5章 Nginx与JSP、ASP.NET、Perl的安装与配置 第6章 Nginx HTTP负载均衡和反向代理的配置与优化 第7章 Nginx的Rewrite规则与实例 第8章 ...

    Nginx开发从入门到精通

    1. Nginx基础知识:了解Nginx的安装、配置和运行原理,熟悉Nginx的核心模块和指令,掌握Nginx的基本使用。 2. Nginx作为Web服务器:配置Nginx作为静态资源Web服务器,了解虚拟主机和Location的概念,掌握Nginx处理HTTP...

    Linux环境傻瓜式nginx+rtmp+ffmpeg套餐安装详解(获取拉流人数)

    文章首先介绍了nginx、rtmp和ffmpeg的基本概念及其在流媒体服务中的作用,随后详细阐述了各个组件的安装步骤和配置方法。通过本文的指导,读者可以轻松完成nginx+rtmp+ffmpeg的安装和配置,实现流媒体服务器的搭建。...

    nginx学习总结五(nginx反向代理)

    Nginx代理与负载均衡配置与优化 Nginx代理 Nginx从0.7.48版本开始,支持了类似Squid的缓存功能。Nginx的Web缓存服务主要由proxy_cache相关指令集和fastcgi_cache相关指令集构成,前者用于反向代理时,对后端内容源...

    实战Nginx:取代Apache的高性能Web服务器

    第3章 Nginx的基本配置与优化.pdf 第4章 Nginx与PHP(FastCGI)的安装、配置与优化.pdf 第5章 Nginx与JSP、ASP.NET、Perl的安装与配置.pdf 第6章 Nginx HTTP负载均衡和反向代理的配置与优化.pdf 第7章 Nginx的Rewrite...

    akamai-nginx:根据akamai属性规则配置Nginx

    学习有关CDN的基本概念。 如何? 该节点模块调用Akamai PAPI(属性API),并使用给定属性在Akamai CDN上使用具有相同逻辑标准和行为的本地Nginx实例进行配置。 模拟了最常用的功能,在某些情况下会跳过高级功能。...

    实战Nginx.取代Apache的高性能Web服务器.2010 pdf

    张宴,就职于北京金山... 本书是为对配置管理Nginx服务器感兴趣的读者准备的,适用于以前没有接触过Nginx,或者对Nginx有一些了解并希望能够进一步深入学习的专业系统工程师、个人网站站长及Linux/Unix从业人员。 

    【spring-boot-seckill分布式秒杀系统 v1.0】从0到1构建的java秒杀系统源码+安装说明

    spring-boot-seckill分布式秒杀系统是一个用SpringBoot开发的从0到1构建的分布式秒杀系统,项目案例基本成型,逐步完善中。 开发环境: JDK1.8、Maven、Mysql、IntelliJ IDEA、SpringBoot1.5.10、zookeeper3.4.6、...

    Nginx实现跨域使用字体文件的配置详解

    本文主要给大家介绍了关于Nginx跨域使用字体文件的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: 问题描述 今天在使用子域名访问根域名的CSS时,发现字体无法显示,在确保CSS和Font字体的路径加载...

    Linux服务环境搭建相关软件(JDK、Nginx、Tomact)

    Java线上Linux环境部署的全过程,都是个人真实服务器一步一步配置的,只要安装步骤基本没有什么问题,非常适合第一次搭建环境的同学,直接可以安步骤傻瓜式配置。本文主要是配置java项目的相关环境,后续会继续更新...

    nginx基础第四讲.动静分离.docx

    相信小伙伴们通过前几节课的学习,已经了解nginx基本操作以及负载均衡的配置方法,这一讲重点介绍动态静态请求的分离,实现服务的高效运转!

    Kubernetes 之 MetalLB 与 Nginx Controller

    学习该视频之前,需要具有?Kubernetes?集群管理配置经验。 ? ?2. 如果没有支持BGP路由协议的硬件设备,MetalLB?部分的?BGP?负载均衡实验您可能无法做,但是后续的Nginx Controller?可以基于?MetalLB?二层负载均衡做...

Global site tag (gtag.js) - Google Analytics