Nginx

 ·  ☕ 18  · 👀...

介绍

运维

CentOS7在线安装Nginx

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
### 将nginx放到yum repro库中
$ rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
### 查看nginx信息
$ yum info nginx
### 使用yum安装ngnix
$ yum install nginx -y
### 启动nginx
$ service nginx start
### 查看nginx版本
$ nginx -v
### 访问nginx
$ curl -i localhost
目录 说明
/etc/nginx/ nginx配置文件位置
/usr/share/nginx/html 网站文件存放默认目录
/etc/nginx/conf.d/default.conf 网站默认站点配置
/etc/nginx/conf.d/ 自定义Nginx站点配置文件存放目录
/etc/nginx/nginx.conf Nginx全局配置

CentOS7源码安装Nginx

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
$ cd /usr/local
### 安装基础库
$ yum install gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel -y
### 下载Nginx
$ wget http://nginx.org/download/nginx-1.14.2.tar.gz
$ tar zxvf nginx-1.14.2.tar.gz
$ cd nginx-1.14.2
$ ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
$ make && make install
### 启动Nginx
$ /usr/local/nginx/sbin/nginx
### 停止Nginx
$ /usr/local/nginx/sbin/nginx -s stop
### 重新加载Nginx
$ /usr/local/nginx/sbin/nginx -s reload
### 查看Nginx是否启动
$ netstat -antp
### 查看Nginx版本
$ /usr/local/nginx/sbin/nginx -v
目录 说明
/usr/local/nginx/conf 配置文件
/usr/local/nginx/html 网页文件
/usr/local/nginx/logs 日志文件
/usr/local/nginx/sbin 主要二进制程序

CentOS6安装Nginx

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
### 安装基础库
$ yum install gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel -y
### 添加Nginx到yum源
$ rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
### 在线安装nginx
$ yum install nginx
### 删除Nginx
$ yum remove nginx
### 查看Nginx的安装目录
$ whereis nginx
$ rpm -qal nginx

Mac安装nginx

1
2
3
> brew install nginx
##### 卸载nginx
> brew uninstall nginx
  • nginx安装文件目录:/usr/local/Cellar/nginx
  • nginx配置文件目录:/usr/local/etc/nginx
  • config文件目录:/usr/local/etc/nginx/nginx.conf

管理Nginx

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# 启动
$ service nginx start
$ systemctl start nginx.service

# 停止
$ service nginx stop

# 查看Nginx状态
$ service nginx status

# 设置开机启动Nginx(方法1)
$ systemctl enable nginx.service

# 设置开机启动Nginx(方法2)
$ chkconfig nginx on

# 禁止开机启动Nginx(方法1)
$ systemctl disable nginx.service

# 禁止开机启动Nginx(方法2)
$ chkconfig nginx off

# 检查配置
$ nginx -t

# 启动Nginx
$ nginx

# 停止Nginx
$ nginx -s stop

# 重新加载Nginx
$ nginx -s reload

# 查看Nginx是否启动
$ netstat -antp

# 查看Nginx版本
$ nginx -v

配置反向代理

http {
    upstream static {
        server 10.10.1.31:80;
        server 10.10.1.32:80;
    }

    server {
        location / {
            proxy_pass_header Server;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Scheme $scheme;
            proxy_pass http://static;
        }
    }
}

配置Nginx Proxy Cache

配置nginx.conf

http {
    upstream static {
        server 10.10.1.31:80;
        server 10.10.1.32:80;
    }

    # 设置缓存区域
    proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;

    server {
        # 显示当前页面的缓存状态
        add_header X-Cache $upstream_cache_status;

        location / {
            # 转发一些客户端信息
            proxy_pass_header Server;
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Scheme $scheme;

            # 设置缓存用的 Key
            proxy_cache_key $host$uri$is_args$args;
            proxy_cache my_cache;

            # 设置缓存有效期
            proxy_cache_valid  200 302  1m;
            proxy_cache_valid  404      5m;
            proxy_cache_valid  any      1m;
            
            # 设置反向代理
            proxy_pass http://static;
        }
    }
}

测试是否命中

