欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

nginx基本配置学习

程序员文章站 2022-06-19 19:22:20
...
最近由于线上用到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