二进制安装nginx
准备编译环境
yum install pcre-devel openssl-devel zlib-devel gcc -y
useradd -r -s /sbin/nologin nginx
mkdir -p /data/nginx # 预安装路径
编译
tar xvf nginx-1.18.0.tar.gz -C /usr/local/src/
cd /usr/local/src/nginx-1.18.0
./configure --prefix=/data/nginx --user=nginx --group=nginx
--with-http_ssl_module
--with-http_v2_module
--with-http_realip_module
--with-http_stub_status_module
--with-http_gzip_static_module
--with-pcre
--with-stream
--with-stream_ssl_module
--with-stream_realip_module
make -j 4 && make install
ln -s /data/nginx/sbin/nginx /usr/sbin/ # 软链接
使用systemd启动方式
vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/data/nginx/logs/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# SELinux context. This might happen when running `nginx -t` from the cmdline.
# https://bugzilla.redhat.com/show_bug.cgi?id=1268621
ExecStartPre=/usr/bin/rm -f /data/nginx/logs/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx -c /data/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
[Install]
WantedBy=multi-user.target
启动
systemctl restart nginx
systemctl enable nginx
nginx -V 查看编译参数
nginx -s reload 热加载配置
nginx -t 测试conf文件语法有没有错误
nginx 启动nginx服务
nginx性能优化
nginx.conf
全局配置
worker_processes auto; # 启动进程数,auto当前多少cpu就启动多少个
# ps -eo pid,args,psr查看进程启动在哪个cpu上
worker_cpu_affinity 0001 0010 0100 1000; # cpu亲和性
# 查看进程优先级ps -le |grep nginx,-20-19越大优先级越低
worker_priority -20; # 修改进程优先级
#echo ulimit -n 65535 >>/etc/profile && source /etc/profile
worker_rlimt_nofile 65535; work进程能打开的文件数量上限,设置于ulimt -n的值保持一致,如65535.
事件驱动配置
events {
worker_connections 10240; # 每个work进程能打开的最大并发连接数,如10240,总最大并发数worker_processes*worker_connections
use method; # 并发连接请求的处理方式,默认自动选择最优方法, 如use epoll;
accept_mutex on|off; # 处理新的连接请求方法,on指由各个worker轮流处理新的请求,off指每个新请求的到达都会通知所有worker进程,但只有一共进程获得连接,造成惊群,影响性能,默认值为off,优化为on
multi_accept on|off; # 默认为off,默认为一个worker进程只能一次接收一个新的网络连接,on表示每个worker可以同时接收所有新的网络连接
}
调试和定位问题-全局配置
daemon on|off; 默认on守护进程方式,off前台运行用于调试或者docker环境
master_process on|off; 是否以master/worker模型运行nginx,默认on,当指定off将不启动worker
error_log logs/error.log [level]; 错误日志文件及其级别; 出于调试需要,可设定为debug; 但debug需要编译时使用 --with-debug 才能生效
logs/error.log 记录到文件中
stderr 发生到标准错误,运行为docker时stderr可以采集错误日志
syslog: server-address[,parameter=values] 发生到syslog
memory:size 内存
[level]日志级别: debug/info/notice/warn/error/crit/alter/emerg
nginx模块module
官网地址:http://nginx.org/en/docs/
ngx_http_core_module
http://nginx.org/en/docs/http/ngx_http_core_module.html
在响应报文中将指定的文件扩展名映射至MIME对应的类型
include mime.types;
default_type application/octet-stream; 除了上面指定的类型外,就为默认的MIME类型,浏览器一般会提示下载
types {
text/html html htm shtml;
text/css css;
text/xml xml;
image/gif gif;
image/jpeg jpeg jpg;
}
MIME参考文档:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types
tcp_nodelay on|off; 在keepalived模式下的连接是否启用TCP_NODELAY选项,既Nagle算法当为off时,延迟发送,每发生一次包就需要确定ACK,才发送下一个包。默认为On时,不延迟发送,多个包才确认一次,用于http,server,location
tcp_nopush on|off; 在开启sendfile,on时合并响应头和数据体在一个包中一起发送
sendfile on|off; 是否启用sendfile,在内核中封装报文直接发送,默认off
charset charset|off; 是否在响应报文中的Content-Type显示指定的字符集,默认off不显示
server_tokens on|off|build|string; 是否在响应报文的Server首部显示nginx版本。生产环境一般off,隐藏nginx版本号
server {
listen port|unix:/PATH/TO/SOCKET_FILE|ssl|http2|spdy|backlog=number|rcvbuf=size|sndbuf=size default_server;
}
#default_server设定为默认虚拟主机,无法匹配虚拟主机时使用
#ssl 限制仅能通过ssl连接提供服务
#backlog=number 超过并发连接数后,新请求进入后援队列的长度
#rcvbuf=size 接收缓冲区大小
#sndbuf=size 发送缓冲区大小
注意:
listen port; 监听不同端口
listen ip:port; 监听ip+端口
server_name fqdn; 监听不同主机名
server_name hostname;
虚拟主机的主机名称后可跟多个由空白字符串分隔的字符串
支持*通配任意长度的任意字符server_name *.xx.com www.xx.*
支持~起始的字符做正则表达式模式匹配,性能原因不要用 server_name ~^wwwd+.xx.com$
匹配优先级:精确匹配>左侧*通配符>右侧*通配符>正则表达式>default_server
location
= 对url做精确匹配
^~ 对url最左边做匹配检查,不区大小写
~ 对url做正则匹配,区分大小写
~* 对url做正则匹配,不区分大小写
不带符合 匹配起始于此开头的所有url
转义符,可将.*?等转义为普通符号
匹配优先级:"=" > "^~" > "~"/"~*" > "不带符合"
alias path; 路径别名,文档映射的另一种机制;仅能用于location中
location /test {
alias /web/#访问的是路径/web/index.html
}
location /test {
root /web/ #访问的是路径/web/test/index.html 多出/test
}
location中使用root指令和alias指令的意义不同
root: 给定的路径对应于location中的/url 左侧的/
alias: 给定的路径对应于location中/url 的完整路径
error_page code url; 定义错误页,以指定的响应状态码进行响应,可用位置:http/server/location/if in location
error_page 404 /404.html;
location = /40x.html{
}
error_page 404 =200 /404.html
error_page 500 502 503 504 /50x.html
location = /50x.html{
}
try_files file uri;
try_files file =code;
按顺序检查文件是否存在,返回第一个找到的文件或者文件夹(结尾加斜线表示为文件夹),如果所有文件或文件夹都找不到,i进行一个内部重定向到最后一个参数。只有最后一个参数可以引起一个内部重定向,之前的参数只设置内部uri的指向,最后一个参数回退url且必须存在,否则会出现内部500错误
location /img/ {
try_files $uri /img/default.jpg; # 说明/img/default.jpg 为uri
}
location / {
try_files $uri $uri/index.html $uri.html =404;
}
定义客户端请求相关配置:
keepalive_timeout timeout [header_timeout]; 设定保持连接超时时长,0表示禁止长连接,默认为75s
keepalive_timeout 60 60; 在响应头显示此首部字段
keepalive_requests number; 在一次长连接上所允许请求的资源的最大数量,默认为100
keepalive_disable none|browser; 对哪种浏览器禁止长连接
send_timeout time; 向客户端发送响应报文的超时时长,此处是指两边写操作之间的间隔时长,而非整个响应过程的传输时长
client_max_body_size size; 指定请求报文实体最大值,设为0则不限制。默认1m超过报413错误
client_body_buffer_size size; 用于接收每个客户端请求报文的body部分的缓冲区大小; 默认为16k;超出此大小,其将被暂存到磁盘上的由下面client_body_temp_path指令所定义的位置
client_body_temp_path path [level1][level2][level3]; 设定存储客户端请求报文的body部分的临时存储路径及子目录结构和数量目录名为16进制的数字;用hash之后的值从后往前截取第1、2、3级作为文件名client_body_temp_path /var/tmp/client_body 1 2 2
1 1级目录占1位16进制,既2^4=16个目录0-f
2 2级目录占2位16进制,既2^8=256个目录 00-ff
2 3级目录占2位16进制,既2^8=256个目录 00-ff
上传文件服务器配置生产案例:
location /upload {
client_max_body_size 300m;
client_body_buffer_size 2048k;
client_body_temp_path /var/nginx/temp 1 2 2;
}
文件操作优化的配置:
aio on|off|threads[=pool]; 是否启用aio功能,默认off
directio size|off; 当文件大于等于给定大小时,直接同步写磁盘,而不是写缓存,默认off
例如:
location /video {
sendfile on;
aio on;
directio 8m;
}
对客户端进行限制的相关配置:
limit_rate rate; 限制响应给客户端的传输速率,单位是bytes/second。默认值0表示无限制
limit_except method method 仅用于location限制客户端使用指定的请求方法: GET, HEAD, POST, PUT, DELETE,MKCOL, COPY, MOVE, OPTIONS, PROPFIND, PROPPATCH, LOCK, UNLOCK, or PATCH
limit_except GET {
allow 192.168.1.0/24;
deny all;
}
除了GET和HEAD之外其它方法仅允许192.168.1.0/24网段主机使用
open_file_cache off;
open_file_cache max=N [inactive=time];
max=N:可缓存的缓存项上限;达到上限后会使用LRU算法实现管理
inactive=time:缓存项的非活动时长,在此处指定的时长内未被命中的或命中的次数少于open_file_cache_min_uses指令所指定的缓存项即为非活动项,将被删除
nginx可以缓存以下三种信息:
1、文件元数据:文件的描述符、文件大小和最近一次修改时间
2、打开的目录结构
3、没有找到的或者没有权限访问的文件的相关信息
open_file_cache_errors on|off; 是否缓存查找时发生错误的文件类信息,默认值off;
open_file_cache_min_uses number; open_file_cache指令的inactive参数指定的时长内,至少被命中此处指定的次数方可被归类为活动项,默认值为1;
open_file_cache_valid time; 缓存项有效性的检查频率,默认值为60s
ngx_http_index_module
index file; 指定默认网页文件
ngx_http_access_module
可实现基于ip的访问控制功能,用于http、server、location、limit_except。自上而下检查,一旦匹配,将生效,条件严格的置前
allow address|CIDR|unix:|all; 允许
deny address|CIDR|unix:|all; 拒绝
例如:先允许小部分,再拒绝大部分
location /about {
root /data/nginx/html/pc;
index index.html;
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.0.0/16;
allow 2001:000d::/32;
deny all;
}
ngx_http_auth_basic_module
实现基于用户的访问控制,使用basic机制进行用户认证
auth_basic string|off;
auth_basic_user_file file;
location /admin/ {
auth_basic "admin admin";
auth_basic_user_file /etc/nginx/.nginxuser
}
用户口令文件:
1、明文文本:格式name:password:comment
2、加密文本:由htpasswd命令实现httpd-tools所提供
ngx_http_stub_status_module
用于输出nginx的基本状态信息
Active connections: 291
server accepts handled requests #下面分别对应accepts handled requests
16630948 16630948 31070465
Reading: 6 Writing: 179 Waiting: 106
Active connections: 当前状态,活动状态的连接数
accepts: 已经接受的客户端请求总数
handled: 已处理完成的客户端请求总数,一般和accepts相同,除非拒绝
requests: 客户端发来的总的请求数
Reading: 当前状态,正在读取客户端请求报文首部的连接的连接数
Writing: 当前状态,正在向客户端发送响应报文过程中的连接数
Waiting: 当前状态,正在等待客户端发出请求的空闲连接数
ngx_http_log_module
指定日志格式记录请求
log_format name string ...; # string可以使用nginx核心模块及其它模块内嵌的变量
access_log off; #禁止访问日志
access_log path [format[buffer=size][gzip[=level]][flush=time][if=conditon]];
访问日志文件路径,格式及相关的缓冲配置buffer=size flush=time
http{
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 logs/access.log main;
}
缓存各日志文件相关的元数据信息
open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
max: 缓存的最大文件描述符数量
min_uses: 在inactive指定的时长内访问大于等于此值方可被当作活动项
inactive: 非活动时长
valid: 验证缓存中各缓存项是否为活动项的时间间隔
第三方模块
第三方模块是对nginx的功能扩展,第三方模块需要在编译安装nginx的时候使用参数--add-module=PATH指定路径添加。
开源echo模块
编译第三方模块进去
yum install pcre-devel openssl-devel zlib-devel gcc git -y
useradd -r -s /sbin/nologin nginx
git clone https://github.com/openresty/echo-nginx-module.git /usr/local/src/
mkdir /data/nginx -p
./configure --prefix=/data/nginx --user=nginx --group=nginx
--with-http_ssl_module
--with-http_v2_module
--with-http_realip_module
--with-http_stub_status_module
--with-http_gzip_static_module
--with-pcre
--with-stream
--with-stream_ssl_module
--with-stream_realip_module
--add-module=/usr/local/src/echo-nginx-module
加上:
location /echo {
echo "hello world";
default_type text/html;
}
启动:
/data/nginx/sbin/nginx
浏览器访问Ip/echo,会显示出hello world
nginx变量使用
nginx的变量可以在配置文件中引用,作为功能判断或者日志等场景使用,变量可以分为内置变量和自定义变量,内置是由nginx模块自带,通过变量可以获取到众多的与客户端访问相关的值
常见内置变量
$remote_addr; 存放客户端的地址,注意是客户端的公网IP
$args; 变量中存放了URL中的指令如http://www.xx.com/blog/list?id=20&name=xxx,id=20&name=xxx就是$args
$document_root; 保存了针对当前资源的请求的系统根目录,如/data/nginx/html
关于favicon.ico
favicon.ico是浏览器收藏网站时显示的图标,当使用浏览器访问页面时,浏览器会自己主动发起请求获取页面的favicon.ico文件,但是文件不存在时,服务器会记录404,浏览器也会显示404报错
解决方案:
-
服务器不记录此访问日志
location = /favicon.ico {
log_not_found off; 文件没发现事件不记录error_log
access_log off; 不记录access_log
}
-
将图标保存到指定目录访问
location ~ ^/favicon.ico$ {
root html;
}