一、web服务概述
二、Nginx 概述
三、Nginx源码安装
直接下载压缩包到/home家目录进行操作
3.1 下载所需环境
dnf install gcc pcre-devel zlib-devel openssl-devel -y
源码安装需要提前准备标准的编译器,GCC的全称是(GNU Compiler collection),其有GNU开发,并以GPL即LGPL许可,是自由的类UNIX即苹果电脑Mac OS X操作系统的标准编译器,因为GCC原本只能处理C语言,所以原名为GNU C语言编译器,后来得到快速发展,可以处理C++,Fortran,pascal,objective,java以及Ada等其他语言,此外还需要Automake工具,以完成自动创建Makefile的工作,Nginx的一些模块需要依赖第三方库,比如: pcre(支持rewrite),zlib(支持gzip模块)和openssl(支持ssl模块)等。
3.2 下载官方源码包
tar zxf nginx-1.24.0.tar.gz
解压
tar zxf nginx-1.24.0.tar.gz
解压完成后进入目录
cd nginx-1.24.0
创建Nginx源码安装的用户
useradd -s /sbin/nologin -M nginx
3.3 源码安装
1.编译
./configure --prefix=/usr/local/nginx --add-module=/root/echo-nginx-module-0.63 --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
没有erroe错误提示则表示成功,错误多半是上面的环境没有准备
安装完成后nginx-1.24.0目录下会多出Makefile和objs两个文件目录
可以使用./configure --help命令查看命令帮助
参数解释:
./configure --prefix=/usr/local/nginx \
--user=nginx \ # 指定nginx运行用户
--group=nginx \ # 指定nginx运行组
--with-http_ssl_module \ # 支持https://
--with-http_v2_module \ # 支持http版本2
--with-http_realip_module \ # 支持ip透传
--with-http_stub_status_module \ # 支持状态页面
--with-http_gzip_static_module \ # 支持压缩
--with-pcre \ # 支持正则
--with-stream \ # 支持tcp反向代理
--with-stream_ssl_module \ # 支持tcp的ssl加密
--with-stream_realip_module # 支持tcp的透传ip
2.安装
make && make install
make -j2 源文件与系统C语言文件开始对接,可以使用-j指定编译时的CUP内核
make install 将objs目录中的东西拷贝到指定的目录/usr/local/nginx/
3 启动Nginx
进入Nginx配置目录
cd /usr/local/nginx/
找到Nginx的启动程序
sbin/下有一个名叫nginx的可执行程序,这就是nginx的启动程序
cd sbin/
ll
执行/usr/local/nginx/sbin/nginx启动nginx
/usr/local/nginx/sbin/nginx
4.查看nginx是否启动
ps aux |grep nginx 查看进程
netstat -antlupe | grep nginx 查看端口号
netstat不存在时安装whatprovides包
dnf whatprovides */netstat
5.访问
curl 172.25.254.130 #本机的ip地址
第三行看到Welcome to nginx!表示成功
6.nginx相关配置目录
/usr/local/nginx/conf
/usr/local/nginx/conf/nginx.conf 配置文件
7.查看版本
dnf list nginx
curl -I 172.25.254.130
8. 关闭nginx程序
/usr/local/nginx/sbin/nginx -s stop
如果关闭不了
ps aux |grep nginx查看进程号,然后使用kill -9 进程 杀死进程
9.启动Nginx
nginx 已经写入环境变量文件vim ~/.bash_profile
或
/usr/local/nginx/sbin/nginx
或者
/usr/local/nginx/sbin/nginx -s restart
10. 如果有问题直接卸载
rm -rf /usr/local/nginx/ #相对于取消make && make install
make clean #清除第1步编译./configure --prefix.....产生的配置文件
或者直接删除解压nginx压缩包的目录nginx-1.24.0/
从第一步开始重新安装,可以是某个地方做错
3.4 Nginx配置调优
1. 关闭debug功能
查看/usr/local/nginx/sbin/nginx的大小,内存比较大,因为有debug模式,可以关掉
[root@localhost sbin]# du -sh nginx
5.5M nginx
vim nginx-1.24.0/auto/cc/gcc 找到debug将下面一行注释 ,关闭debug
#debug
#CFLAGS="$CFLAGS -g"
2. 添加环境变量
将/usr/local/nginx/sbin写入环境变量文件vim ~/.bash_profile ,这样以后在任何地方直接执行nginx可以启动nginx程序
[root@localhost ~]# vim ~/.bash_profile
export PATH=$PATH:/usr/local/nginx/sbin
[root@localhost ~]# source ~/.bash_profile
添加到环境变量中以后,nginx==/usr/local/nginx/sbin/nginx
3. 启动脚本编写
vim /lib/systemd/system/nginx.service
[Unit]Description=The NGINX HTTP and reverse proxy serverAfter=syslog.target network-online.target remote-fs.target nss-lookup.targetWants=network-online.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true[Install]
WantedBy=multi-user.target
重启配置并检测生效
[root@localhost sbin]# systemctl daemon-reload
[root@localhost sbin]# nginx -s stop
[root@localhost sbin]# ps aux | grep nginx
root 21627 0.0 0.0 6408 2296 pts/0 S+ 01:53 0:00 grep --color=auto nginx
[root@localhost sbin]# systemctl enable --now nginx.service
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
[root@localhost sbin]# ps aux | grep nginx
root 21665 0.0 0.0 9920 940 ? Ss 01:54 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 21666 0.0 0.0 13760 4792 ? S 01:54 0:00 nginx: worker process
root 21668 0.0 0.0 6408 2300 pts/0 S+ 01:54 0:00 grep --color=auto nginx
[root@localhost sbin]#
4. 在系统中设置nginx的最大链接数
vim /etc/security/limits.conf 在最下面添加以下内容
nginx - nofile 100000
5. 更改nginx配置文件
添加的内容是汉字注释下面的,如:#参数优化1,用户
vim /usr/local/nginx/conf/nginx.conf
#参数优化1,用户
user nginx;
#参数优化2,内核
worker_processes auto;
#四核
worker_cpu_affinity 0001 0010 0100 1000;#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;#pid logs/nginx.pid;
#参数优化3,系统支持nginx打开的最大链接数量
events {
worker_connections 100000;
}
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 logs/access.log main;
...................................下面不用改,省略
nginx -s reload 重启nginx
查看
ps aux | grep nginx 查看内核数量
sudo -u nginx ulimit -a 下的open files 后的数量
3.5 平滑升级与版本回滚
3.5.1 平滑升级
有时候我们需要对 Nginx 版本进行升级以满足对其功能的需求,例如添加新模块,需要新功能,而此时Nginx有业务无法停掉,这时我们就可以选择平滑升级。
步骤:
- 将旧 Nginx 二进制文件换成新 Nginx 程序文件(注意先备份 )
- 向 master 进程发送 USR2 信号
- master 进程修改 pid 文件名加上后缀 .oldbin, 成为 nginx.pid.oldbin
- master 进程用新 Nginx 文件启动新 master 进程成为旧 master 的子进程 , 系统中将有新旧两个 Nginx 主
- 进程共同提供 Web 服务 , 当前新的请求仍然由旧 Nginx 的 worker 进程进行处理 , 将新生成的 master 进程的 PID 存放至新生成的 pid 文件 nginx.pid
- 向旧的 Nginx 服务进程发送 WINCH 信号,使旧的 Nginx worker 进程平滑停止
- 向旧 master 进程发送 QUIT 信号,关闭老 master ,并删除 Nginx.pid.oldbin 文件
- 如果发现升级有问题 , 可以回滚∶向老 master 发送 HUP ,向新 master 发送 QUIT
配置:
1.下载新版本并解压编译
[root@Nginx nginx]# tar zxf nginx-1.26.1.tar.gz
[root@Nginx nginx]# cd nginx-1.26.1/
[root@Nginx nginx-1.26.1]# ./configure --with-http_ssl_module --withhttp_v2_module --with-http_realip_module --with-http_stub_status_module --withhttp_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --
with-stream_realip_module
[root@Nginx nginx-1.26.1]# make
2.此时可以查看到两个版本
[root@Nginx nginx-1.26.1]# ll objs/nginx /usr/local/nginx/sbin/nginx
-rwxr-xr-x 1 root root 1239416 Jul 18 15:08 objs/nginx
-rwxr-xr-x 1 root root 5671488 Jul 18 11:41 /usr/local/nginx/sbin/nginx
3.将旧版本的nginx命令备份并将新版本的nginx命令复制过去
[root@Nginx ~]# cd /usr/local/nginx/sbin/
[root@Nginx sbin]# cp nginx nginx.24
[root@Nginx sbin]# \cp -f /root/nginx/nginx-1.26.1/objs/nginx /usr/local/nginx/sbin
USR2 平滑升级可执行程序,将存储有旧版本主进程PID的文件重命名为nginx.pid.oldbin,并启动新的nginx,此时两个master的进程都在运行,只是旧的master不在监听,由新的master监听80,此时Nginx开启一个新的master进程,这个master进程会生成新的worker进程,这就是升级后的Nginx进程,此时老的进程不会自动退出,但是当接收到新的请求不作处理而是交给新的进程处理。
[root@Nginx sbin]# ps aux | grep nginx
[root@Nginx sbin]# kill -USR2 46548
5.回收旧版本
[root@Nginx sbin]# kill -WINCH 46548
6.检测版本信息
[root@Nginx sbin]# curl -I localhost
3.5.2 版本回滚
如果升级的版本有问题可以回滚
1.重新拉起旧版本的worker
[root@Nginx sbin]# cp nginx nginx.26
[root@Nginx sbin]# ls
nginx nginx.24 nginx.26
[root@Nginx sbin]# mv nginx.24 nginx
mv: overwrite 'nginx'? y
2.重新加载旧版本进程
[root@Nginx sbin]# kill -HUP 48732
3.回收新版本进程
[root@Nginx sbin]# kill -WINCH 52075
6.检测版本信息
[root@Nginx sbin]# curl -I localhost
四、Nginx相关实验配置
4.1 Nginx配置文件说明
配置文件位置:
·主配置文件:/usr/local/nginx/conf/nginx.conf
·子配置文件:/usr/local/nginx/conf.d/*.conf
子配置文件格式说明:
- 配置文件由指令与指令块构成
- 每条指令以;分号结尾,指令与值之间以空格符号分隔
- 可以将多条指令放在同一行,用分号分隔即可,但可读性差,不推荐
- 指令块以{ }大括号将多条指令组织在一起,且可以嵌套指令块
- include语句允许组合多个配置文件以提升可维护性
- 使用#符号添加注释,提高可读性
- 使用$符号使用变量
- 部分指令的参数支持正则表达式
主配置文件结构:
共四部分
main block:主配置段,即全局配置段,对http,mail都有效
#事件驱动相关的配置
event {
...
}
#http/https 协议相关配置段
http {
...
}
#默认配置文件不包括下面两个块
#mail 协议相关配置段
mail {
...
}
#stream 服务器相关配置段
stream {
...
}
主配置文件命令解释
[root@nginx-node1 ~]# vim /usr/local/nginx/conf/nginx.conf
#全局配置或默认配置,设置nginx的启动用户/组,启动的工作进程数量,工作模式,Nginx的PID路径,日志路径等。
#user nobody;
worker_processes 1; #启动工作进程数数量
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events { #设置块,主要影响nginx服务器与用户的网络连接,比如是否允许同时接受多个网络连接,使用哪种事件驱动模型
#处理请求,每个工作进程可以同时支持的最大连接数,是否开启对多工作进程下的网络连接进行序列化等。
worker_connections 1024; #设置单个nginx工作进程可以接受的最大并发,作为web服务器的时候最大并发数为worker_connections *worker_processes,
#作为反向代理的时候为(worker_connections * worker_processes)/2
}
http { ##http块是Nginx服务器配置中的重要部分,缓存、代理和日志格式定义等绝大多数功能和第三方模块都可以在这设置,
#http块可以包含多个server块,而一个server块中又可以包含多个location块,
#server块可以配置文件引入、MIME-Type定义、日志自定义、是否启用sendfile、连接超时时间和单个链接的请求上限等。
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 logs/access.log main;
sendfile on; #作为web服务器的时候打开sendfile加快静态文件传输,指定是否使用sendfile系统调用来传输文件
#sendfile系统调用在两个文件描述符之间直接传递数据(完全在内核中操作)从而避免了数据在内核缓冲区和用户缓冲区之间的拷贝,操作效率很高,被称之为零拷贝,
#硬盘 >> kernel buffer (快速拷贝到kernelsocketbuffer) >>协议栈。
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65; #长连接超时时间,单位是秒
#gzip on;
server { #设置一个虚拟机主机,可以包含自己的全局块,同时也可以包含多个location模块
##比如本虚拟机监听的端口、本虚拟机的名称和IP配置,多个server可以使用一个端口比如都使用80端口提供web服务
listen 80; #配置server监听的端口
server_name localhost; #本server的名称,当访问此名称的时候nginx会调用当前serevr内部的配置进程匹配。
#charset koi8-r;
#access_log logs/host.access.log main;
location / { #location其实是server的一个指令,为nginx服务器提供比较多而且灵活的指令都是在location中体现的,
#主要是基于nginx接受到的请求字符串对用户请求的UIL进行匹配,并对特定的指令进行处理
#包括地址重定向、数据缓存和应答控制等功能都是在这部分实现,另外很多第三方模块的配置也是在location模块中配置。
root html; #相当于默认页面的目录名称,默认是安装目录的相对路径,可以使用绝对路径配置。
index index.html index.htm; #默认的页面文件名称
}
#error_page 404 /404.html; #错误页面的文件名称
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html { #location处理对应的不同错误码的页面定义到/50x.html,这个跟对应其server中定义的目录下。
root html; #定义默认页面所在的目录
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
#和邮件相关的配置
#mail {
# ...
# } mail 协议相关配置段
#tcp代理配置,1.9版本以上支持
#stream {
# ...
# } stream 服务器相关配置段
#导入其他路径的配置文件
#include /apps/nginx/conf.d/*.conf
}
4.2 root和alias
root:指定web的家目录,在定义location的时候,文件的绝对路径等于 root+location
alias:定义路径别名,会把访问的路径重新定义到其指定的路径,文档映射的另一种机制;仅能用于
location上下文,此指令使用较少。
注意: root, 给定的路径对应于 location 中的 /uri 左侧的 /
alias , 给定的路径对应于 location 中的 /uri 的完整路径
1.使用epoll事件驱动并将子配置文件目录映射到主配置文件中,重载文件
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
events {
worker_connections 100000;
use epoll; #使用epoll事件驱动
}
http {
######
include "/usr/local/nginx/conf.d/*.conf"; #在响应报文中将指定的文件扩展名映射至MIME对应的类型
######
}
nginx -s reload 重启服务
2.创建子配置文件并写入规则,重载文件
[root@nginx ~]# mkdir -p /usr/local/nginx/conf.d
[root@nginx ~]# vim /usr/local/nginx/conf.d/vhost.conf
server {
listen 80;
server_name www.rhel9.org;
root /data/web/html;
index index.html;
}
nginx -s reload 重启
3.写入测试文字
echo www.rhel9.org > /data/web/html/index.html
4.测试
记得做本地解析
server {
listen 80;
server_name web.rhel9.org;
location /dirtest { #必须建立/mnt/dirtest才能访问
root /mnt;
}
location /alias { #使用alias的时候uri后面如果加了斜杠,则下面的路径配置
必须加斜杠,否则403
alias /mnt/dirtest; #当访问alias的时候,会显示alias定义的/mnt/dirtest
里面的内容
}
4.3 location
在一个 server 中 location 配置段可存在多个,用于实现从 uri到文件系统的路径映射, ngnix 会根据用户请求的 URI 来检查定义的所有 location ,按一定的优先级找出一个最佳匹配, 而后应用其配置在没有使用正则表达式的时候, nginx 会先在 server 中的多个 location 选取匹配度最 高的一个 uri, uri 是用户请求的字符串,即域名后面的 web 文件路径, 然后使用该 location 模块中的正则 url 和字符串,如果匹配成功就结束搜索,并使用此 location 处理 此请求。
匹配优先级: =, ^~, ~ / ~ * , /
location 优先级: (location =) > (location ^~ 路径 ) > (location ~,~* 正则顺序 ) > (location 完整路径 ) > (location 部分起始路径 ) > (/)
匹配符号 | 说明 |
= | 用于标准 uri 前,需要请求字串与 uri 精确匹配,大小敏感 , 如果匹配成功就停止向下匹配并立即处理请求 |
^~ | 用于标准 uri 前,表示包含正则表达式 ,并且匹配以指定的正则表达式开头,对 uri 的最左边部分做匹配检查,不区分字符大小写 |
~ | 用于标准 uri 前,表示包含正则表达式 , 并且区分大小写 |
~* | 用于标准 uri 前,表示包含正则表达式 , 并且不区分大写 |
不带符号 | 匹配起始于此 uri 的所有的 uri |
\ | 用于标准 uri 前,表示包含正则表达式并且转义字符。可以将 . * ? 等转义为普通符号 |
示例配置:
server {
listen 80;
server_name www.rhel9.org;
location / {
root /data/web/html/ccc;
}
location ^~ /images {
root /data/web/html/ccc;
index index.html;
}
location /images1 {
root /data/web/html/ccc;
}
location ~* \.(gif|jpg|jpeg|bmp|png|tiff|tif|ico|wmf|js)$ {
root /data/web/html/ccc;
index index.html;
}
}
4.4 用户认证功能
1.创建用户,完成后可查看信息
[root@nginx ~]# htpasswd -cm /usr/local/nginx/.htpasswd admin
New password:
Re-type new password:
Adding password for user admim
[root@nginx ~]# htpasswd -m /usr/local/nginx/.htpasswd ccc
New password:
Re-type new password:
Adding password for user ccc
[root@nginx ~]# cat /usr/local/nginx/.htpasswd
admin:$apr1$okMzYJLu$Sk/0N1AUZoDjgpldJUi2a0
ccc:$apr1$DMbv5BB8$HbeB4TMW9UZfAScnzjkq.1
2.创建文件并写入测试文字
[root@nginx ~]# mkdir /data/web/ccc
[root@nginx ~]# echo ccc > /data/web/ccc/index.html
3.子配置文件中写入规则并重启
[root@nginx ~]# vim /usr/local/nginx/conf.d/vhost.conf
location /ccc {
root /data/web;
auth_basic "login password !!!"; #用户在浏览器看到的认证信息提示
auth_basic_user_file "/usr/local/nginx/.htpasswd"; #http认证文件路径
}
nginx -s reload 重启服务配置
访问,去Windows浏览器访问,输入创建的用户名和密码
4.5 自定义错误日志
自 定义错误页,同时也可以用指定的响应状态码进行响应
可用位置: http, server, location, if in location
error_page code ... [=[response]] uri;
示例:
listen 80;
server_name www.timinglee.org;
error_page 500 502 503 504 /error.html;
location = /error.html {
root /data/nginx/html;
}
重启 nginx 并访问不存在的页面进行测试
示例:自定义错误页面
[root@nginx ~]# mkdir /webdata/nginx/timinglee/lee/errors -p
[root@nginx ~]# echo error page > /webdata/nginx/timinglee/lee/errors/40x.html
[root@nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {
listen 80;
server_name www.timinglee.org;
error_page 404 /40x.html;
location = /40x.html {
root /webdata/nginx/timinglee/lee/errors;
}
}
测试:
[root@nginx ~]# nginx -s reload
[root@nginx ~]#[root@nginx ~]# curl www.timinglee.org/40x.html/
error page
4.6 自定义错误日志
可以自定义错误日志
Syntax: error_log file [level];
Default:
error_log logs/error.log error;
Context: main, http, mail, stream, server, location
level: debug, info, notice, warn, error, crit, alert, emerg
示例:
[root@nginx ~]# mkdir "/var/log/nginx" -p
[root@nginx ~]# vim /usr/local/nginx/conf.d/vhosts.confserver {
listen 80;
server_name www.timinglee.org;
error_page 404 /40x.html;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location = /40x.html {
root /webdata/nginx/timinglee/lee/errors;
}
}
重启nginx并访问不存在的页面进行测试并验证是在指定目录生成新的日志文件
[root@nginx ~]# nginx -s reload
[root@nginx ~]# curl www.timinglee.org/40x.html/
error page
[root@nginx ~]# cd /var/log/nginx/
[root@nginx nginx]# ls
access.log error.log
4.7 检测文件是否存在
try_files 会按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如果所有文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。只有最后一个参数可以引起一个内部重定向,之前的参数只设置内部URI 的指向。最后一个参数是回退 URI 且必须存在,否则会出现内部500 错误
语法格式
Syntax: try_files file ... uri;
try_files file ... =code;
Default: —
Context: server, location
示例 : 如果不存在页面 , 就转到 default.html 页面
[root@nginx nginx]# mkdir -p /webdata/nginx/timinglee.org/lee/error/
[root@nginx nginx]# echo "index.html is not exist" > /webdata/nginx/timinglee.org/lee/error/default.html
[root@nginx nginx]# vim /usr/local/nginx/conf.d/vhosts.conf
server {
listen 80;
server_name www.timinglee.org;#location /login {
# root /webdata/nginx/timinglee.org/lee;
# index index.html;
# auth_basic "login password";
# auth_basic_user_file "/usr/local/nginx/conf/.htpasswd";
#}
root /webdata/nginx/timinglee.org/lee;
error_page 404 /40x.html;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
try_files $uri $uri.html $uri/index.html /error/default.html;
location = /40x.html {
root /webdata/nginx/timinglee/lee/errors;
}
}
测试:
[root@nginx ~]# nginx -s reload
[root@nginx ~]# curl www.timinglee.org/40x.html/
index.html is not exist
4.8 长连接配置
keepalive_timeout timeout [header_timeout]; #设定保持连接超时时长, 0 表示禁止长连接,默认为75s
#通常配置在http字段作为站点全局配置
keepalive_requests 数字; #在一次长连接上所允许请求的资源的最大数量
#默认为100次,建议适当调大,比如:500
示例:
keepalive_requests 3;
keepalive_timeout 65 60;
# 开启长连接后,返回客户端的会话保持时间为 60s ,单次长连接累计请求达到指定次数请求或 65 秒就会被断
开,第二个数字 60 为发送给客户端应答报文头部中显示的超时时间设置为 60s :如不设置客户端将不显示超时时间。
Keep-Alive:timeout=60 #浏览器收到的服务器返回的报文
#如果设置为0表示关闭会话保持功能,将如下显示:
#Connection:close 浏览器收到的服务器返回的报文
# 使用命令测试:
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
keepalive_timeout 65 60;
keepalive_requests 500;
[root@nginx ~]# telnet www.timinglee.org 80
Trying 192.168.10.140...
Connected to www.timinglee.org.
Escape character is '^]'.
GET / HTTP/1.1 ##输入动作
HOST: www.timinglee.org ##输入访问HOST##输入回车
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Tue, 20 Aug 2024 14:51:18 GMT
Content-Type: text/html
Content-Length: 24
Last-Modified: Tue, 20 Aug 2024 14:36:54 GMT
Connection: keep-alive
Keep-Alive: timeout=60
ETag: "66c4aa06-18"
Accept-Ranges: bytesindex.html is not exist
Trying 192.168.10.140...
Connected to www.timinglee.org.
Escape character is '^]'.
GET / HTTP/1.1 #第一次操作
HOST: www.timinglee.org #第二次操作#第三次操作
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Tue, 20 Aug 2024 14:51:18 GMT
Content-Type: text/html
Content-Length: 24
Last-Modified: Tue, 20 Aug 2024 14:36:54 GMT
Connection: keep-alive
Keep-Alive: timeout=60
ETag: "66c4aa06-18"
Accept-Ranges: bytesindex.html is not exist
Connection closed by foreign host. # 自动断开链接
4.9 作为下载服务器配置
ngx_http_autoindex_module 模块处理以斜杠字符 "/" 结尾的请求,并生成目录列表 , 可以做为下载服务配置使用
相关指令:
autoindex on | off; # 自动文件索引功能,默为 off
autoindex_exact_size on | off; # 计算文件确切大小(单位 bytes ), off 显示大概大小(单位 K、 M),默认 on
autoindex_localtime on | off ; # 显示本机时间而非 GMT( 格林威治 ) 时间,默认 off
autoindex_format html | xml | json | jsonp; # 显示索引的页面文件风格,默认 html
limit_rate rate; # 限制响应客户端传输速率 ( 除 GET 和 HEAD 以外的所有方法 ) ,单位
B/s,bytes/second , # 默认值 0, 表示无限制 , 此指令由ngx_http_core_module提供
set $limit_rate 4k; # 也可以通变量限速 , 单位 B/s, 同时设置 , 此项优级高 .
示例:实现下载站点
注意 :download 不需要 index.html 文件
location /download {
autoindex on; #自动索引功能
autoindex_exact_size on; #计算文件确切大小(单位bytes),此为默认值,off只显示大概大小(单位 kb 、 mb 、 g[root@nginx ~]# mkdir -p /webdata/nginx/timinglee.org/lee/download
[root@nginx ~]# cp /root/anaconda-ks.cfg /webdata/nginx/timinglee.org/lee/download
[root@nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {
listen 80;
server_name www.timinglee.org;
root /webdata/nginx/timinglee.org/lee;
error_page 404 /40x.html;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
try_files $uri $uri.html $uri/index.html /error/default.html;
location = /40x.html {
root /webdata/nginx/timinglee/lee/errors;
}b)autoindex_localtime on; #on表示显示本机时间而非GMT(格林威治)时间,默为为off显示GMT时间
limit_rate 1024k; #限速,默认不限速
}
}
重启 Nginx 并访问测试下载页面
五、高级配置
5.1 状态页
- 基于nginx 模块 ngx_http_stub_status_module 实现,
- 在编译安装nginx的时候需要添加编译参数 --with-http_stub_status_module
- 否则配置完成之后监测会是提示法错误
配置:
location /nginx_status {
stub_status;
auth_basic "auth login";
auth_basic_user_file /apps/nginx/conf/.htpasswd;
allow 192.168.0.0/16;
allow 127.0.0.1;
deny all;
}
# 状态页用于输出 nginx 的基本状态信息:
# 输出信息示例:
Active connections: 291
server accepts handled requests
16630948 16630948 31070465
上面三个数字分别对应 accepts,handled,requests 三个值
Reading: 6 Writing: 179 Waiting: 106
Active connections: #当前处于活动状态的客户端连接数
#包括连接等待空闲连接数=reading+writing+waiting
accepts: #统计总值,Nginx 自启动后已经接受的客户端请求连接的总数。
handled: #统计总值,Nginx自启动后已经处理完成的客户端请求连接总数
#通常等于accepts,除非有因worker_connections限制等被拒绝的
连接
requests: #统计总值,Nginx自启动后客户端发来的总的请求数
Reading: #当前状态,正在读取客户端请求报文首部的连接的连接数
#数值越大,说明排队现象严重,性能不足
Writing: #当前状态,正在向客户端发送响应报文过程中的连接数,数值越大, 说明访问量很大
Waiting: #当前状态,正在等待客户端发出请求的空闲连接数
开启 keep-alive的情况下,这个值等于active –(reading+writing)
5.2 压缩功能
Nginx 支持对指定类型的文件进行压缩然后再传输给客户端,而且压缩还可以设置压缩比例,压缩后的文件大小将比源文件显著变小,样有助于降低出口带宽的利用率,降低企业的IT 支出,不过会占用相应的CPU 资源。
Nginx 对文件的压缩功能是依赖于模块 ngx_http_gzip_module, 默认是内置模
指令说明:
gzip on | off; | 启用或禁用 gzip 压缩,默认关闭 |
gzip_comp_level 4; | 压缩比由低到高从 1 到 9 ,默认为 1 ,值越高压缩后文件越小,但是消耗 cpu 比较高。基本设定未 4 或者 5 |
gzip_disable "MSIE [1-6]\."; | 禁用 IE6 gzip 功能,早期的 IE6 之前的版本不支持压缩 |
gzip_min_length 1k; | gzip 压缩的最小文件,小于设置值的文件将不会压缩 |
gzip_http_version 1.0 | 1.1; | 启用压缩功能时,协议的最小版本,默认 HTTP/1.1 |
gzip_buffers number size; | 指定 Nginx 服务需要向服务器申请的缓存空间的个数和大小 , 平台不同 , 默认 :32 4k 或者 16 8k; |
gzip_types mime-type ...; | 指明仅对哪些类型的资源执行压缩操作 ; 默认为 gzip_types text/html ,不用显示指定,否则出错 |
gzip_vary on | off; | 如果启用压缩,是否在响应报文首部插入 “Vary: Accept-Encoding”, 一般建议打开 |
gzip_static on | off; | 预压缩,即直接从磁盘找到对应文件的 gz 后缀的式的压缩文件返回给用户,无需消耗服务器 CPU 注意 : 来自于 ngx_http_gzip_static_module 模块 |
配置:
[root@nginx ~]# mkdir /webdata/nginx/timinglee.org/lee/data -p
[root@nginx ~]# cp /usr/local/nginx/logs/access.log /webdata/nginx/timinglee.org/lee/data/data.txt
[root@nginx ~]# ll /webdata/nginx/timinglee.org/lee/data/data.txt
-rw-r--r-- 1 root root 2494866 Aug 20 23:18 /webdata/nginx/timinglee.org/lee/data/data.txt
[root@nginx ~]# echo test > /webdata/nginx/timinglee.org/lee/data/test.html #小于1k 的文件测试是否会压缩
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
gzip on;
gzip_comp_level 5;
gzip_min_length 1k;
gzip_types text/plain application/javascript application/x-javascript text/css
application/xml text/javascript application/x-httpd-php image/gif image/png;
gzip_vary on;
# 重启 Nginx 并访问测试:
[root@nginx ~]# nginx -s reload
[root@nginx ~]#[root@nginx ~]# curl --head --compressed www.timinglee.org/data/test.html
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Tue, 20 Aug 2024 15:25:51 GMT
Content-Type: text/html
Content-Length: 5
Last-Modified: Tue, 20 Aug 2024 15:18:58 GMT
Connection: keep-alive
Keep-Alive: timeout=60
ETag: "66c4b3e2-5"
Accept-Ranges: bytes[root@nginx ~]# curl --head --compressed www.timinglee.org/data/data.txt
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Tue, 20 Aug 2024 15:26:08 GMT
Content-Type: text/plain
Last-Modified: Tue, 20 Aug 2024 15:18:05 GMT
Connection: keep-alive
Keep-Alive: timeout=60
Vary: Accept-Encoding
ETag: W/"66c4b3ad-261192"
Content-Encoding: gzip