`
brandNewUser
  • 浏览: 456412 次
  • 性别: 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完整配置说明

    下面是Nginx的完整配置说明,涵盖基本配置、反向代理、FastCGI等方面的知识点。 一、基本配置 在配置文件中,我们首先需要指定用户和用户组,使用`user`指令,并指定工作进程的数量,使用`worker_processes`指令。...

    02nginx动态配置.zip

    "02nginx动态配置.zip"这个压缩包文件提供了关于如何管理和配置Nginx的一些基本操作,旨在帮助用户更好地理解和应用Nginx。下面我们将深入探讨Nginx的配置、启动、关闭和重启过程。 ### 1. Nginx配置 Nginx的配置...

    nginx完全配置手册

    第三章:Nginx的基本配置与优化 此章深入讨论Nginx的配置文件语法,包括指令、模块和参数。你将学习如何配置Nginx处理静态文件、动态内容(如PHP或Java应用)的代理,以及URL重写规则,以实现高效的路由。此外,本章...

    windows下 php+nginx配置详解

    这个配置可以作为基本的Windows环境下PHP和Nginx的搭建教程,但实际应用中可能需要根据项目需求进行更复杂的配置,比如添加SSL支持、负载均衡、缓存设置等。持续学习和理解Nginx和PHP的配置选项,可以帮助你更好地...

    NGINX-配置手册

    建议读者先熟悉基本的NGINX概念和Tomcat基础知识,再深入学习本文档。 #### 二、术语、定义和缩略语 **术语、定义:** - **NGINX**: 高性能的HTTP和反向代理Web服务器,常用于负载均衡场景。 - **Tomcat**: 开源...

    linux下nginx安装、配置实战

    本篇将详细介绍如何在Linux系统上安装Nginx,以及进行基本的配置实践。 首先,我们需要了解Nginx的安装过程。在大多数Linux发行版中,可以通过包管理器来安装Nginx。例如,在Ubuntu或Debian系统中,可以使用`apt-...

    nginx配置+https

    通过以上配置,我们不仅了解了 Nginx 的基本配置方法,还深入学习了如何配置 HTTPS 服务。HTTPS 的实现不仅提升了网站的安全性,也为用户提供了更可靠的数据传输保障。此外,通过配置不同的 Server 块,可以灵活地...

    nginx安装配置

    **Nginx安装配置详解** Nginx是一款高性能的HTTP和反向代理服务器,广泛用于网站的负载均衡和内容分发。...对于更复杂的场景,如SSL/TLS支持、URL重写、缓存管理等,你可能需要进一步深入学习Nginx的高级配置。

    张宴版Nginx学习 以及配置

    1. **Nginx基本配置与优化** - Nginx的核心配置文件是`nginx.conf`,其中包含了全局块、events块、http块和server块等结构。理解这些配置块的作用是掌握Nginx的基础。 - `worker_processes`参数设定工作进程数量,...

    项目打包运行dist以及nginx配置

    基本配置文件结构如下: ```nginx http { server { listen 80; # 监听80端口 server_name example.com; # 指定服务器域名 location / { # 默认路由 root /var/www/html/dist; # 设置静态资源目录为dist ...

    Nginx安装配置.rar

    包含多个server块,定义HTTP服务器的基本配置,如日志格式、编码类型等。 4. **server块** 表示一个独立的HTTP服务器,通常对应一个域名或IP地址,可以包含多个location块。 5. **location块** 根据请求的URL...

    Nginx学习笔记

    Nginx学习笔记 Nginx 是一个流行的开源 Web 服务器软件,能够处理高并发请求,常用于搭建高性能的 Web 服务器。本文将对 Nginx 的安装、配置、日志管理等方面进行详细的介绍。 一、Nginx 的安装 Nginx 的安装可以...

    nginx安装工具及配置

    ### 二、Nginx的基本配置 Nginx的配置文件通常位于`/etc/nginx/nginx.conf`,包括多个服务器(server)配置块。每个服务器配置块可以定义监听的端口、虚拟主机、重定向规则等。 以下是一个基本的配置示例: ```...

    实战Nginx及基础配置与管理

    对于一个新手来说,理解Nginx的基本配置文件结构是第一步。Nginx的配置文件通常位于etc/nginx/nginx.conf,还包括了各种特定的配置文件,通常放在etc/nginx/conf.d目录下。每一个配置文件通常包含三部分:全局块、...

    nginx源码学习资料

    **Nginx源码学习资料概述** Nginx是一款高性能的HTTP和反向代理服务器,以其轻量级、高并发处理能力以及优秀的稳定性而受到广大Web开发者和运维人员的青睐。学习Nginx源码有助于深入理解其工作原理,提高在实际应用...

    企业级应用Nginx配置案例

    1. **基本配置**:Nginx的配置文件通常包含`user`(运行Nginx的服务用户和组)、`worker_processes`(工作进程数量,可根据服务器性能调整)和`error_log`(错误日志路径)等基本信息。`pid`指令指定Nginx主进程的...

    Nginx全套学习指南

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

    Nginx完整学习笔记.doc

    基本配置 Nginx 的配置文件位于 conf 目录下,主要包括以下几个目录: * conf:配置文件目录 * html:网页文件目录 * logs:日志文件目录 * sbin:主要二进制程序目录 启动与停止 启动 Nginx 需要使用 ./sbin/...

    ubuntu+nginx安装配置应用说明

    在本文中,我们将深入探讨如何在Ubuntu操作系统上安装和配置Nginx服务器,这是一个流行的开源Web服务器,以其高性能和稳定性而闻名。...通过不断学习和实践,你可以进一步优化Nginx配置,提升Web应用的性能和可靠性。

Global site tag (gtag.js) - Google Analytics