Nginx学习

技术分享 Story 111浏览 0评论

Nginx基本概念

1、Nginx是什么,能做什么

Nginx:异步框架的网页服务器,也可以用作反向代理、负载平衡器和HTTP缓存。Nginx可作为静态页面的web服务器,同时还支持CGI协议的动态语言,java程序通过与tomcat配合完成;Nginx专为性能优化而开发,性能是其最重要的考量。

特点:

Nginx可以部署在网络上使用FastCGI脚本、SCGI处理程序、WSGI应用服务器或Phusion Passenger模块的动态HTTP内容,并可作为软件负载均衡器。

Nginx使用异步事件驱动的方法来处理请求。Nginx的模块化事件驱动架构可以在高负载下提供更可预测的性能。

Nginx是一款面向性能设计的HTTP服务器,相较于Apache、lighttpd具有占有内存少,稳定性高等优势。

2、反向代理

1、正向代理

Nginx不仅可以做反向代理,实现负载均衡;还可以用作正向代理实现上网等功能。 正向代理:若将局域网外的Internet想象成资源库,则局域网中的客户端要访问Internet,则需要通过代理服务器来访问。 ![image](https://img2022.cnblogs.com/blog/2530158/202203/2530158-20220320220243453-1334797126.jpg)

2、反向代理

反向代理:客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器的地址,隐藏了真实服务器的IP地址

![image](https://img2022.cnblogs.com/blog/2530158/202203/2530158-20220320220305282-385393522.jpg)

3、负载均衡

负载均衡:增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的 情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡

![image](https://img2022.cnblogs.com/blog/2530158/202203/2530158-20220320220323187-461818662.jpg)

4、动静分离

动静分离:为加快网站的解析速度,可将动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力

![image](https://img2022.cnblogs.com/blog/2530158/202203/2530158-20220320220342181-1445383260.jpg)

Nginx安装、常用命令和配置文件

1、在Linux系统中安装Nginx

(1)安装pcre

解压pcre.tar.gz

进入解压后的目录

执行./configure

执行 make && make install 进行编译和安装

使用pcre-config --version指令可以查看版本号

(2)安装其他依赖

yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel

(3)安装nginx

解压nginx

进入解压后的目录

执行 ./configure检查

执行 make && make install执行安装

安装成功后,再/usr/local目录下有一个nginx目录,该目录下存在sbin目录,用于启动nginx服务器

在nginx/sbin目录下执行./nginx 命令即可启动nginx

ps -ef|grep nginx可以查看是否启动成功

设置开放的端口号 firewall-cmd --add-service=http --permanent firewall-cmd --add-port=80/tcp --permanent

重启防火墙:firewall-cmd --reload

2、设置开机Nginx自启动

1、在系统服务目录里创建nginx.service文件:vim /usr/lib/systemd/system/nginx.service

2、写入内容如下:

[Unit]                # 服务的说明
Description=nginx     # 描述服务
After=network.target  # 描述服务类别
 
[Service]        # 服务运行参数的设置 注意:[Service]的启动、重启、停止命令全部要求使用绝对路径
Type=forking               # 后台运行的形式
ExecStart=/usr/local/nginx/sbin/nginx   # 为服务的具体运行命令
ExecReload=/usr/local/nginx/sbin/nginx -s reload  # 为重启命令
ExecStop=/usr/local/nginx/sbin/nginx -s quit  # 为停止命令
PrivateTmp=true     # 表示给服务分配独立的临时空间
 
[Install]     # 运行级别下服务安装的相关设置,可设置为多用户,即系统运行级别为3
WantedBy=multi-user.target#  

3、设置开机自启动: systemctl enable nginx.service

4、查看nginx状态:systemctl status nginx.service

5、杀死nginx重启nginx: pkill -9 nginx

ps aux | grep nginx
systemctl start nginx

再次查看状态,变成了active,搞定。

6、重启服务器: reboot

7、再次连接后,查看服务状态:systemctl status nginx.service

3、Nginx的常用命令

使用nginx的命令之前,要进入nginx目录:nginx/sbin

查看版本号:./nginx -v

启动nginx:./nginx

关闭nginx:./nginx -s stop

重新加载nginx:./nginx -s reload

4、Nginx的配置文件

nginx的配置文件在nginx/conf目录下:nginx.conf

nginx的组成部分:

全局块:

从配置文件开始到events块之间的内容,主要会设置一些影响nginx服务器整体运行的配置指令,主要包括配置运行Nginx服务器的用户(组),允许生成的worker_process数,进程PID存放路径,日志存放路径和类型以及配置文件的引入等

#Nginx服务器处理服务的关键配置,值越大,可支持的并发数量也越大,但会受到硬件的影响
worker_process 1;

events块:

主要影响Nginx服务器与用户的网络连接,常用的设置包括是否开启对多worker_process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个worker_process可以同时支持的最大连接数等。

events{
#表示支持的最大连接数
worker_connection 1024;
}

http块:

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

http块包括http全局块,server块

http全局块:

配置的指令包括文件的引入,MIME-TYPE定义,日志自定义,连接超时时间,单链接请求数上限

server块:

与虚拟主机有密切联系,

#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 {
  worker_connections  1024;
}
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;
  sendfile       on;
   #tcp_nopush     on;
   #keepalive_timeout 0;
  keepalive_timeout  65;
   #gzip on;
   # 负载均衡的配置
  upstream myserver {
server 192.168.209.130:8001;
server 192.168.209.130:8002;
  }
  server {
      listen       80;
      server_name  192.168.209.130;
       #charset koi8-r;
       #access_log logs/host.access.log main;
       # 反向代理的配置
       # 案例一
       #location / {
       #   root   html;
       #   proxy_pass http://127.0.0.1:8001;
       #   index index.html index.htm;
       #}
       #案例二
       #location ~ /edu/ {
       #   proxy_pass http://127.0.0.1:8001;
       #}
       #location ~ /vod/ {
       #   proxy_pass http://127.0.0.1:8002;
       #}
       # 负载均衡
      location / {
          root   html;
          proxy_pass http://myserver;
          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 {
          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;
   #   }
   #}
}

Nginx配置实例1-反向代理

实现效果:打开浏览器,在浏览器中输入:www.123.com ,跳转到linux系统tomcat主页面

准备工作:

1、在linux系统中安装tomcat,使用默认的端口号:80001(注意查看是否端口被占用)

解压tomcat文件,进入解压后的目录,进入bin目录,执行./startup.sh启动tomcat服务器

开启对外访问的端口号:firewall-cmd --add-port=8001/tcp --permanent

重启防火墙:firewall-cmd --reload

查看所有已添加的端口:firewall-cmd --list-all

访问过程分析:

 

具体实现:

1、在Windows系统的host文件(C:/Windows/System32/drivers/etc/HOSTS)中进行域名和ip对应的配置:192.168.209.130 www.qing.com

2、在Nginx的配置文件中修改

3、重启Nginx,浏览器访问www.qing.com

image-20211201192802853

反向代理2:

实现效果:使用Nginx反向代理,根据访问的路径跳转到不同端口的服务中;Nginx监听9001端口

访问路径:127.0.0.1:9001/edu===>跳转到:127.0.0.1:8001

访问路径:127.0.0.1:9001/vod===>跳转到:127.0.0.1:8002

修改tomcat的端口号

image-20211201194429702

启动两个tomcat

准备一些测试页面

Nginx配置文件中的具体配置

image-20211201195306789

1、= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。

2、~:用于表示 uri 包含正则表达式,并且区分大小写。

3、~*:用于表示 uri 包含正则表达式,并且不区分大小写。

4、^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。 注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~* 标识。

Nginx配置实例2-负载均衡

实现效果:浏览器地址栏输入:http://192.168.209.130/edu/index.html,负载均衡效果是平均分配到8001和8002端口中

准备两台tomcat:8001端口和8002端口,在两台服务器中准备相同的资源

在Nginx配置文件中配置

4 、 nginx 分配服务器策略 第一种 轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。 第二种 weight 权重策略 weigh t 代表权重默认为 1, 权重越高被分配的客户端越多

image-20211201201115748

第三种 ip_hash 每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可解决session共享问题

image-20211201201224448

第四种 fair (第三方) 按后端服务器的响应时间来分配请求,响应时间短的优先分配。

image-20211201201349855

Nginx配置实例3-动静分离

动静分离:将动态请求和静态请求分离开;Nginx处理静态页面,Tomcat处理动态页面

Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用Nginx 处理静态页面,Tomcat处理动态页面。动静分离从目前实现角度来讲大致分为两种, 一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案; 另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。 通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用 Expires 来缓存),我这里设置 3d,表示在这 3 天之内访问这个 URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码 304,如果有修改,则直接从服务器重新下载,返回状态码 200。

动静分离实例

通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义:是给一个资源设定一个过期时间,也就是说无需去 服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用 Expires 来缓存),我这里设置 3d ,表示在这 3 天之内访问这个 URL ,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码 304,如果有修改,则直接从服务器重新下载,返回状态码 200

image-20211202101418915 1 )浏览器中输入地址 http://192.168.209.130/image/01.jpg

root配置的是访问资源所在的路径

Nginx配置实例4-集群

高可用(集群)

集群所需要的软件:Keepalived

准备工作:

两台服务器:130和131,两台服务器中安装Nginx和Keepalived :yum install keepalived -y

keepalived安装完成后,在etc目录下生成keepalived文件夹,存在配置文件keepalived.conf

修改配置文件:keepalived.conf

global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.209.130
  smtp_connect_timeout 30
router_id 127.0.0.1 #主机的路由名称,在/etc/hosts文件中主机(127.0.0.1)对应的名称(配置)
}
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh" # 检测脚本所在路径(配置)
  interval 2 # #(检测脚本执行的间隔
  weight 2 #设置当前服务器的权重
}
vrrp_instance VI_1 {
state MASTER # 标识;主机:MASTER,备份:BACKUP (修改)
interface ens33 # ens33:网卡名字(配置)
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 90 # 主、备机取不同的优先级,主机值较大100,备份机值较小90
advert_int 1 # 心跳间隔
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.209.50 # VRRP H 虚拟地址(配置)
    }
}
在 /usr/local/src 添加检测脚本:nginx_check.sh
#!/bin/bash
A=`ps C nginx no header |wc l`
if [ $A eq 0 ];then
/usr/local/nginx/sbin/nginx #Nginx启动文件所在位置
sleep 2
if [ `ps C nginx no header |wc l` eq 0 ];then
killall keepalived
fi
fi

