Nginx学习

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学习】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块:
与虚拟主机有密切联系,
#usernobody;
worker_processes1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
?
#pidlogs/nginx.pid;
events {
worker_connections1024;
}
http {
includemime.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;
sendfileon;
#tcp_nopushon;
#keepalive_timeout 0;
keepalive_timeout65;
#gzip on;
# 负载均衡的配置
upstream myserver {
server 192.168.209.130:8001;
server 192.168.209.130:8002;
}
server {
listen80;
server_name192.168.209.130;
#charset koi8-r;
#access_log logs/host.access.log main;
# 反向代理的配置
# 案例一
#location / {
#roothtml;
#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 / {
roothtml;
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_page500 502 503 504 /50x.html;
location = /50x.html {
roothtml;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#location ~ \.php$ {
#proxy_passhttp://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#location ~ \.php$ {
#roothtml;
#fastcgi_pass127.0.0.1:9000;
#fastcgi_index index.php;
#fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
#includefastcgi_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 {
#listen8000;
#listensomename:8080;
#server_name somename alias another.alias;
#location / {
#roothtml;
#index index.html index.htm;
#}
#}
# HTTPS server
#server {
#listen443 ssl;
#server_name localhost;
#ssl_certificatecert.pem;
#ssl_certificate_key cert.key;
#ssl_session_cacheshared:SSL:1m;
#ssl_session_timeout 5m;
#ssl_ciphers HIGH:!aNULL:!MD5;
#ssl_prefer_server_ciphers on;
#location / {
#roothtml;
#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的配置文件中修改
Nginx学习
文章图片

3、重启Nginx,浏览器访问www.qing.com
Nginx学习
文章图片

反向代理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的端口号
Nginx学习
文章图片

Nginx学习
文章图片

启动两个tomcat
准备一些测试页面
Nginx配置文件中的具体配置
Nginx学习
文章图片

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配置文件中配置
Nginx学习
文章图片

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

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

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

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

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

集群所需要的软件: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:工作人员,用于执行任务
Nginx学习
文章图片

worker执行任务的方式:当master监控到有任务进入时,会通知所有空闲worker进行任务的争抢
一个 master 和多个 woker 有好处 1 )可以使用 nginx s reload 热部署,利用 nginx 进行热部署操作 2 )每个 woker 是独立的进程,如果有其中的一个 woker 出现问题,其他 woker 独立的,继续进行争抢,实现请求过程,不会造成服务中断
Nginx学习
文章图片

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
    Nginx学习
    文章图片

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

    Nginx学习
    文章图片

  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_namelocalhost; #设置监听的IP或域名
    ssl_certificate/opt/ca/ssl.crt; #配置ssl.crt文件所在路径
    ssl_certificate_key /opt/ca/ssl.key; #配置ssl.key文件所在路径
    ssl_session_cacheshared:SSL:1m;
    ssl_session_timeout 5m;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;
    location / { #配置映射路径
    roothtml;
    index index.html index.htm;
    }
    }

    Nginx学习
    文章图片

  7. 在浏览器中使用https协议访问即可:
    Nginx学习
    文章图片

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 {
listen443 ssl;
server_namelocalhost;
?
ssl_certificateC://nginx//ssl//buduhuisi.crt; # 这个是证书的crt文件所在目录
ssl_certificate_key C://nginx//ssl//buduhuisi.key; # 这个是证书key文件所在目录
?
ssl_session_cacheshared:SSL:1m;
ssl_session_timeout 5m;
?
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
?
location / {
roothtml; # 这个是指定一个项目所在目录
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.1m.test.com

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

    推荐阅读