nginx笔记(一)nginx基础教程

发布时间:2023-05-06 09:41:08

一、nginx简介

Nginx是轻量级的 Web 服务器 / 反向代理服务器和电子邮件(IMAP代理服务器/POP3,并在一个 BSD-like 协议下发行,可在 UNIX、GNU/Linux、BSD、Mac OS X、Solaris,以及 Microsoft Windows 在操作系统中运行。Nginx是高性能的 HTTP 与反向代理的web服务器具有很强的处理高并发性,能够承受高负荷 有报告显示,负载测试可以支持高达 并发连接数5万个。

其特点是占有内存少,并发能力强

能做什么?

  • Nginx 作为 web 服务器
  • 正向代理
  • 反向代理
  • 负载均衡
  • 动静分离
二、nginx安装部署

环境:centos7

版本:1.23.3

地址:http://nginx.org/en/download.html

2.1 用源代码编译安装安装安装
[root@localhost nginx]# wget http://nginx.org/download/nginx-1.23.3.tar.gz--2023-02-09 22:46:37--  http://nginx.org/download/nginx-1.23.3.tar.gz正在分析主机 nginx.org (nginx.org)... 52.58.199.22, 3.125.197.172, 2a05:d014:edb:5702::6, ...正在连接 nginx.org (nginx.org)|52.58.199.22|:80... 已连接。已发出 HTTP 请求,等待回应... 200 OK长度:1108958 (1.1M) [application/octet-stream]保存至: “nginx-1.23.3.tar.gz”100%[===============================================================================================================================================================================================>] 1,108,958    510KB/s 用时 2.1s   2023-02-09 22:47:11 (510 KB/s) - 已保存 “nginx-1.23.3.tar.gz” [1108958/1108958]#解压安装包[root@localhost nginx-1.23.3]# tar zxvf nginx-1.23.3.tar.gz#查看安装包[root@localhost nginx-1.23.3]# pwd/home/nginx[root@localhost nginx-1.23.3]# lsnginx-1.23.3  nginx-1.23.3.tar.gz# 编译[root@localhost nginx-1.23.3]#  cd nginx-1.23.3[root@localhost nginx-1.23.3]#  ./configure --prefix=/usr/local/nginx  # --prefix=/usr/local/nginx 指安装路径/usr/local/nginx,[root@localhost nginx-1.23.3]#  make[root@localhost nginx-1.23.3]#  make install
启动
# 进入安装好的目录 /usr/local/nginx/sbin[root@localhost nginx-1.23.3]# cd /usr/local/nginx/sbin# 启动[root@localhost sbin]# ./nginx
其他命令
./nginx    # 启动./nginx -s stop #快速停止./nginx -s quit #优雅关闭,在退出前完成已接受的连接请求./nginx -s reload #重新加载配置

访问

地址:http://192.168.2.193/

如下界面出现,标志安装成功

nginx笔记(一)nginx基础教程_nginx

配置系统服务

nginxx配置服务脚本.service(路径/usr/local/nginx/sbin)

[root@localhost nginx-1.23.3]# vi /usr/lib/systemd/system/nginx.service

脚本内容如下

[Unit]Description=nginx - web serverAfter=network.target remote-fs.target nss-lookup.target[Service]Type=forkingPIDFile=/usr/local/nginx/logs/nginx.pidExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.confExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.confExecReload=/usr/local/nginx/sbin/nginx -s reloadExecStop=/usr/local/nginx/sbin/nginx -s stopExecQuit=/usr/local/nginx/sbin/nginx -s quitPrivateTmp=true[Install]WantedBy=multi-user.target

重载系统服务

[root@localhost nginx-1.23.3]# systemctl daemon-reload

启动服务

[root@localhost nginx-1.23.3]# systemctl start nginx.service

设置启动启动

[root@localhost nginx-1.23.3]# systemctl enable nginx.service
访问测试

地址:http://192.168.2.193/

如下界面出现,标志安装成功

nginx笔记(一)nginx基础教程_nginx_02

2.2 docker安装下载nginx镜像
# 下载最新版本的Nginx镜像 (实际上,这个命令相当于 : docker pull nginx:latest )docker pull nginx
创建Nginx配置文件
# 创建mkdirir创建挂载目录 -p /apps/nginx/confmkdir -p /apps/nginx/logmkdir -p /apps/nginx/html

将nginx放在容器中.conf文件和conf文件.将d文件夹复制到宿主机

# docker生成容器 run --name minNginx -p 81:80 -d nginx# 将容器nginx.conf文件复制到宿主机docker cp minNginx:/etc/nginx/nginx.conf /apps/nginx/conf/nginx.conf# conf容器.将内容复制到宿主机docker cp minNginx:/etc/nginx/conf.d /apps/nginx/conf/conf.d# 将容器中的html文件夹复制到宿主机docker cp minNginx:/usr/share/nginx/html /apps/nginx/
创建Nginx容器并运行
# docker直接执行 rm nginx或容器id关闭容器# 找到nginx对应的容器idocker ps -a# 关闭容器docker stop minNginx# 删除该容器的docker rm minNginx # 或删除正在运行的nginx容器docker rm -f minNginx
配置文件

根据需要修改目录/app/nginx可以在conf下配置文件

启动
docker run \-p 81:81 \--name minNginx \-v /apps/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \-v /apps/nginx/conf/conf.d:/etc/nginx/conf.d \-v /apps/nginx/log:/var/log/nginx \-v /apps/nginx/html:/usr/share/nginx/html \-d nginx:latest
三、目录结构及运行原理

查看nginx目录

[root@localhost sbin]# tree /usr/local/nginx/usr/local/nginx├── client_body_temp├── conf│   ├── fastcgi.conf│   ├── fastcgi.conf.default│   ├── fastcgi_params│   ├── fastcgi_params.default│   ├── koi-utf│   ├── koi-win│   ├── mime.types│   ├── mime.types.default│   ├── nginx.conf│   ├── nginx.conf.default│   ├── scgi_params│   ├── scgi_params.default│   ├── uwsgi_params│   ├── uwsgi_params.default│   └── win-utf├── fastcgi_temp├── html│   ├── 50x.html│   └── index.html├── logs│   ├── access.log│   ├── error.log│   └── nginx.pid├── proxy_temp├── sbin│   ├── nginx│   └── nginx.old├── scgi_temp└── uwsgi_temp9 directories, 22 files

主要目录说明:

sbin:可执行文件

conf:核心配置文件

html:静态页面

logs:存储日志信息

四、配置文件说明

nginx的初始化.conf(删除注释)

worker_processes  1;events {    worker_connections  1024;}http {    include       mime.types;    default_type  application/octet-stream;    sendfile        on;    keepalive_timeout  65;    server {        listen       80;        server_name  localhost;        location / {            root   html;            index  index.html index.htm;        }        error_page   500 502 503 504  /50x.html;        location = /50x.html {            root   html;        }    }}

全局块

worker_processes  1;

这是 Nginx 服务器并发处理的关键配置,worker_processes 值越大,可以支持的并发处理量越多,但是 会受到硬件、软件等设备的限制。

工作流程:数量。根据硬件调整,通常等于CPU数量或CPU数量的两倍。

events块

events {    worker_connections  1024;}

每个 word process 可同时支持的最大连接数等;

每个 work process 支持的最大连接数为 1024.

http

http是Nginx 绝大多数功能和第三方模块的配置,如代理、缓存和日志定义,都是服务器配置中最频繁的部分

http 块也可以包括 http全局块,server 块。

http全局块http全局块配置指令包括文件介绍,MIME-TYPE 定义、日志自定义、连接超时间、单链接请求数上限等。 server 块与虚拟主机密切相关。从用户的角度来看,虚拟主机与独立的硬件主机完全相同。该技术的产生是为了 节省互联网服务器硬件成本。 每个 http 块可以包括多个块 server 块,而每个 server 块相当于虚拟主机。而每个 server 块也分为全局 server 块,可以同时包含多个块 locaton 块。 全局 server 块最常见的配置是虚拟机主机的监控配置,以及虚拟主机的名称或IP配置。 location 块一个 server 多个块可以配置 location 块。这一块的主要功能是基于 Nginx 服务器收到的请求字符串(例如 server_name/uri-string),虚拟主机名称 (也可以是IP 以外的字符串(如别名)(例如 前面的 /uri-string)匹配,处理具体要求。 地址定位,数据缓慢 这里还有许多第三方模块的配置,如存储和响应控制。
五、虚拟主机配置5.1 多IP配置

一台Linux服务器绑定两个ip:192.168.20.30、192.168.20.29

server {    listen 80;         server_name 192.168.1.1;      location / {root /opt/demo1;        index index.html;    }}server {    listen 80;    server_name 192.168.1.2;    location / {        root /opt/demo2;        index index.html;    }}
5.2 多端口配置
server {    listen 80;    server_name 192.168.2.193;    location / {        root /opt/demo1;        index index.html;    }}server {    listen 81;    server_name 192.168.2.193;    location / {        root /opt/demo2;        index index.html;    }}
5.3 多域名配置
server {    listen 80;    server_name www.demo1.com;    location / {        root /opt/demo1;        index index.html;    }}server {    listen 80;    server_name www.demo2.com;    location / {        root /opt/demo2;        index index.html;    }}
5.4 server_name匹配原则

1.完整匹配

多个域名可以在server中配置,例如:

server_name  test.demo1.com  test.demo2.com;

2.匹配通配符

server_name  *.demo.com;

需要注意的是,精确匹配的优先级大于通配符匹配和正则匹配

3.通配符结束匹配

server_name  test.demo.*;

4.正则匹配

server_name ~^www\d+\.example\.com$;

正常的匹配格式必须是~开头。如果开头没有~,nginx被认为是准确的匹配。逻辑上,需要添加^和$锚定符号。请注意,在正则匹配格式中。它是正则元字符,如果需要匹配.,需要反斜线转义。

如果正则匹配中含有{和},则需要引用双引号,以避免nginx报错。如果没有双引号,nginx将报告以下错误:directive "server_name" is not terminated by ";" in ..。

5.特殊匹配格式

server_name ""; 不存在匹配Host请求头的情况。

匹配顺序

1. 精确的名字2. 以*号开头的最长通配符名称为例 *.example.org3. 以*号结尾最长通配符的名称,例如 mail.*4. 第一个匹配的正则表达式(出现在配置文件中的顺序)
  1. 尽量使用精确匹配;
  2. 当定义大量server_name或特别长的server_name时,需要在http级别调整server_namenames_hash_max_size和server_names_hash_bucket_size,否则nginx将无法启动。
六、反向代理

反向代理是指用代理服务器接收Internet上的连接请求,然后将请求转发给内部网络上的服务器;并将从服务器上获得的结果返回到请求在Internet上连接的客户端。此时,代理服务器外部显示为服务器。

反向代理服务器通常有两种模型,一种是内容服务器的替身,另一种是内容服务器集群的负载平衡器。

6.1 作为内容服务器的替身

通过访问跳转百度的配置

server {    listen 80;    server_name 192.168.2.193;    location / {        proxy_pass http://www.atguigu.com/ ;    }}

测试访问:192.168.2.193

nginx笔记(一)nginx基础教程_nginx_03

6.2 负载平衡作为内容服务器集群

#定义一组服务器upstreamm httpds{    server 192.168.2.191:80;    server 192.168.8.192:80;} server {    listen 80;    server_name 192.168.2.193;    location / {        proxy_pass http://httpds ;    }}

三种模式

轮询模式(默认):如果后端服务器down丢失,每个请求将按时间顺序逐一分配到不同的后端服务器。

weight权重模式:这种方式比较灵活。当后端服务器性能不同时,可以充分发挥服务器性能,通过配置权重有效利用资源。

upstream httpds{    server 192.168.8.191 weight=10;    server 192.168.8.192 weight=1;    # server 192.168.8.191 weight=10 down; #down表示不参与负载平衡    # server 192.168.8.192 weight=10 backup; #backup表示是备用服务器,当没有服务器可用时使用}

ip_hash:如果客户已经访问了服务器,当用户再次访问时,请求将通过哈希算法自动定位到服务器。每个请求都根据访问ip的hash结果进行分配,以便每个访问者可以通过固定访问后端服务器来解决session不能跨服务器的问题。

upstream httpds {server 192.168.8.191:8080;server 192.168.8.192:8081;ip_hash;}server {listen       80;server_name  localhost;location / {proxy_pass http://httpds;}}
七、动静分离7.1动静分离

为了提高网站的响应速度,减少程序服务器(Tomcat,Jboss等)的负载,对于静态资源,如图片,js、css等文件可以在反向代理服务器中缓存,这样当浏览器要求静态资源时,代理服务器可以直接处理,而无需将请求转发给后端服务器。对于servlet等用户请求的动态文件、jsp,将其转发给Tomcat,Jboss服务器处理,即动态文件与静态文件的分离。

两种方式:

一: 纯粹将静态文件独立成独立域名,放在独立服务器上,也是目前主流推崇的解决方案;

二是动态与静态文件混合发布,通过nginx分开。

动态资源代理

#location配置如下 / {        proxy_pass 路径;}

静态资源代理

#location配置如下 /{    root静态资源路径;    Index默认访问路径下的资源是什么?    autoindex on;#以列表的形式展示静态资源的全部内容。}

配置案例

#user  nobody;worker_processes  1;events {    worker_connections  1024;}http {    include       mime.types;    default_type  application/octet-stream;    sendfile        on;    keepalive_timeout  65;    server {        listen       80;        server_name  localhost;        location / {            proxy_pass http://192.168.2.191:8080;        }        # 静态资源配置        location /images {            root   /www/resources;            index  index.html index.htm;        }        location /js {            root   /www/resources;            index  index.html index.htm;        }        location /css {            root   /www/resources;            index  index.html index.htm;        }        error_page   500 502 503 504  /50x.html;        location = /50x.html {            root   html;        }    }}

在实际使用中,定义了三个匹配规则:

1、直接匹配网站根部,通过域名访问网站主页更频繁,使用这将加速处理,如官方网站。

location = / {    proxy_pass http://192.168.2.191:8080/; }

2、直接转发到后端应用服务器,也可以是静态主页。

location ^~ /static/ {    root /webroot/static/;}location ~* \.(html|gif|jpg|png|css|js|ico)$ {    root /webroot/res/;}

3、一般规则用于将动态请求转发到后端应用服务器。

location /api/ {    proxy_pass http://192.168.2.191:8080/api/}
7.2 URL Rewrite

rewrite是实现URL重写的关键指令。根据regex(正则表达式)的部分内容,重定向到repacement,最后是flag标记。

优点:隐藏真实url和url中可能暴露的参数,以及隐藏web中使用的编程语言,以提高搜索引擎的安全性

缺点:降低效率,影响性能。如果项目用于内部网络,如公司内部软件,则无需配置。

效果:

实际地址:http://192.168.2.192/index.jsp?pageNum=伪地址(访问):http://192.168.2.192/2.html

rewrite语法

根据regexx,rewrite是实现URL重写的关键指令 (正则表达式)部分内容,重定向到replacement,最后是flag标记。语法:rewrite          <regex>         <replacement>         [flag];关键字          正则                 替代内容                 flag标记关键词:关键词不能改变正则:perl兼容正则表达式语句用规则匹配替代内容:用replacementflag标记替换正则匹配的内容:rewrite支持的flag标记rewrite参数的标签段位置:        server,location,if 理解:rewrite  ^  正则 $  书写变更地址,真实地址   转发的形式 (break ,rewrite,last,redirect ,percent )例子:rewrite ^ /2.html $   /index.jsppageNum=2 break;URLRewrite 的关键字  rewrite ,后面是正则表达式,这是正则表达式 ^ 开始,然后用这个$ 结尾, 里面写正则, 写下我们想要改变的地址,这就是flag标记的原始真实地址:last         #本条规则匹配完成后,继续向下匹配新的location URI规则breakak     #本规则匹配完成后终止,不再匹配以下任何规则   #返回302临时重定向,浏览器地址将显示跳转后的URL地址permanentnt #返回301永久重定向,浏览器地址栏将显示跳转后的URL地址redirect 和 perement redirecttt的区别 302  临时重定向将返回 perement  301  返回 永久冲定向。这个 301 和 302 区别,当我们实际上给真正的用户,我们的用户实际上没有区别,它会跳转,然后这个 URL 一切都会改变。这个 301 和 302 区别,当我们实际上给真正的用户,我们的用户实际上没有区别,它会跳转,然后这个 URL 一切都会改变。这种临时重定向和永久重定向是给我们的网络爬虫看的。

配置案例

访问http://localhost/2.html 通过转发返回httpp://192.168.2.191:8080/index.jsp?pageNum=2内容

#user  nobody;worker_processes  1;events {    worker_connections  1024;}http {    include       mime.types;    default_type  application/octet-stream;    sendfile        on;    keepalive_timeout  65;    server {        listen       80;        server_name  localhost;        location / {        rewrite ^/2.html /index.jsp?pageNum=2 break            proxy_pass http://192.168.2.191:8080;        }        error_page   500 502 503 504  /50x.html;        location = /50x.html {            root   html;        }    }}

也可通过正则表达式灵活传参,如下:

#user  nobody;worker_processes  1;events {    worker_connections  1024;}http {    include       mime.types;    default_type  application/octet-stream;    sendfile        on;    keepalive_timeout  65;    server {        listen       80;        server_name  localhost;        location / {        rewrite ^([0-9]+).html$ /index.jsp?pageNum=$1 break            proxy_pass http://192.168.2.191:8080;        }        error_page   500 502 503 504  /50x.html;        location = /50x.html {            root   html;        }    }}

说明:rewrite ^([0-9]+).html$ /index.jsp?pageNum=$1 break

^([0-9]+).html$:匹配所有数字.html;

$1:识别第一个匹配的变量值。

7.3 URL rewrite+负载均衡
#定义一组服务器upstreamm httpds{    server 192.168.2.191:80;    server 192.168.8.192:80;} server {    listen 80;    server_name 192.168.2.193;    location / {        rewrite ^([0-9]+).html$ /index.jsp?pageNum=$1 break        proxy_pass http://httpds ;    }}
八、防盗链

盗链是指服务提供商不提供服务的内容,通过技术手段绕过其他有利可图的最终用户界面(如广告),直接在自己的网站上向最终用户提供其他服务提供商的服务内容,欺骗最终用户的浏览和点击率。受益人不提供资源或很少的资源,但真正的服务提供商不能获得任何好处。

valid_referers 指令,配置是否允许 referer 头部和允许的东西 referer 访问。 192.168.2.193不是ip,而是域名(删除httpp:// 前缀)

location ^~/images/ {            valid_referers 192.168.2.193;             if ($invalid_referer) {  # 注意这里的if,然后添加空格                return 403; ## 返回错误码            }                        root   /www/resources;        }

说明:

none:允许没有 referer 请求访问信息,即通过url直接访问。blocked:请求头referer字段不为空(即存在referer),但值可为空(值被代理或防火墙删除),允许refer不为“http://”或“https:一般来说,开头是允许的“//”http://”或"https以外的请求。**server_names:若 referer 中站域名与 server_name 如果中间域名匹配,请求允许访问其他字符串类型:检测refererer和字符串是否匹配。如果匹配,则允许访问,可以使用一般匹配符*正则表达:如果 referer 值与正则相匹配,允许访问invalid_referer 变量:允许访问时变量值为空,不允许访问时变量值为空 1。

示例

server {    server_name referer.test.com;    listen 80;    error_log logs/myerror.log debug;    root html;    location / {        valid_referers none server_names                       *.test.com www.test.org.cn/nginx/;        if ($invalid_referer) {                return 403; # 返回错误码        }        return 200 'valid\n';    }}# none:表示没有 referer 的可以访问# server_names:表示本机 server_name 也就是 referer.test.com 可以访问# *.test.com:匹配正则的可访问# www.test.org.cn/nginx/:页面发起的请求可以访问
九、keepalived9.1 kepalived简介

keepalived观察它的名字,保持生存,在网络中保持在线,也就是所谓的高可用热备,在集群管理中轻量级保证集群高可用性服务软件的功能与服务软件相似heartbeat,用于防止单点故障(单点故障是指一旦某一点出现故障,就会导致整个系统架构不可用)

9.2 kepalived作用

keepalived主要用作RealServer健康状况检查和LoadBalance主机和BackUP主机之间failover的实现。keepalived它的作用是检测web如果有服务器,如果有服务器的状态web服务器死机,或工作故障,keepalived检测到并出现故障web当服务器从系统中删除时web服务器正常工作后keepalived自动将web服务器加入到服务器组中,所有这些工作都是自动完成的,不需要人工干预,只需要修复故障的web服务器。

9.3 安装9.3.1 安装yum方式

例如,每个服务器都需要安装,

主:192.168.2.191

从:192.168.2.192

yum install -y keepalived

安装后,配置文件目录如下:

/etc/keepalived/keepalived.conf
修改配置文件

keepalived.conf

global_defs {     # 路由id:目前安装keepalived的节点主机标识符,保证全局唯一     router_id keep_171 } vrrp_instance VI_1 { #当前节点所属虚拟路由的名称    # 状态是MASTER主机还是备用机BACKUP     state MASTER     # 本实例绑定的网卡     interface eth0    # 确保主备节点一致     virtual_router_id 51     # 权重,master的权重一般高于backup。如果有很多,那就是选举。谁权重高,谁就当选     priority 100     # 同步检查主备之间的时间间隔,单位秒     advert_int 2     # 认证权限密码,防止非法节点进入     authentication {         auth_type PASS         auth_pass 1111     }     # 虚拟ip,可以有多个(vip)     virtual_ipaddress {         192.168.2.161     }}

修改正常情况 state、interface、virtual_ipaddress就够了。

具体配置如下

主:192.168.2.191

global_defs {     # 路由id:目前安装keepalived的节点主机标识符,保证全局唯一     router_id keep_191 } vrrp_instance VI_1 { #当前节点所属虚拟路由的名称    # 状态是MASTER主机还是备用机BACKUP     state MASTER     # 本实例绑定的网卡     interface eth33    # 确保主备节点一致     virtual_router_id 51     # 权重,master的权重一般高于backup。如果有很多,那就是选举。谁权重高,谁就当选     priority 100     # 同步检查主备之间的时间间隔,单位秒     advert_int 2     # 认证权限密码,防止非法节点进入     authentication {         auth_type PASS         auth_pass 1111     }     # 虚拟ip,可以有多个(vip)     virtual_ipaddress {         192.168.2.161     }}

从:192.168.2.191

global_defs {     # 路由id:目前安装keepalived的节点主机标识符,保证全局唯一     router_id keep_192 } vrrp_instance VI_1 { #当前节点所属虚拟路由的名称    # 状态是MASTER主机还是备用机BACKUP     state BACKUP     # 本实例绑定的网卡     interface eth33    # 确保主备节点一致     virtual_router_id 51     # 权重,master的权重一般高于backup。如果有很多,那就是选举。谁权重高,谁就当选     priority 50     # 同步检查主备之间的时间间隔,单位秒     advert_int 2     # 认证权限密码,防止非法节点进入     authentication {         auth_type PASS         auth_pass 1111     }     # 虚拟ip,可以有多个(vip)     virtual_ipaddress {         192.168.2.161     }}
kepalived命令

启动keepalived启动

systemctl start keepalived

重启keepalived

systemctl restart keepalived

查看状态

systemctl status keepalived
测试
ping 192.168.2.161

ping可以通过

其它测试:停止192.169.2.191主机,192.168.2.161IP漂移到192.169.2.192

十、配置https证书10.1 申请网上证书

以阿里云为例

nginx笔记(一)nginx基础教程_服务器_04

10.2 证书下载

nginx笔记(一)nginx基础教程_nginx_05

选择nginx证书下载,下载后获得两份文件,如下:

nginx笔记(一)nginx基础教程_服务器_06

10.3 证书安装
server{listen 443 ssl;server_name localhost;ssl_certificate .pem文件全路径;ssl_certificate_key .key文件路径}

上一篇 WebChatGPT-让你的ChatGPT不在过时
下一篇 图片上传功能 java(前端代码+后端)

文章素材均来源于网络,如有侵权,请联系管理员删除。

标签: Java教程Java基础Java编程技巧面试题Java面试题