3 )把两台服务器上 nginx 和 keepalived 启动 启动 nginx ::./nginx 启动 keepalived systemctl start keepalived.service

测试:在浏览器地址栏输入 虚拟 ip 地址 192.168.209.50,此时使用的是Nginx主机,将主机停掉后,再次访问该地址,则使用从机

Nginx原理

Nginx在启动之后有两个线程,一个是master:管理员,用于分配任务,另一个是worker:工作人员,用于执行任务

image-20211202111104153

worker执行任务的方式:当master监控到有任务进入时,会通知所有空闲worker进行任务的争抢

一个 master 和多个 woker 有好处 1 )可以使用 nginx s reload 热部署,利用 nginx 进行热部署操作 2 )每个 woker 是独立的进程,如果有其中的一个 woker 出现问题,其他 woker 独立的,继续进行争抢,实现请求过程,不会造成服务中断

image-20211202112230185

worker 数量与服务器的 cpu 数相等是最为适宜的

连接数 worker_connection 第一个:发送请求,占用了 woker 的几个连接数? 答案: 2个(请求静态资源) 或者 4 个(请求动态资源,连接tomcat,访问数据库)

第二个: nginx 有一 个 master,有四个 woker ,每个 woker 支持最大的连接数 1024 ,支持的最大并发数是多少?  普通的静态访问最大并发数是: worker_connections(1024) * worker_processes(4) / 2  HTTP 作为反向代理来说,最大并发数量应该是 worker_connections(1024) * worker_processes(4) / 4 。

