Nginx学习
nginx的模块类别
核心模块
标准http模块
可选的http模块
邮件模块
第三方扩展模块
安装方法:
编译安装 yum -y groupinstall "Development Tools" "Server Platform Development" 需要先安装编译环境
rpm包安装
Nginx的配置文件
main配置段
http{ http段
}
mail{ 现在无需关心
}
# 开头的都是注释
配置参数需要以分号结尾(否则语法错误),语法格式:
参数名 值1 [值2...];
还支持使用变量
模块内置变量
用户自定义变量 set var_name value 来定义
Nginx基本核心配置的类别
用于调试、定位问题的配置项
正常运行的必备配置
优化性能的配置
事件类的配置
master进程是root身份运行
worker进程应该以普通用户身份运行:一般nginx用户:nginx组
http的方法:GET/HEAD/POST/PUT/DELETE/OPTIONS/TRACE
master主进程可以完成 平滑升级
编译安装
yum install gcc openssl-devel pcre-devel zlib-devel # groupadd -r nginx # useradd -r -g nginx -s /bin/false -M nginx ./configure \ --prefix=/usr \ --sbin-path=/usr/sbin/nginx \ --conf-path=/etc/nginx/nginx.conf \ --error-log-path=/var/log/nginx/error.log \ --http-log-path=/var/log/nginx/access.log \ --pid-path=/var/run/nginx/nginx.pid \ --lock-path=/var/lock/nginx.lock \ --user=nginx \ --group=nginx \ --with-http_ssl_module \ --with-http_flv_module \ --with-http_stub_status_module \ --with-http_gzip_static_module \ --http-client-body-temp-path=/var/tmp/nginx/client/ \ --http-proxy-temp-path=/var/tmp/nginx/proxy/ \ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \ --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \ --http-scgi-temp-path=/var/tmp/nginx/scgi \ --with-pcre /usr/html make && make install
服务脚本
/etc/rc.d/init.d/nginx 脚本 #!/bin/sh # # nginx - this script starts and stops the nginx daemon # # chkconfig: - 85 15 # description: Nginx is an HTTP(S) server, HTTP(S) reverse \ # proxy and IMAP/POP3 proxy server # processname: nginx # config: /etc/nginx/nginx.conf # config: /etc/sysconfig/nginx # pidfile: /var/run/nginx.pid # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network # Check that networking is up. [ "$NETWORKING" = "no" ] && exit 0 nginx="/usr/sbin/nginx" prog=$(basename $nginx) NGINX_CONF_FILE="/etc/nginx/nginx.conf" [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx lockfile=/var/lock/subsys/nginx make_dirs() { # make required directories user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -` options=`$nginx -V 2>&1 | grep 'configure arguments:'` for opt in $options; do if [ `echo $opt | grep '.*-temp-path'` ]; then value=`echo $opt | cut -d "=" -f 2` if [ ! -d "$value" ]; then # echo "creating" $value mkdir -p $value && chown -R $user $value fi fi done } start() { [ -x $nginx ] || exit 5 [ -f $NGINX_CONF_FILE ] || exit 6 make_dirs echo -n $"Starting $prog: " daemon $nginx -c $NGINX_CONF_FILE retval=$? echo [ $retval -eq 0 ] && touch $lockfile return $retval } stop() { echo -n $"Stopping $prog: " killproc $prog -QUIT retval=$? echo [ $retval -eq 0 ] && rm -f $lockfile return $retval } restart() { configtest || return $? stop sleep 1 start } reload() { configtest || return $? echo -n $"Reloading $prog: " killproc $nginx -HUP RETVAL=$? echo } force_reload() { restart } configtest() { $nginx -t -c $NGINX_CONF_FILE } rh_status() { status $prog } rh_status_q() { rh_status >/dev/null 2>&1 } case "$1" in start) rh_status_q && exit 0 $1 ;; stop) rh_status_q || exit 0 $1 ;; restart|configtest) $1 ;; reload) rh_status_q || exit 7 $1 ;; force-reload) force_reload ;; status) rh_status ;; condrestart|try-restart) rh_status_q || exit 0 ;; *) echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}" exit 2 esac
添加权限 chmod +x 脚本文件
加到服务列表中 chkconfig --add nginx
配置文件
正常运行的必备配置: 没有的话就以编译的时候为准
1. user username [groupname];指定运行worker进程的用户和组
以那个用户身份运行,以在configure指定的用户为准
2.pid /path/to/pid_filename;
指定nginx的pid文件
3.worker_rlimit_nofile #;
指定一个worker进程所能够打开的句柄数
4.worker_rlimit_sigpending #;
设定每个用户能够发往worker进程的信号的数量
优化性能相关的配置
1.worker_procrsses #; 每个work进程都是单线程的
work进程的个数, 通常其数值应该为cpu的物理核心数减1
2.worker_cpu_affinity cpumask ....; 可以避免做CPU切换
0000 这个CPU掩码
0001
0010
0100
1000
对应位上使用cpu,要做单独绑定
work_procrsses 6 6个线程绑定到6个CPU上
worker_cpu_affinity 00000001 00000010 00000100 00001000
00010000 00100000
但是并不能保证其他进程在这些CPU上运行
3.ssl_engine device;
在存在ssl硬件加速器的服务器上,指定所使用的ssl硬件加速设备
这样就可以在硬件上使用加密
4.timer_resolution t
每次内核事件调用返回时,都会使用gettimeday()系统调用来更新nginx缓存时钟;而早期代价大
timer_resolution用于定义每隔多久才会由gettimeday()更新一次缓存时钟;
x86-64系统上,gettimeday()代价已经很小,可以忽略此配置
5.worker_priority nice;
-20到19之间的值,值越小越优先调用
跟事件相关的配置 event里面的
1.accept_mutex [on|off]
是否打开nginx的负载均衡锁;此锁能够让多个worker进行轮流地、序列化地与新的客户端建立连接
而通常当一个worker进程的负载达到其上限的7/8,master就尽可能不将请求调度至此worker
如果不调度 可能会使work进程响应不均衡 默认打开
但是调度就会有代价
2.lock_file /path/to/lock_file; 这就是定义负载均衡的锁文件的
锁文件
3.accept_mutex_delay #ms 默认500ms
使用accept锁以后,只有一个worker能取得锁,一个worker进程为取得accept锁的等待时长,
即用户建立等待的时间,如果某worker进程在某次试图取得锁时失败了,至少要等待#ms才能在一次请求锁
4.multi_accept on|off
是否允许一次性地响应多个用户请求,默认为off
5.use [epoll|rtsig|select|poll]
指定使用那种模型,建议让nginx自动选择
6.worker_connections #
每个worker能够并发响应的最大请求数,如果为代理服务器的话,
worker_rlimit_nofile=worker_commections*2
用于调试/定位问题:只调试nginx时使用(有问题的时候使用)
1.daemon [on|off];
关闭提供守护进程的模式,是否让nignx运行于后台;调试时应该为off,
使得所有信息直接输出在控制台,默认为on
2.master_process on|off
是否以master/worker模式运行nginx默认为on,调试时可以设置为off以方便追踪
只启动一个work进程
3.error_log /path/to/error_log level
错误日志文件及其级别,调试时可以使用debug级别,但要求在编译时必须使用
--with-debug启用debug功能,默认通常为error级别
nginx的http web功能
必须使用虚拟机来配置站点:每个虚拟主机使用一个server{}段来配置
server{
}
非虚拟主机的配置或公共选项,需要定义在server之外,http之内
http{
directive value;
....
server{
}
server{
}
......
}
1.server{}
定义一个虚拟主机:nginx支持使用基于主机名或IP的虚拟主机
2.listen
listen address[:port]
listen port
listen unix:socket
default_server:定义此server为http中默认的server;如果所有的server中没有任何一个listen使用此参数,
那么第一个server即为默认server
rcvbuf=SIZE:接收缓存大小
sndbuf=SIZE: 发送缓存大小
ssl:https server:必须以ssl连接
3.server_name [...];
server_name可以跟多个主机名,名称可以使用通配符和正则表达式(通常以~开头)
当nginx收到一个请求时,会取出其首部的server的值,而后跟众server_name进行比较:比较方式
(1) 先做精确匹配
(2) 左侧通配符匹配
(3) 右侧通配符匹配
(4) 正则表达式匹配
4.server_name_hash_bucket_size 32|64|128
为了实现快速主机查找,nginx使用hash表来保存主机名
5.location [ =|~|~*|^~] uri { ... } 两种使用格式
location @name { ... }
功能:允许根据用户请求的URI来匹配指定的各location以进行访问配置;匹配到时,将被location块中的配置所处理
没有则表示 以这个路径开头
=:精确匹配
~:正则表达式模式匹配,匹配时区分字符大小写
~*:正则表达式模式匹配,匹配时忽略字符大小写
^~:只需要前半部分与uri匹配即可,不检查正则表达式
匹配优先级:
字符字面量最精确匹配、正则表达式检索(有多个时,由第一个匹配到的所处理),按字符字面量
文件路径定义
1.root path 默认是html 可以定义在多个上下文中
设置web资源路径,用于指定请求的根文档目录,从根(第一个/)开始匹配 而不包括后面的
root:root/URI
2.alias path
指定路径别名,只能用于location中,从最后一个/开始匹配
alias:alias/
3.index file....
定义默认页面,可以跟多个值,自左向右匹配
4.error_page code ... [=[response]] uri
当对于某个请求发回错误时,如果匹配上了error_page指令中设定的code,则从定向至新的新URI中
错误页面重定向
5.try_files path1 [path2...] uri; uri必须存在
自左向右尝试读取有path所指定路径,在第一找到即停止并返回,如果所有path均不存在,则返回最后一个uri
location ~* ^/document/(.*)${
root /www/htdocs
try_files $uri /docu/$1 /temp.html;
}
一个location要么有root 要么有alias 或者全局有该定义
网络连接相关的设置
1.keepalive_timeout time;
保持连接的超时时长,默认为75s
2.keepalive_requests n
在一次长连接上允许承载的最大请求数
3.keepalive_disable [msie6|safari |none]
对指定的浏览器禁止使用长连接
4.tcp_nodelay on|off 默认on 否则影响keepalive性能
对keepalive连接是否使用tcp_nodelay选项
5.client_header_timeout time 默认60s
读取http请求首部的超时时长
6.client_body_timeout time 默认60s
读取http请求包体的超时时间
7.save_timeout time
发送响应的超时时长
对客户端请求的限制:
1.limit_except method ...{ ... }
指定范围之外的其他方法的访问控制,只能用于location中
limit_except GET{
allow 172.160.0.0/16; 只允许这个网段 其他的都拒绝
deny all;
}
2.client_max_body_size size
http请求包体的最大值,常用于限定客户端所能够请求的最大包体,根据请求首部中的Content-Length来检查
以避免无用的传输(可以用于限定文件上传的大小)
3.limit_rate speed
限制客户端每秒传输的字节数,默认为0,表示没有限制 可以有单位 默认是字节
4.limit_rate_after time
nginx向客户端发送响应报文时,如果时长超过了此处指定的时长,则后续的发送过程开始限速
由limit_rate 来限速 通常用于下载站点
文件操作的优化
1.sendfile on|off
是否启用sendfile功能
2.aio on|off
是否启用aio功能
3.open_file_cache max=N [incative=time]| off
是否打开文件缓存功能
max: 用于指定缓存条目的最大值,允许打开的缓存条目最大数,当满两类以后将根据LRU(最近最少使用)算法
进行置换
inactive: 某缓存条目在指定时长内没有被访问过时,将自动被删除;通常默认为60s off表示关闭
缓存的信息包括: 并没有缓存文件中的实际数据 而是元数据
文件句柄、文件大小和上次修改时间(特别有用)
已经打开的目录结构
没有找到或没有访问权限的信息(要不要缓存由下一个参数决定)
4.open_file_cache_errors on|off
是否缓存文件找不到或没有权限访问等相关信息
5.open_file_cache_valid time
多长时间检查一次缓存中的条目是否超出非活动时长,默认为60s
6.open_file_cache_min_use # 提升缓存时长
在inactive指定的时长内被访问超过此处指定的次数时,才不会被删除
对客户端请求的特殊处理
1.ignore_invalid_headers on|off
是否忽略不合法的http首部,默认为on,off意味着请求首部中出现不合规的首部将拒绝响应,
只能用于server和http
2.log_not_found on|off
用户访问的文件不存在时,是否将其记录到错误日志中
3.resolver address:
指定nginx使用的dns服务器地址
4.resolve timeout
指定DNS解析超时时长,默认为30s
5.server_tokens on|off
是否在错误页面中显示nginx的版本号 前提是没有做错误重定向
http核心模块的内置变量:
$uri:当前请求的uri,不带参数
$request_uri:请求的uri,带完整参数
$host:http请求报文中host首部;如果请求中没有host首部,则以处理此请求的主机的主机名代替
$hostname:nginx服务运行所在主机的主机名
$remote_addr:客户端IP
$remote_port: 客户端port
$remote_user:使用用户认证时客户端用户输入的用户名
$request_filename:用户请求中的URI经过本地root或alias转换后映射的本地的文件路径
$request_method:请求方法
$server_addr:服务器地址
$server_name: 服务器名称
$server_port:服务器端口
$server_protocol:服务器向客户端发送响应时的协议,如http/1.1/http/1.0
$scheme:在请求中使用的scheme 映射协议本身的协议 https 或者 http
$http_HEADER:匹配请求报文中指定的HEADER, 例如:$http_host匹配请求报文中的host首部 万能的
$sent_http_HEADER:匹配响应报文中指定的HERDER,例如$http_content_type匹配相应报文中的content-type首部
$document_root:当前请求映射到的root配置
配置使用nginx
1.nginx虚拟主机
server{
listen
server_name
root
}
2.访问控制access模块 默认已经编译进来了
allow
deny
至上而下依次认证,默认为通过
curl -I www.a.com 测试
3.基于用户认证(基于用户做访问控制)
location /admin/ {
root
auth_basic "admin area" 标题
auth_basic_user_file "/etc/nginx/.htpasswd.conf" 密码的存放位置(htpasswd -h)
}
使用htpasswd创建密码 htpasswd -c -m /etc/nginx/.htpasswd.conf tom
4.建立下载站点时用到 autoindex下载列表 HttpAutoindex模块
location /download/{ 会列出下面的文件
root /data/download;
autoindex on;
}
5.防盗链 2步
(1)定义和规定额引用
valid_referers none |blocked |server_names|string ...
(2)判断不合规的引用
if ($invaild_referer) {
rewrite ^/.*$ http://www.a.com/403.html
}
6.URL rewrite 地址重写
rewrite regex replacement [flag];
location / {
root /www/a.org;
rewrite ^/imgages/(.*)$ /imgs/$1
}
flag:标志位
last:一旦被当前规则匹配并重写后立即停止检查后续的其他rewrite的规则,而后通过重写后的规则重新发起请求
break:一旦被当前规则匹配并重写后立即停止检查后续的其他rewrite的规则,而后继续由nginx进行后续的操作
redirect:返回302临时重定向代码
permanent:返回301永久重定向
rewrite ^(/download/.*)/media/(.*)\..*$ $1/media/$2.mp3 last;
有什么问题 当结尾是mp3时 会发生死循环
一旦陷入死循环
nginx最多循环10次,超出之后返回500错误
rewrite ^/download/(.*\.(jpg|png|gif))$ /images/$1 last;
括号不需要转义
注意:一般将rewrite写在location中时都使用break标志,或者将rewrite写在if上下文中
rewrite_log on|off 指令 在location里面设置 生产环境不建议打开
是否将重写过程记录在错误日志中,默认为notice级别;默认为off
return code:
用于结束rewrite规则,并且为客户返回状态码:可以使用的状态码有204/400/402-406/500-504等
if (condition) { if的使用
}
用于检测条件是否成立
location ~* \.(jpg|gif) {
root /images/;
valid_referers none blocked www.b.org *.b.org;
if($invalid_referer){
rewrite ^/http://www.b.org/403.html;
}
}
7.状态页
location{
stub_status on;
}
当下处于活动状态的总数(请求完但是没有断开)
接受的连接总数 已经建立并处理请求的总数 已经处理请求的总数
正在接受的并发请求个数,正在读取的个数或发往客户端的,长连接中的处于活动状态的值
8.压缩:
gzip模块
gzip on|off
gzip_buffer 使用的缓存大小
gzip_comp_level 压缩的级别
gzip_disable 不压缩的文件类型或浏览器
gzip_min_length 最少压缩的大小(大于该值才压缩)
gzip_http_version 压缩完成以后发送http的版本
gzip_types:只压缩的格式
一般网页资源都要进行压缩 所以可以放在 http段当中
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律