1
2
3
$ curl -I http://10.10.1.33
##### 说明 #####
# X-Cache:HIT(命中缓存)、MISS(未命中缓存)、EXPIRED(缓存已经过期请求被传送到后端)、UPDATING(正在更新缓存,将使用旧的应答)、STALE(后端将得到过期的应答)

Nginx Proxy Cache配置项说明

配置项 说明
proxy_cache_path
levels
key_zone 在共享内存中设置一块存储区域来存放缓存的key和metadata(类似使用次数),这样nginx可以快速判断一个request是否命中或者未命中缓存,1m可以存储8000个key,10m可以存储80000个key
max_size 最大cache空间,如果不指定,会使用掉所有disk space,当达到配额后,会删除最少使用的cache文件
inactive 未被访问文件在缓存中保留时间,本配置中如果60分钟未被访问则不论状态是否为expired,缓存控制程序会删掉文件,默认为10分钟;“需要注意的是,inactive和expired配置项的含义是不同的,expired只是缓存过期,但不会被删除,inactive是删除指定时间内未被访问的缓存文件”
use_temp_path 如果为off,则nginx会将缓存文件直接写入指定的cache文件中,而不是使用temp_path存储,official建议为off,避免文件在不同文件系统中不必要的拷贝
proxy_cache 启用proxy cache,指定key_zone

配置API代理转发

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
server {
    listen  80;
    server_name 127.0.0.1;
    
    location / {
        proxy_pass  http://127.0.0.1:3000;
    }
    # 以/api/开头的请求全部转发到http://172.30.1.123:8081
    # ~ 开头表示区分大小写的正则匹配
    location ~ /api/ {
        proxy_pass  http://172.30.1.123:8081;
    }
}

查看nginx路径

1
> ps aux|grep nginx

查看nginx配置文件路径

1
> /usr/local/opt/nginx/bin/nginx -t

配置Nginx上传文件大小

1.打开nginx配置文件 nginx.conf, 路径一般是:/etc/nginx/nginx.conf。

2.在http{}段中加入 client_max_body_size 20m; 20m为允许最大上传的大小。

3.保存后重启nginx,问题解决。

Nginx.conf配置说明

location

模式 含义
location = /uri = 表示精确匹配,只有完全匹配上才能生效
location ^~ /uri ^~ 开头对URL路径进行前缀匹配,并且在正则之前
location ~ pattern 开头表示区分大小写的正则匹配
location ~* pattern 开头表示不区分大小写的正则匹配
location /uri 不带任何修饰符,也表示前缀匹配,但是在正则匹配之后
location / 通用匹配,任何未匹配到其它location的请求都会匹配到,相当于switch中的default

内置绑定变量

名称 说明
$arg_name 请求中的name参数
$args 请求中的参数
$binary_remote_addr 远程地址的二进制表示
$body_bytes_sent 已发送的消息体字节数
$content_length HTTP 请求信息里的”Content-Length”
$content_type 请求信息里的”Content-Type”
$document_root 针对当前请求的根路径设置值
$host 请求信息中的”Host”,如果请求中没有Host行,则等于设置的服务器名
$hostname 机器名使用 gethostname系统调用的值
$http_cookie cookie 信息
$http_referer 引用地址
$http_user_agent 客户端代理信息
$http_via 最后一个访问服务器的Ip地址
$http_x_forwarded_for 相当于网络访问路径
$is_args 如果请求行带有参数,返回“?”,否则返回空字符串
$limit_rate 对连接速率的限制
$nginx_version 当前运行的nginx版本号
$pid worker 进程的PID
$query_string 与args相同
$realpath_root 按root指令或alias指令算出的当前请求的绝对路径。其中的符号链接都会解析成真是文件路径,使用 Nginx 内置绑定变量
$remote_addr 客户端IP地址
$remote_port 客户端端口号
$remote_user 客户端用户名,认证用
$request 用户请求
$request_body 这个变量(0.7.58+) 包含请求的主要信息。在使用proxy_pass或fastcgi_pass指令的location中比较有意义
$request_body_file 客户端请求主体信息的临时文件名
$request_completion 如果请求成功,设为”OK”;如果请求未完成或者不是一系列请求中最后一部分则设为空
$request_filename 当前请求的文件路径名,比如/opt/nginx/www/test.php
$request_method 请求的方法,比如”GET”、”POST”等
$request_uri 请求的URI,带参数
$scheme 所用的协议,比如http或者是https
$server_addr 服务器地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用以取得地址(造成资源浪费)
$server_name 请求到达的服务器名
$server_port 请求到达的服务器端口号
$server_protocol 请求的协议版本,”HTTP/1.0”或”HTTP/1.1”
$uri 请求的URI,可能和最初的值有不同,比如经过重定向之类的