Linux下自定义签发SSL认证,并绑定IP

Linux 系统通过 openssl 命令生成SSL认证证书

  1. 执行命令生成一个key:openssl genrsa -des3 -out ssl.key 1024

    image-20211206100547251

  2. 会要求你输入key文件的密码。不推荐输入,因为以后要给nginx使用,每次reload nginx配置时候都要验证PAM密码,由于生成时候必须输入密码,可以输入后 再删掉。

    mv ssl.key xxx.key
    openssl rsa -in xxx.key -out ssl.key
    rm xxx.key

  3. 根据key文件生成证书请求文件:openssl req -new -key ssl.key -out ssl.csr。以上命令生成时候要填很多信息,可以自定义

  4. 根据2个文件生成crt证书文件:openssl x509 -req -days 3650 -in ssl.csr -signkey ssl.key -out ssl.crt

  5. 若要用pfx 可以用以下命令生成:openssl pkcs12 -export -inkey ssl.key -in ssl.crt -out ssl.pfx

  6. 在需要使用证书的nginx配置文件的server节点里加入以下配置

    server {
      listen 443 ssl;
      server_name localhost; #设置监听的IP或域名
      ssl_certificate     /opt/ca/ssl.crt; #配置ssl.crt文件所在路径
      ssl_certificate_key /opt/ca/ssl.key; #配置ssl.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;
      }
    }

  7. 在浏览器中使用https协议访问即可:

    image-20211206102617222

Windows下使用Nginx配置HTTPS服务器

以Windows 10系统为例。

一、安装OpenSSL

先到http://slproweb.com/products/Win32OpenSSL.html 去下载OpenSSL(根据系统选择32位或者64位版本下载安装)。

然后安装在C:\OpenSSL-Win64下。

然后配置环境变量。在系统环境变量中添加环境变量:

变量名:OPENSSL_HOME

变量值:C:\OpenSSL-Win64\bin;

(变量值为OPENSSL安装位置下的bin目录)

并在Path变量结尾添加一条: %OPENSSL_HOME%

二、安装Nginx

Nginx官网下载Nginx,我这里下载的是 nginx/Windows-1.12.0 这个版本。

