本文不是对帮助文档的翻译,而是把 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 |
# Ubuntu apt-cache search nginx apt-cache show PACKAGE_NAME apt-get install PACKAGE_NAME # CentOS yum install epel-release yum search nginx yum info PACKAGE_NAME yum install PACKAGE_NAME # 设置 yum 源,需替换OS和OSRELEASE,如centos/7/ # vi /etc/yum.repos.d/nginx.repo [nginx] name=nginx repo baseurl=http://nginx.org/packages/OS/OSRELEASE/$basearch/ gpgcheck=0 enabled=1 # Debian 系设置安装源 sudo apt-key add nginx_signing.key # vi /etc/apt/sources.list # Debian codename为 jessie,stretch 等 deb http://nginx.org/packages/debian/ codename nginx deb-src http://nginx.org/packages/debian/ codename nginx # Ubuntu codename 为trusty, xenial或zesty等 deb http://nginx.org/packages/ubuntu/ codename nginx deb-src http://nginx.org/packages/ubuntu/ codename 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 |
# 安装依赖 # gcc yum groupinstall "Development Tools" apt-get install build-essentials # PCRE库 yum install pcre pcre-devel # 或yum install pcre* apt-get install libpcre3 libpcre3-dev # zlib库 yum install zlib zlib-devel apt-get install zlib1g zlib1g-dev # OpenSSL yum install openssl openssl-devel apt-get install openssl libssl-dev # 下载 mkdir src && cd src wget http://nginx.org/download/nginx-1.16.0.tar.gz tar zxf nginx-1.16.0.tar.gz cd nginx-1.16.0/ # ./configure --help查看选项 # ./configure --conf-path=/etc/nginx/nginx.conf 使用配置文件 ./configure # 报错详细信息查看:objs/autoconf.err # 编译时包含所有模块 ./configure --user=www-data --group=www-data --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_perl_module --with-http_degradation_module --with-http_gunzip_module --with-http_auth_request_module make && make install |
默认安装位置:/usr/local/nginx
1 2 3 4 5 6 7 8 9 10 11 12 |
nginx -s stop nginx -s quit nginx -s reopen nginx -s reload # 重载服务,推荐,不推荐使用 systemctl 的重启命令 killall nginx nginx -t # 重载服务前检查配置有无语法错误 nginx -t -c xxx/test.conf nginx -V nginx -g "xx"; # 添加配置到配置文件中 # 添加启动项 update-rc.d -f nginx defaults chkconfig nginx on |
配置
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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
# 配置文件地址 /usr/local/nginx/conf/nginx.conf # 编译文件 /etc/nginx/nginx.conf # 包管理器安装 # 配置项 user nginx nginx; # 用户及组 worker_processes 4; # worker 进程数,通常设置为与 CPU 核数相同 include other_settings.conf; # 引入其它配置文件,支持通配符,如 sites/*.conf error_log logs/error.log; # 错误日志 pid logs/nginx.pid; # pid 文件 # Core模块指令 daemon on|off; # 开启或关闭守护进程模式 debug_points stop|abort; # 缺省值None,启用 Nginx 的调试点 env MY_VARIABLE; env MY_VARIABLE=my_value; # 定义或重定义环境变量 error_log /file/path level; # 缺省值logs/error.log error,日志级别debug, info, notice, warn, error, crit, alert, emerg lock_file logs/nginx.lock; # 在编译时定义 load_module modules/ngx_http_geoip_module.so; # 缺省值 None,在运行时动态加载编译模块 log_not_found on|off; # 404错误日志启用或禁用 master_process on|off; # 缺省值为on,开启为多进程,不开启仅单进程 pcre_jit on|off; # 开启或关闭正则表达式JIT编译,如需启用在nginx编译时需添加--with-pcre-jit,PCRE 需使用--enable-jit构建 pid logs/nginx.pid; # 默认值在编译时定义,Nginx 守护进程的pid文件 ssl_engine enginename; # 缺省值 None,运行openssl engine -t查看可用的硬件SSL加速器 thread_pool name threads=number [max_queue=number]; # 缺省值thread_pool default threads=32 max_queue=65536;定义 aio 指定中使用的线程池引用,来异步提供大文件的访问 timer_resolution 100ms; # 缺省值 None,定义gettimeofday()的调用时间间隔来同步内部时钟 user username groupname;|user username; # Nginx主进程的用户和用户组,不建议使用 root,缺省值在编译时定义 worker_cpu_affinity 1000 0100 0010 0001;|worker_cpu_affinity 10 10 01 01;|worker_cpu_affinity auto; # 缺省值None,与worker_processes一起使用,影响工作进程的 CPU 核数,后面的数字几核则为几位数,1在第几位则表示第几核 worker_priority 0; # 定义 worker 进程的优先级,最高为-20,最低为19,核心进程的优先级为-5,所以不建议设置为小于-5 worker_processes 4; # 缺省值为1,一个CPU至少一个worker 进程,推荐设置为 auto 来让Nginx自行选择 worker_rlimit_nofile 10000; # 缺省值为 None,定义worker进程可同步使用的文件数 working_directory /usr/local/nginx/; # worker 进程的工作目录,默认为编译时的prefix 值 worker_aio_requests 10000; # 如果使用带有 epoll 连接处理方法的aio, 用于设置单个worker进程的异步I/O运算最大值 worker_shutdown_timeout 5s; # 设置worker 进程优雅关闭的时间,如超过,则强制关闭 # events 模块,需放在 events版块下 events { worker_connections 1024; use epoll; xxx } accept_mutex on|off; # 1.11.3 版本开始默认值为off,此前默认值为 on,开启或关闭使用互斥打开监听套接字 accept_mutex_delay 500ms; # 默认值500毫秒,定义 worker 进程再次获取资源等待的时间,若accept_mutex为 false 则不使用该值 debug_connection 172.63.155.21;|debug_connection 172.63.155.0/24; # 默认值为 None,对匹配的 IP 或 IP 块用户记录详尽的日志,调试信息存储在error_log所指定的文件中,使用该选项需要在 Nginx编译时添加--debug multi_accept on|off; # 默认值为 off,定义 Nginx 是否一次性从监听队列中接受所有连接 use /dev/poll|epoll|eventport|kqueue|rtsig|select; # 默认值在编译时定义,选择一种可用的event模型,Nginx 会自动选择合适的值,所以一般无需设置 worker_connections 1024; # 默认值为 None,定义 worker 进程可能同步处理的连接数 # configuration 模块 include /file/path.conf; # 使用 include 指令 include sites/*.conf; # http模块 # 示例 http { # 在 http 级别启用gzip压缩 gzip on; server { server_name localhost; listen 80; # 在这个阶段,gzip还处于on的状态 location /downloads/ { gzip off; # 这条指令仅用于/downloads/ 中的文件 } } } # http 模块指令 listen [address][:port] [additional options]; #server 上下文,指定监听的 IP 地址和/或端口,端口默认为http 服务的80,或 https 服务的443;其它选项有default_server:指定这个server块是对指定IP和端口请求的默认网站;ssl:指定网站应使用SSL提供服务;http2:在http2模块存在时启用对HTTP2协议的支持;proxy_protocol:启用所有接受该端口所有连接的代理协议;其它与绑定和监听系统调用的选项:backlog=num, rcvbuf=size, sndbuf=size, accept_filter=filter, deferred, setfib=number, fastopen=number, ipv6only=on|off, reuseport, so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt], bind # 也可使用 Unix 套接字:listen unix:/tmp/nginx.sock; server_name hostname1 [hostname2...]; # server 上下文,server_name _ ""; 空字符串捕获所有没带 Host 头的请求,_ 为dummy主机名 server_name_in_redirect on|off # http, server和location上下文,内部重定向,设为 on 使用server_name中指定的第一个主机名,设为 off 使用请求头中的Host server_names_hash_max_size # http上下文,默认值512,服务器名哈希表的最大尺寸 server_names_hash_bucket_size # http上下文,服务器名哈希表的bucket尺寸,根据处理器缓存规格默认值为32、64或128 port_in_redirect on|off # http, server和location上下文,默认值为 on,若为 off则Nginx 的重定向为相对路径 absolute_redirect on|off # http, server和location上下文,默认值为 on,指定是否对重写向URL 添加端口号, tcp_nodelay on|off # http, server和location上下文, 默认值为 on,对keep-alive连接启用或禁用TCP_NODELAY套接字选项 tcp_nopush on|off # http, server和location上下文, 默认值为 off,启用或禁用TCP_NOPUSH(FreeBSD)或TCP_CORK(Linux)套接字选项,仅在启用sendfile时使用 sendfile on|off # http, server和location上下文, 默认值为 off,若启用,Nginx 会使用sendfile处理文件传输,在 Linux 中使用sendfile会自动禁用异步IO sendfile_max_chunk # http, server上下文,默认值为0,指定每次调用sendfile的最大数据大小 send_lowat # http, server上下文,默认值为0,仅在FreeBSD中用于使用针对TCP套接字的SO_SNDLOWAT标记,定义缓冲中的最小字节数 reset_timedout_connection on|off # http, server和location上下文, 默认值为 off,在客户端连接超时的时候,根据该指定决定是否清除内存中的关联信息 # 路径和文档 root # http, server, location和if上下文,默认值为html,可接受变量 alias # location上下文,可接收变量,对指定的location获取不同的路径 error_page code1 [code2...] [=replacement code] [=@block | URI] # http, server, location和if上下文,可接收变量 # 例:error_page 500 501 502 503 504 /server_error.html; error_page 404 @notfound; if_modified_since off|exact|before #http, server和location上下文,默认值 exact,定义Nginx如何处理If-Modified-Since HTTP头 # off忽略If-Modified-Since头;exact:在头中指定的日期和时间与文件修改时间完全相同时返回304 Not Modified,之前或之后正常返回200;before: 在头中指定的日期和时间为文件修改时间之前时返回304Not Modified index # http, server, location上下文,可接收变量,没指定文件时Nginx默认显示的页面,可指定多个值,默认值为index.html recursive_error_pages on|off # http, server, location上下文,默认值为off,在error_page指定页面报错时反复使用 try_files # server, location上下文,可接收变量,尝试对不同指定文件提供服务,如都不存在,则跳到对应的location代码块 # 示例 location / { try_files $uri $uri.html $uri.xml @proxy; } location @proxy { proxy_pass 127.0.0.1:8080; } # 客户端请求 keepalive_requests # http, server和location上下文,默认值100,单个keep-alive连接可服务的最大连接数 keepalive_timeout # http, server和location上下文,默认值75,在关闭keep-alive前服务端等待时间,第二个可选值可以让客户端浏览器自己在超过一定时间后关闭连接,但 IE等浏览器实际上会忽略 keepalive_disable # http, server和location上下文,默认值msie6,选择对浏览器关闭keepalive功能 send_timeout # http, server和location上下文,默认值60,Nginx关闭不活跃连接的时间(秒) client_body_in_file_only on|clean|off # http, server和location上下文,默认值off,是否将 HTTP 请求体存储在磁盘的实际文件中;off为不存储,clean为存储并在请求完成后删除文件,on为存储且不删除 client_body_in_single_buffer on|off # http, server和location上下文,默认值 off,定义Nginx中是否将请求体存储在内存的单个buffer中 client_body_buffer_size # http, server和location上下文,默认值根据计算机结构为8k或16k,指定存储客户端请求体缓冲大小 client_body_temp_path path [level1] [level2] [level3] # http, server和location上下文,默认值client_body_temp,可选项中的值表示文件夹由几个数字组成,最多可有三级目录 client_body_timeout # http, server和location上下文,默认值60,定义读取客户端请求体不活跃超时的时间,如达到延时时间则返回408 Request timeout client_header_buffer_size # http, server和location上下文,默认值1k,定义Nginx中为请求头分配的缓冲大小 client_header_timeout # http, server和location上下文,默认值60,定义读取客户端请求头超时的时间,如达到延时时间则返回408 Request timeout client_max_body_size # http, server和location上下文,默认值1m,客户端请求体的最大大小,超过时返回413 Request entity too large large_client_header_buffers # http, server和location上下文,默认值4*8KB,定义用于存储客户端请求缓冲的最大数量和大小,如果请求头大于单个缓冲返回414 Request URI too large,如果其它头大于单个缓冲返回400 Bad request lingering_time # http, server和location上下文,默认值30秒,请求体大于max_client_body_size时会返回413 Request entity too large错误,这个指令用于定义在发送错误后等待多长时间来关闭连接 lingering_timeout # http, server和location上下文,默认值5秒,在关闭客户端连接之前两次读运算之前的等待时间 lingering_close on|off|always # http, server和location上下文,默认值为 on,控制Nginx关闭客户端连接的方式:off在接收所有请求数据之后立即关闭连接,on允许在必要时处理额外数据的等待时间,always会保持等待来关闭连接。等待时间由lingering_timeout指令定义 ignore_invalid_headers on|off # http, server上下文,如禁用这个指令,默认值为 on,如果请求头有问题则返回400 Bad Request错误 chunked_transfer_encoding on|off # http, server和location上下文,默认值为 on,启用或禁用HTTP 1.1请求的分块传输编码 max_ranges # http, server和location上下文,在客户端请求部分文件内容时Nginx批回的字节范围,如未设置则无限制,如设置为0,则禁用字节范围功能 # MIME类型 # 单位 k或K: KB m或M: MB g或G: GB ms: 毫秒 s: 秒 # 默认为秒,可同时使用:1m30s m: 分钟 h: 小时 d: 天 w: 周 M: 月(30天) y: 年(365天) |
配置包含空格等可使用单引号、双引号包裹或前置反斜杠 \
Nginx 标准配置文件
nginx.conf | 应用基础配置文件 |
---|---|
mime.types | 文件扩展名列表及其关联MIME类型 |
fastcgi.conf | FastCGI相关配置 |
proxy.conf | 代理相关配置 |
sites.conf | 由 Nginx 提供服务的网站配置文件,也称为虚拟主机。推荐为每个域名创建一个单独的文件。 |
Web 服务负载测试
httperf
下载地址:https://github.com/httperf/httperf
1 2 3 4 5 6 7 |
sudo apt-get install autoconf libtool git clone https://github.com/httperf/httperf.git cd httperf/ sudo autoreconf -i sudo ./configure sudo make && sudo make install httperf --server 192.168.1.10 --port 80 --uri /index.html --rate 300 --num-conn 30000 --num-call 1 --timeout 5 |
Autobench
下载地址:http://www.xenoclast.org/autobench/
要求先安装 httperf,可导出数据文件
1 2 3 4 5 6 |
wget http://www.xenoclast.org/autobench/downloads/autobench-2.1.2.tar.gz tar -zxvf autobench-2.1.2.tar.gz cd autobench-2.1.2/ sudo make & sudo make install autobench --single_host --host1 192.168.1.10 --uri1 /index.html --quiet --low_rate 20 --high_rate 200 --rate_step 20 --num_call 10 --num_conn 5000 --timeout 5 --file results.tsv |
OpenWebLoad
下载地址:http://openwebload.sourceforge.net/
1 |
openload example.com/index.html 10 |
优雅升级 Nginx
- 将/usr/local/nginx/sbin/nginx替换为新文件
- 查找 pid:ps x | grep nginx | grep master,假设为1234
- kill -USR2 1234:通过重命名.pid 文件及运行新的二进制来启动升级
- kill -WINCH 1234:优雅关闭旧的 worker 进程
- kill -QUIT 1234:向旧的 master 进程发送 QUIT 信号
扩展
1、Nginx打点服务使用模块
1 2 3 4 |
location = /_.gif { empty_gif; error_page 405 =200 $request_uri; } |
2、为网站设置密码保护
如无需针对浏览器设置限制则可直接在 auth_basic后写入提示文本,下例中不对微信浏览器设限的原因是在微信内无法显示弹窗,会直接报401
1 2 3 4 5 6 7 8 9 10 11 12 13 |
map $http_user_agent $authentication { default "Please enter Password:"; "~* MicroMessenger" "off"; # 假设对微信浏览器不设限 } server { # ... location / { auth_basic $authentication; auth_basic_user_file /etc/nginx/.htpasswd; # ... } } |
持续补充中…