配置示例

示例1

#定义Nginx运行的用户和用户组
user www www;

#nginx进程数,建议设置为等于CPU总核心数。
worker_processes 8;

#全局错误日志定义类型,[debug|info|notice|warn|error|crit ]
error_log /var/log/nginx/error.log info;

#进程文件
pid /var/run/nginx.pid;

#一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。
worker_rlimit_nofile 65535;

#工作模式与连接数上限
events
{
#参考事件模型,use [kqueue|rtsig|epoll|/dev/poll|select|poll]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
use epoll;
#单个进程最大连接数(最大连接数=连接数*进程数)
worker_connections 65535;
}

# 设定http服务器
http
{
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型
# charset utf-8; #默认编码
server_names_hash_bucket_size 128; #服务器名字的hash表大小
client_header_buffer_size 32k; #上传文件大小限制
large_client_header_buffers 4 64k; #设定请求缓
client_max_body_size 8m; #设定请求缓
# 开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
sendfile on; 
autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。
tcp_nopush on; #防止网络阻塞
tcp_nodelay on; #防止网络阻塞
keepalive_timeout 120; #长连接超时时间,单位是秒

#FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;

#gzip模块设置
gzip on; #开启gzip压缩输出
gzip_min_length 1k; #最小压缩文件大小
gzip_buffers 4 16k; #压缩缓冲区
gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
gzip_comp_level 2; #压缩等级
gzip_types text/plain application/x-javascript text/css application/xml;
#压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。
gzip_vary on;
#limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用

upstream blog.ha97.com {
#upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。
server 192.168.80.121:80 weight=3;
server 192.168.80.122:80 weight=2;
server 192.168.80.123:80 weight=3;
}

#虚拟主机的配置
server
{
#监听端口
listen 80;
#域名可以有多个,用空格隔开
server_name www.ha97.com ha97.com;
index index.html index.htm index.php;
root /data/www/ha97;
location ~ .*\.(php|php5)?$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
#图片缓存时间设置
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 10d;
}
#JS和CSS缓存时间设置
location ~ .*\.(js|css)?$
{
expires 1h;
}
#日志格式设定
log_format access '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';
#定义本虚拟主机的访问日志
access_log /var/log/nginx/ha97access.log access;

#对 "/" 启用反向代理
location / {
proxy_pass http://127.0.0.1:88;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#以下是一些反向代理的配置,可选。
proxy_set_header Host $host;
client_max_body_size 10m; #允许客户端请求的最大单文件字节数
client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,
proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)
proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置
proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k;
#设定缓存文件夹大小,大于这个值,将从upstream服务器传
}

#设定查看Nginx状态的地址
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file conf/htpasswd;
#htpasswd文件的内容可以用apache提供的htpasswd工具来产生。
}

#本地动静分离反向代理配置
#所有jsp的页面均交由tomcat或resin处理
location ~ .(jsp|jspx|do)?$ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8080;
}
#所有静态文件由nginx直接读取不经过tomcat或resin
location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
{ expires 15d; }
location ~ .*.(js|css)?$
{ expires 1h; }
}
}

示例2

#定义Nginx运行的用户和用户组
user  www www;
#启动进程,通常设置成和cpu的数量相等
worker_processes  8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
#为每个进程分配cpu,上例中将8个进程分配到8个cpu,当然可以写多个,或者将一个进程分配到多个cpu。
worker_rlimit_nofile 102400;
#这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打
#开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀
#,所以最好与ulimit -n的值保持一致。

#全局错误日志及PID文件
error_log  /usr/local/nginx/logs/error.log; 
#错误日志定义等级,[ debug | info | notice | warn | error | crit ]
pid        /usr/local/nginx/nginx.pid;

#一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀.
#所以建议与ulimit -n的值保持一致。
worker_rlimit_nofile 65535;