把下载好的压缩包解压出来,拷贝其中的nginx-1.12.0目录到c:\下。并将文件夹名字修改为nginx。这样,Nginx就被安装到了c:\nginx目录下。

进入到C:\nginx目录下,双击nginx.exe文件即可启动服务器。在浏览器地址栏输入http://localhost,如果可以成功访问到Nginx的欢迎界面,则说明安装成功。

三、生成证书  

1、首先在Nginx安装目录中创建ssl文件夹用于存放证书。比如我的文件目录为 C:\nginx\ssl

在控制台中执行:

cd C:\nginx\ssl

2、创建私钥

在命令行中执行命令:

openssl genrsa -des3 -out buduhuisi.key 1024     # buduhuisi文件名是自己随便起即可

输入密码后,再次重复输入确认密码。记住此密码,后面会用到。

3、创建csr证书

在命令行中执行命令:

openssl req -new -key buduhuisi.key -out buduhuisi.csr

其中key文件为刚才生成的文件。

执行上述命令后,需要输入一系列的信息。输入的信息中最重要的为Common Name,这里输入的域名即为我们要使用https访问的域名 ,比如我输入的是localhost。其它的内容随便填即可。

以上步骤完成后,ssl文件夹内出现两个文件:buduhuisi.csr 和 buduhuis.key

4、去除密码。

在加载SSL支持的Nginx并使用上述私钥时除去必须的口令,否则会在启动nginx的时候需要输入密码。

复制buduhuisi.key并重命名为buduhuisi.key.org。

在命令行中执行如下命令以去除口令:

openssl rsa -in buduhuisi.key.org -out buduhuisi.key

然后输入密码,这个密码就是上文中在创建私钥的时候输入的密码。

5、生成crt证书

在命令行中执行此命令:

openssl x509 -req -days 365 -in buduhuisi.csr -signkey buduhuisi.key -out buduhuisi.crt

至此,证书生成完毕。我们发现,ssl文件夹中一共生成了4个文件。下面,配置https服务器的时候,我们需要用到的是其中的buduhuisi.crt和buduhuisi.key这两个文件。

四、修改Nginx的nginx.conf配置文件

我的这个文件在C:\nginx\conf目录下。用任意一个编辑器(如Sublime Text之类)打开这个nginx.conf文件。

找到HTTPS server配置的那一段(即包含有listen 443 ssl配置那一段)。我们发现这段代码被注释掉了。所以,首先我们把该段代码前面的#号去掉。然后分别修改其中的ssl_certificate和ssl_certificate_key配置项为刚才所生成的buduhuisi.crt和buduhuisi.key这两个文件的目录。并配置server_name为localhost。修改后的该段配置如下:

server {
  listen       443 ssl;
  server_name localhost;

  ssl_certificate     C://nginx//ssl//buduhuisi.crt; # 这个是证书的crt文件所在目录
  ssl_certificate_key C://nginx//ssl//buduhuisi.key; # 这个是证书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; # 这个是指定首页的文件名
  }
}

注意一下那两个证书的文件路径的写法。

五、Nginx的常用操作

在继续后面的内容之前,先简单介绍下Windows命令行中操作Nginx的几个常用的语句:

start nginx               # 启动Nginx
nginx.exe -s stop         # 快速停止Nginx,可能并不保存相关信息
nginx.exe -s quit         # 完整有序的停止Nginx,并保存相关信息
nginx.exe -s reload       # 重新载入Nginx,当配置信息修改,需要重新载入这些配置时使用此命令。
nginx.exe -s reopen       # 重新打开日志文件
nginx -v                 # 查看Nginx版本

因为修改了配置文件,所以需要退出控制台,并重新打开一个控制台。执行如下命令:

cd c:\nginx
nginx.exe -s quit
start nginx

即退出Nginx,然后再重新启动它。这时候,在浏览器地址栏输入https://localhost并回车。

这时候,你可能看到“您的连接不是私密连接”的提示,单击页面中的“高级”,并接着单击“继续前往m.test.com(不安全)”,就可以看到Nginx的欢迎界面了。说明https服务器已经配置成功了。

如果你只想用https://localhost访问这个https服务器,那么下面的内容你就不用接着往下看了。

但是,也许你可能还想要用一个别的域名(例如:https://m.test.com)来访问这个服务器。那么怎么做呢?这就需要继续往下看了。

六、修改hosts配置,实现域名映射

要想用别的域名来访问上文配置好的https服务器,也很简单,修改hosts配置就可以了。你可以到这里下载一个hosts管理工具——SwitchHosts。安装号好之后,以管理员身份运行它。并添加上一个hosts项:

127.0.0.1  m.test.com

这样,你就可以通过https://m.test.com来访问配置好的https服务器了。

转载请注明:成长的对话 » Nginx学习