nginx基本配置学习

阅读更多
最近由于线上用到nginx,对其中的结构不太熟悉,故对其进行详细的分析和学习总结,其中借鉴了 https://www.zybuluo.com/phper/note/89391,  http://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-虚拟主机配置
 
https://www.zybuluo.com/phper/note/89391中讲的非常全面!
 
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)