#工作模式及连接数上限
events {
    use   epoll;                #epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能
    worker_connections  102400; #单个后台worker process进程的最大并发链接数 (最大连接数=连接数*进程数)
    multi_accept on; #尽可能多的接受请求
}
#设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
    #设定mime类型,类型由mime.type文件定义
    include       mime.types;
    default_type  application/octet-stream;
    #设定日志格式
    access_log    /usr/local/nginx/log/nginx/access.log;
     sendfile      on;
    #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用必须设为 on
    #如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
    #autoindex  on;  #开启目录列表访问,合适下载服务器,默认关闭。
    tcp_nopush on; #防止网络阻塞
    keepalive_timeout 60;
    #keepalive超时时间,客户端到服务器端的连接持续有效时间,当出现对服务器的后,继请求时,keepalive-timeout功能可避免建立或重新建立连接。
    tcp_nodelay   on; #提高数据的实时响应性
   #开启gzip压缩
   gzip on;
    gzip_min_length  1k;
    gzip_buffers     4 16k;
    gzip_http_version 1.1;
    gzip_comp_level 2; #压缩级别大小,最大为9,值越小,压缩后比例越小,CPU处理更快。
    #值越大,消耗CPU比较高。
    gzip_types       text/plain application/x-javascript text/css application/xml;
    gzip_vary on;
    client_max_body_size 10m;      #允许客户端请求的最大单文件字节数
    client_body_buffer_size 128k;  #缓冲区代理缓冲用户端请求的最大字节数,
    proxy_connect_timeout 90;      #nginx跟后端服务器连接超时时间(代理连接超时)
    proxy_send_timeout 90;         #后端服务器数据回传时间(代理发送超时)
    proxy_read_timeout 90;         #连接成功后,后端服务器响应时间(代理接收超时)
    proxy_buffer_size 4k;          #设置代理服务器(nginx)保存用户头信息的缓冲区大小
    proxy_buffers 4 32k;           #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
    proxy_busy_buffers_size 64k;   #高负荷下缓冲大小(proxy_buffers*2)

    #设定请求缓冲
    large_client_header_buffers  4 4k;
    client_header_buffer_size 4k;
    #客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求的头部大小不会超过1k
    #不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE取得。
    open_file_cache max=102400 inactive=20s;
    #这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没被请求后删除缓存。
    open_file_cache_valid 30s;
    #这个是指多长时间检查一次缓存的有效信息。
    open_file_cache_min_uses 1;
    #open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive
    #包含其它配置文件,如自定义的虚拟主机
    include vhosts.conf;
}

示例3

#这里为后端服务器wugk应用集群配置,根据后端实际情况修改即可,tdt_wugk为负载均衡名称,可以任意指定
    #但必须跟vhosts.conf虚拟主机的pass段一致,否则不能转发后端的请求。weight配置权重,在fail_timeout内检查max_fails次数,失败则剔除均衡。
    upstream tdt_wugk {
        server   127.0.0.1:8080 weight=1 max_fails=2 fail_timeout=30s;
        server   127.0.0.1:8081 weight=1 max_fails=2 fail_timeout=30s;
    }
   #虚拟主机配置
    server {
        #侦听80端口
        listen       80;
        #定义使用www.wuguangke.cn访问
        server_name  www.wuguangke.cn;
        #设定本虚拟主机的访问日志
        access_log  logs/access.log  main;
            root   /data/webapps/wugk;  #定义服务器的默认网站根目录位置
        index index.php index.html index.htm;   #定义首页索引文件的名称
        #默认请求
        location ~ /{
          root   /data/www/wugk;      #定义服务器的默认网站根目录位置
          index index.php index.html index.htm;   #定义首页索引文件的名称
          #以下是一些反向代理的配置.
          proxy_next_upstream http_502 http_504 error timeout invalid_header;
          #如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。
          proxy_redirect off;
          #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_pass  http://tdt_wugk;     #请求转向后端定义的均衡模块
       }

        # 定义错误提示页面
            error_page   500 502 503 504 /50x.html;  
            location = /50x.html {
            root   html;
        }
        #配置Nginx动静分离,定义的静态页面直接从Nginx发布目录读取。
        location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
        {
            root /data/www/wugk;
            #expires定义用户浏览器缓存的时间为3天,如果静态页面不常更新,可以设置更长,这样可以节省带宽和缓解服务器的压力。
            expires      3d;
        }
        #PHP脚本请求全部转发到 FastCGI处理. 使用FastCGI默认配置.
        location ~ \.php$ {
            root /root;
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME /data/www/wugk$fastcgi_script_name;
            include fastcgi_params;
        }
        #设定查看Nginx状态的地址
        location /NginxStatus {
            stub_status  on;
        }
     }
}

