Day 2: 配置Nginx
1.通过编辑Nginx配置文件来配置服务器和虚拟主机。
nginx命令常用选项:
-v 查看版本号
-V 查看版本号及编译选项
-s 给主进程发送信号.可接 stop | quit | reopen | reload
-t 测试配置是否正确
-c 指定配置文件,默认为 conf/nginx.conf
每次配完配置文件要先nginx -t 检查配置是否正确再往下进行
1.1根据配置来访问控制
方法一:配置deny/allow 禁止允许访问,访问顺序从上到下,匹配到则根据规则进行不在往下匹配
##允许192.168.141.0网段可访问,其他的ip拒绝访问
location / {
root html;
index index.html;
allow 192.168.141.0/24;
deny all;
}
方法二:黑白名单
可以使用geo模块定义一个访问控制的黑白名单,geo指令可以根据客户端的IP地址给变量定义不同的值:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6Uod8Pk3-1676815286121)(C:\Users\24747\AppData\Local\Temp\1676638855538.png)]
-
例:禁止 192.168.141.11 和 127.0.0.1 访问 ... geo $black_list { default 0; 192.168.141.11 1; 127.0.0.1 1; } server { listen 80; server_name _; root /usr/share/nginx/html; if ($black_list) { return 403; } ... } ...
1.2配置虚拟主机
服务器:在http配置模块中,用include引进子配置文件,在子配置文件中使用server块来配置服务器监听端口,服务器域名,在server块中定义location块匹配访问路径,访问根路径,索引文件等
主配置文件/ect/nginx/nginx.conf在http块添加:
#引进子配置文件夹 #注意配置文件匹配是从上到下,不要把这引用到最下面了 include conf.d/*.conf;
在子配置文件中配置虚拟主机
创建子配置文件
touch /etc/nginx/conf.d/proxy.conf
方法一:基于端口的虚拟主机(nginx服务器ip – 192.168.141.134)
vim /etc/nginx/conf.d/proxy.conf ..... server { listen 1111; server_name web.11.com; location / { root /11/html; index index.html index.htm; } } server { listen 1212; server_name web.12.com; location / { root /12/html; index index.html index.htm; } } .... #创建文件夹,输入页面内容 mkdir -p /{11,12}/html echo web11 > /11/html/index.html echo web12 > /12/html/index.html #验证配置文件 nginx -t #没错启动服务 nginx #检查端口
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5TMdngP5-1676815286131)(C:\Users\24747\AppData\Local\Temp\1676683272068.png)]
客户机(ip可ping通即可)
#配置域名解析 vim /etc/hosts .... 192.168.141.134 web.11.com web.12.com ....
#实验
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UV3fclBj-1676815286134)(C:\Users\24747\AppData\Local\Temp\1676683655847.png)]
根据实验结果可知实验成功 并且直接访问ip只有端口正确就可访问。
方法二:基于IP的虚拟主机(nginx服务器ip – 192.168.141.134,192.168.141.133)
#实现两个ip有两种方法,1.外加网络适配器设备 2.给网卡另加一个ip #方法1,可以自己添加 #方法2,ens33是我的网卡名称,若添加不上查看一下(ip a) ifconfig ens33:1 192.168.141.133 ... server { listen 192.168.141.133:80; server_name web.11.com; location / { root /11/html; index index.html index.htm; } } server { listen 192.168.141.134:80; server_name web.12.com; location / { root /12/html; index index.html index.htm; } } ... nginx -t #若没问题,重读配置文件 nginx -s reload
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zrUlAsya-1676815286138)(C:\Users\24747\AppData\Local\Temp\1676684385204.png)]
客户机(同上)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lOA2Wead-1676815286141)(C:\Users\24747\AppData\Local\Temp\1676684426520.png)]
根据实验结果,访问成功。实验成功
方法三:基于域名的虚拟主机
先关掉之前nginx服务
pkill nginx
修改配置文件
.... server { listen 80; server_name web.11.com; location / { root /11/html; index index.html index.htm; } } server { listen 80; server_name web.12.com; location / { root /12/html; index index.html index.htm; } } .... nginx -t nginx #没问题则启动
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rqOJskss-1676815286144)(C:\Users\24747\AppData\Local\Temp\1676684733492.png)]
客户机(同上)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-20YowBlw-1676815286147)(C:\Users\24747\AppData\Local\Temp\1676684913386.png)]
2.学习如何在Nginx中配置反向代理、负载均衡和SSL/TLS。
2.1反向代理
学习反向代理前,我们要先了解什么是反向代理
在我的理解里,反向代理是为了隐藏真实服务器而产生的。在客户端访问时他访问的是代理服务器而不是真实的服务器,客户端之所以可以访问到数据是因为代理服务器帮它转发请求的。而且反向代理不仅可以隐藏真实服务器,还可以实现负载均衡的作用,当真实服务器有多台且内容都一样时,反向代理可以把客户端的请求分发给后台不同的真实服务器分发流量,使得一台服务器的流量得到减少。
开始实验
准备三台服务器
代理服务器 192.168.141.134 真实服务器 192.168.141.136 客户端
真实服务器
默认配置,正常开启,关闭防火墙,客户端先常试访问,修改访问界面,再进行访问,代理机先进行访问
nginx -t nginx systemctl stop firewalld vim /usr/share/nginx/html/index.html ... real server ...
客户机
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rB7UcDqS-1676815286149)(C:\Users\24747\AppData\Local\Temp\1676686759417.png)]
代理机[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5HlwKkB1-1676815286153)(C:\Users\24747\AppData\Local\Temp\1676686782971.png)]
访问成功,开始代理
vim /etc/nginx/conf.d/proxy.conf ... server { listen 80; server_name location; location / { proxy_pass http://192.168.141.136/; } } ... nginx -t nginx #检查没问题启动 netstat -plnt|grep nginx #c查看启动是否成功
客户机对代理机进行访问
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Hs0rhnpR-1676815286158)(C:\Users\24747\AppData\Local\Temp\1676687168641.png)]
访问成功,代理成功
2.2实现负载均衡
该功能由ngx_http_upstream_module + ngx_http_proxy_module模块提供 当我们把后端服务器换成后端服务器组后,此代理服务器便成了负载均衡调度器 .详细使用可看官方的模块文档(可以用ctrl+f 进行关键字查找)
准备四台服务器
真实服务器1.192.168.141.136 真实服务器2.192.168.141.137 代理服务器 192.168.141.134 客服机
真实服务器1,不变
真实服务器2.
echo real_server137 > /usr/share/nginx/html/index.html
代理机进行负载均衡
vim /etc/nginx/conf.d/proxy.conf
使用 upstream 指令配置服务器组,一个 http 块中可配置多个服务器组。
... upstream backend { server 192.168.141.137 weight=1 ; server 192.168.141.136 weight=1; } server { listen 80; server_name location; location / { proxy_pass http://backend/; } } ...
客户机进行访问
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PI7dupSd-1676815286162)(C:\Users\24747\AppData\Local\Temp\1676689724410.png)]
进行8次访问,确定真实服务器1和2都被访问到了且为轮询访问,实验正确,下面为服务器组的常用定义 参数: weight=N 定义权值,默认为1 max_conns=N 限制最大连接数 backup 备用服务器,当所有主服务器都宕机后才会起用 down 不起用的服务器 max_fails=N 认为后端服务器失效的连接失败次数 fail_timeout=Ns 心跳检测响应超时秒数,超过这个时间未响应则认为失败
2.3 SSL/TLS
配置SSL/TLS前要先了解SSL/TLS是什么。SSL/TLS是一种安全通信协议,可以保护数据在网络上传输时的安全性和隐私性。在Nginx中,可以配置SSL/TLS证书来启用HTTPS协议,实现加密和认证的功能。
具体来说,Nginx中配置SSL/TLS需要以下步骤:
生成SSL/TLS证书:可以使用自签名证书或购买正式证书,也可以使用免费的Let's Encrypt证书。我是使用自签名证书 配置SSL/TLS证书 配置SSL/TLS协议 配置加密算法
1.生成私钥 在下面的命令中,example.key是生成的私钥文件名,生成2048位的RSA私钥 openssl genrsa -out example.key 2048 2.生成证书签名请求(CSR) openssl req -new -key example.key -out example.csr 在上面的命令中,example.key是刚刚生成的私钥文件,example.csr是生成的证书签名请求文件名。在生成CSR时需要填写一些证书相关的信息,例如国家、组织、单位、常用名等。(可以随便填写,现在我们只是学习又不是真的弄成网站) 3.生成自签名证书 openssl x509 -req -days 365 -in example.csr -signkey example.key -out example.crt 在上面的命令中,example.csr是刚刚生成的证书签名请求文件,example.key是刚刚生成的私钥文件,example.crt是生成的自签名证书文件名。-days指定证书的有效期,365表示证书有效期为365天。 4.配置Nginx使用SSL/TLS证书:将生成的私钥文件和自签名证书文件放到Nginx配置文件指定的路径下,并在Nginx配置文件中增加SSL/TLS相关的配置(可直接把nginx.conf下的ssl注释删掉,在改一下秘钥地址)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t18YXWrn-1676815286164)(C:\Users\24747\AppData\Local\Temp\1676702666178.png)]
在上面的配置中,listen指令指定了监听的端口和使用的协议(HTTPS),ssl_certificate和ssl_certificate_key指令指定了证书和私钥文件的路径。注意需要将路径替换为实际的路径。
验证一下 nginx -t nginx
在客户端进行
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NT2Rf2OH-1676815286167)(C:\Users\24747\AppData\Local\Temp\1676702858525.png)]
出现网页不安全,选择高级,然后点击继续访问,若访问成功则使用成功
3.如何使用Nginx的日志记录功能。
要学好nginx,日志查看是必不可少的。了解日志,首先要了解nginx有哪些基本日志
访问日志、错误日志、调试日志 访问日志:访问日志记录了所有访问Nginx服务器的请求信息,包括客户端IP地址、请求时间、请求方法、请求URL、HTTP协议版本、响应状态码、响应大小、来源页面等。访问日志可以用于分析服务器的访问情况,了解哪些URL被访问得最频繁、响应时间如何等等。可以使用access_log指令来配置访问日志的路径和格式。 错误日志:错误日志记录了Nginx服务器在处理请求时出现的错误信息,包括错误类型、错误描述、错误发生的时间、发生错误的文件和行号等。错误日志可以用于排查服务器问题和调试。可以使用error_log指令来配置错误日志的路径和记录级别。 调试日志:调试日志记录了Nginx服务器在处理请求时的详细信息,包括请求和响应的HTTP头部和主体、请求的URL参数、请求和响应的大小、TCP连接的建立和关闭时间等。调试日志可以用于分析服务器性能和排查问题。可以使用debug_connection指令来指定需要记录调试日志的IP地址。 nginx支持自定义日志类型,我们可以使用自动义类型来筛选自己想要的信息。 用好日志记录功能,要把日志记录放在适合的模块中,避免信息太多或者没有访问到信息
以下是一些常见的日志格式
$remote_addr 客户端ip $remote_user 用户名(为基本用户认证提供的用户名, 通常没有) $time_local 访问时间 $request 请求行 $status 状态码 $body_bytes_sent 返回给客户端的字节数,不含响应头 $http_referer 从哪个页面链接访问过来的 $http_user_agen 客户端浏览器 $http_x_forwarded_for 客户端ip $document_root 当前请求的root指令或alias指令的配置值 $host “Host”请求头的值,如果没有该请求头,则为与请求对应的虚拟主机的首要主
更多内嵌变量详见:
http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_core_module.html#variables
3.1作用域
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C8DMrzqT-1676815286171)(C:\Users\24747\AppData\Local\Temp\1676706493076.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pt8JhwTz-1676815286175)(C:\Users\24747\AppData\Local\Temp\1676706540335.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6tFO6uRY-1676815286178)(C:\Users\24747\AppData\Local\Temp\1676706583392.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YKGSqvao-1676815286181)(C:\Users\24747\AppData\Local\Temp\1676706658578.png)]
3.2自定义日志格式
Nginx 预定义了名为 combined
日志格式,如果没有明确指定日志格式默认使用该格式
log_format name [escape=default|json] string ...;
- name 格式名称。在 access_log 指令中引用。
- escape 设置变量中的字符编码方式是json还是default,默认是default。
- string 要定义的日志格式内容。该参数可以有多个。参数中可以使用Nginx变量。
3.3日志轮转
由于日志记录会越来越大,过多的日志查看是非常繁杂的,也会浪费磁盘空间,因此我们需要进行日志轮询,每过一段时间或文件到达一定大小就换一个文件存储。不需要的日志就删掉。
Nginx的日志轮转可以通过日志轮转工具(logrotate)来实现。在Linux中,logrotate是一个通用的日志轮转工具,可以用于Nginx的日志轮转。
要使用logrotate对Nginx的日志文件进行轮转,需要进行以下几个步骤
-
编写logrotate的配置文件。通常情况下,Nginx的日志文件会存放在
/var/log/nginx
目录下,因此可以在/etc/logrotate.d
目录下创建一个名为nginx
的配置文件,用于定义Nginx的日志轮转规则。/var/log/nginx/*.log { daily #daily:每天轮转一次日志文件。 rotate 7 #rotate 7:保留7个日志文件(即过去7天的日志)。 compress #compress:使用gzip进行压缩。 missingok #missingok:如果日志文件不存在,则不报错。 notifempty #notifempty:如果日志文件为空,则不轮转。 create 0640 www-data adm #create 0640 www-data adm:新建日志文件时设置权限为640,属主为www-data,属组为adm。 sharedscripts #sharedscripts:使用一个共享的脚本来执行轮转后的操作 postrotate #postrotate:在轮转后执行的操作,这里是向Nginx进程发送USR1信号,以重新打开日志文件。 [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid` #判断nginx的PID。# 默认logrotate会以root身份运行 endscript }
-
手动运行logrotate命令进行日志轮转。可以使用
logrotate -d /etc/logrotate.d/nginx
命令来测试配置文件是否正确。 -
使用cron定时运行logrotate命令。在Linux中,可以使用cron来定时运行logrotate命令。编辑
/etc/crontab
文件,添加如下一行:0 0 * * * root logrotate /etc/logrotate.d/nginx
上述配置表示每天的0点0分执行一次logrotate命令,轮转Nginx的日志文件。
向Nginx进程发送USR1信号,以重新打开日志文件。
[ -f /var/run/nginx.pid ] && kill -USR1 cat /var/run/nginx.pid
#判断nginx的PID。# 默认logrotate会以root身份运行
endscript
}
2. 手动运行logrotate命令进行日志轮转。可以使用`logrotate -d /etc/logrotate.d/nginx`命令来测试配置文件是否正确。
3. 使用cron定时运行logrotate命令。在Linux中,可以使用cron来定时运行logrotate命令。编辑`/etc/crontab`文件,添加如下一行:
0 0 * * * root logrotate /etc/logrotate.d/nginx
上述配置表示每天的0点0分执行一次logrotate命令,轮转Nginx的日志文件。
##