示例3

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
server {
    listen 80;
    server_name localhost;
    root "/Users/iamwlb/Documents/Workspace/vue/bc-front/dist";

    index index.html index.htm ;

    charset utf-8;

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }
    location ~ /\.ht {
        deny all;
    }
    location ~ /(api|swagger)/ {
	proxy_pass http://127.0.0.1:8000;
    }
    location ~ /upload/ {
        root /root/back/bc-end-dev;#指定图片存放路径 ;
    }
}

Nginx优化

隐藏版本号

http{
    server_tokens off;
}

更nginx默认用户及用户组

创建nginx属主和nginx属组

1
2
$ groupadd nginx
$ useradd nginx -g nginx -s /sbin/nologin -M

更改Nginx配置文件

# 指定Nginx服务的用户和用户组
user nginx nginx;
worker_processes  1;
events
{
    worker_connections  1024;
}

重新加载Nginx

1
2
$ nginx -t
$ nginx -s reload

验证是否生效

1
$ ps aux | grep nginx

配置nginx worker进程个数

  • cpu有多少个核,就有几位数,1代表内核开启,0代表内核关闭
  • worker_processes最多开启8个,8个以上性能就不会再提升了,而且稳定性会变的更低,因此8个进程够用了

两核cpu,开启两个进程

worker_processes 2;
worker_cpu_affinity 01 10;

01表示启用了第一个cpu内核,10表示启用了第二个cpu内核。

两核cpu,开启八个进程

worker_processes 8;
worker_cpu_affinity 01 10 01 10 01 10 01 10;

8核cpu,开启8个进程

worker_processes 8;
worker_cpu_affinity 10000000 01000000 00100000 00010000 00001000 00000100 00000010 00000001;

00000001表示开启第一个cpu内核,00000010表示开启第二个cpu内核,依次类推。

8核cpu,开启2个进程

worker_processes 2;
worker_cpu_affinity 10101010 01010101;

10101010表示开启了第2、4、6、8内核,01010101表示开始了1、3、5、7内核。

nginx事件处理模型优化

根据系统类型不同选择不同的事务处理模型,选择有

use [kqueue|rtsig|epoll|dev/pool|select|poll];
操作系统 事件处理模型
Windows icop
Linux epoll
Freebsd kqueue
Solaris /dev/poll

CentOS配置示例:

events
{
    use epoll;
    worker_connections 1024;
}

调整nginx worker单个进程允许的客户端最大连接数

worker_connections 默认1024,调整为20480。

events
{
    use epoll;
    worker_connections 20480;
}

这个参数是单个进程的最大链接数,实际最大链接数是worker技能书乘以这个数

Max_client = worker_processes * worker_connections

配置nginx worker进程最大打开文件数

worker_rlimit_nofile 65535;

配置参数不是越大越好,最好设为服务器承受的极限点。

开启高效的文件传输模式

http  
{  
    sendfile on;    #开启高效文件传输模式
    tcp_nopush on;  #防止网络阻塞,只有在sendfile开启模式下有效
}
  • sendfile 参数用于开启文件的高效传输模式,该参数实际上是激活了 sendfile() 功能,sendfile()是作用于两个文件描述符之间的数据拷贝函数,这个拷贝操作是在内核之中的,被称为 “零拷贝”,sendfile() 比 read 和 write 函数要高效得多,因为 read 和 write 函数要把数据拷贝到应用层再进行操作
  • tcp_nopush 参数用于激活 Linux 上的 TCP_CORK socket 选项,此选项仅仅当开启 sendfile 时才生效,tcp_nopush 参数可以允许把 http response header 和文件的开始部分放在一个文件里发布,以减少网络报文段的数量

设置连接超时时间

http  
{  
    keepalive_timeout 60s;
    tcp_nodelay on;
    client_header_timeout 10s;
    client_body_timeout 15s;
    send_timeout 15s;
}
参数 说明
keepalive_timeout 设置客户端连接保持会话的超时时间,超过这个时间,服务器会关闭连接
tcp_nodelay 打开tcp_nodelay,在包含keepalive参数才有效
client_header_timeout 设置客户端请求头读取超时时间,如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误
client_body_timeout 设置客户端请求主体读取超时时间。如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误
send_timeout 设置响应客户端的超时时间。这个超过仅限于两个连接之间的时间,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接

上传文件大小限制

server {
        listen       80;
        server_name  localhost;
        client_max_body_size 10M;
}

client_max_body_size这个参数限制了上传文件的大小,默认是1M。

常见问题

惊群问题

惊群效应(thundering herd)是指多进程(多线程)在同时阻塞等待同一个事件的时候(休眠状态),如果等待的这个事件发生,那么他就会唤醒等待的所有进程(或者线程),但是最终却只能有一个进程(线程)获得这个时间的“控制权”,对该事件进行处理,而其他进程(线程)获取“控制权”失败,只能重新进入休眠状态,这种现象和性能浪费就叫做惊群效应。

Nginx 直至 1.11.3 版本开始,修复了惊群问题。

请求的主机头伪造

错误示例:

proxy_set_header Host $http_host;

正确示例:

proxy_set_header Host $host;

参考 Request’s Host header forgery

第三方工具

Gixy

介绍

Gixy是一款用来分析Nginx配置文件的工具。 Gixy的主要目标是防止安全配置错误,并自动进行缺陷检测。
Gixy特性如下:

  • 找出服务器端请求伪造。
  • 验证HTTP拆分。
  • 验证referrer/origin问题。
  • 验证是否正确通过add_header指令重新定义Response Headers。
  • 验证请求的主机头是否伪造。
  • 验证valid_referers是否为空。
  • 验证是否存在多行主机头。

Github

Mac安装Gixy

1
2
3
4
5
### 安装依赖
$ sudo easy_install nose
$ sudo easy_install tornado
### 安装Gixy
$ pip install gixy

CentOS7安装Gixy

1
2
3
4
5
6
### 安装pip
$ yum -y install epel-release
$ yum install python-pip -y
$ pip install --upgrade pip
### 安装Gixy
$ pip install gixy

使用Gixy

1
2
3
4
$ gixy --help
# Gixy默认会检查/etc/nginx/nginx.conf配置文件。
$ gixy
$ gixy project/conf/nginx-dev.conf

常见错误

403 forbidden

错误分析

可能原因有:

  • 启动用户和nginx工作用户不一致
  • 缺少index.html
  • nginx没有web目录操作权限
  • Selinux开启导致

解决办法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 查看nginx的启动用户
$ ps aux | grep "nginx: worker process" | awk '{print $1}'

# 将nginx.config的user改为和启动用户一致
$ vim conf/nginx.conf
##### 修改如下内容 #####
user 	root;
worker_processes  4;
##### 内容结束 #####

# 配置目录权限
$ chmod -R 777 /data
$ chmod -R 777 /data/www/

附录

log_format参数

参数 说明 示例
$remote_addr 客户端地址 211.28.65.253
$remote_user 客户端用户名称
$time_local 访问时间和时区 18/Jul/2012:17:00:01 +0800
$request 请求的URI和HTTP协议 “GET /article-10000.html HTTP/1.1”
$http_host 请求地址,即浏览器中你输入的地址(IP或域名) www.wanglibing.com 192.168.100.100
$status HTTP请求状态 200
$upstream_status upstream状态 200
$body_bytes_sent 发送给客户端文件内容大小 1547
$http_referer url跳转来源 https://www.baidu.com/
$http_user_agent 用户终端浏览器等信息 “Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SV1; GTB7.0; .NET4.0C;
$ssl_protocol SSL协议版本 TLSv1
$ssl_cipher 交换数据中的算法 RC4-SHA
$upstream_addr 后台upstream的地址,即真正提供服务的主机地址 10.10.10.100:80
$request_time 整个请求的总时间 0.205
$upstream_response_time 请求过程中,upstream响应时间 0.002

参考

反向代理

NGINX Content Caching

未分类


Wanglibing
Wanglibing
Engineer,Lifelong learner