1. 概述
1.1 什么是Nginx
Nginx 是高性能的 HTTP 和反向代理的web服务器,处理高并发能力是十分强大的,能经受高负 载的考验,有报告表明能支持高达 50,000 个并发连接数。
Nginx的特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
Nginx* 由俄罗斯软件工程师 Igor Sysoev 开发,是一款基于类似 BSD 许可的高性能 HTTP 和逆向代理 web 服务器。同时,它还可以提供 IMAP/POP3/SMTP 服务。自 2004 年第一版发布以来市场普及率逐年攀升,目前在许多一线互联网公司和 IT 企业中都得到广泛使用。Nginx 的架构设计非常灵活,有一个非常小巧简洁的内核,其中包含内核模块、基本模块和三方模块。它通过文件静态映射和可配置指令与模块协作,在 HTTP 代理、静态和动态分离、负载均衡、虚拟主机、逆向代理、高速缓存加速、授权访问等各种应用场景中突出高性能、高并发和低内存的显著优势。
1.2 反向代理
在讲解反向代理之前,有必要首先科普一下,什么是正向代理,什么又是反向代理,它们直接的区别是什么?好了,废话不多说,直接上图。
代理服务器如果配置在客户端即为正向代理,如果配置在服务端即为反向代理。某个服务器是正向代理还是反向代理与机器个数没有关系;
正向代理
(1)正向代理代替客户端发送请求,正向代理服务器和客户端对外表现为一个客户端,所以正向代理隐藏了真实的客户端;
(2)正向代理中,客户端知道真正的服务端IP是什么,而服务端并不知真正的道客户端IP是什么;
(3)正向代理一般用来解决访问限制问题;
反向代理
(1)反向代理代替服务器接收请求,反向代理服务器和服务器对外表现为一个服务器,所以反向代理隐藏了真实的服务器;
(2)反向代理中,客户端不知道真正的服务端IP是什么,服务端也不知道真正的客户端IP是什么;
(3)反向代理一般用来提供负载均衡、安全防护等作用;
1.3 负载均衡
随着信息化建设蓬勃发展,用户访问服务的数量,以及业务系统之间的访问数量不断增长,依靠单设备堆硬件的方式已经不能满足高并发、多冗余的新需求,因此负载均衡(LB)已经不再是一个新鲜的话题。
顾名思义,负载均衡是将请求分配到不同服务单元,既可以是同一台服务器的不同进程,也可以是不同服务器,这样既保证服务的高可用性,又保证高并发情况下得响应速度,能够给用户更好的体验。
1.4 动静分离
在我们的软件开发中,有些请求是需要后台处理的,有些请求是不需要经过后台处理的(如:css、html、jpg、js等文件),这些不需要经过后台处理的文件称为静态文件。让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,提高资源响应的速度。
2. Nginx安装
2.1 准备工作
若想运行Nginx,那首先需要安装一些必要的软件,分别为pcre、OpenSSL、zlib等;
(1)PCRE库
PCRE库支持正则表达式。如果我们在配置文件nginx.conf中使用了正则表达式,那么在编译Nginx时就必须把PCRE库编译进Nginx,因为Nginx的HTTP模块需要靠它来解析正则表达式。另外,pcre-devel是使用PCRE做二次开发时所需要的开发库,包括头文件等,这也是编译Nginx所必须使用的。可以这样安装:
sudo apt-get install libpcre3 libpcre3-dev
(2)zlib库
zlib库用于对HTTP包的内容做gzip格式的压缩,如果我们在nginx.conf中配置了gzip on,并指定对于某些类型(content-type)的HTTP响应使用gzip来进行压缩以减少网络传输量,则在编译时就必须把zlib编译进Nginx。zlib-devel是二次开发所需要的库。可以这样安装:
sudo apt-get install zlib1g-dev
(3)OpenSSL
如果服务器不只是要支持HTTP,还需要在更安全的SSL协议上传输HTTP,那么需要拥有OpenSSL。另外,如果我们想使用MD5、SHA1等散列函数,那么也需要安装它。
关于OpenSSL的安装方式可以有两种:一种是直接使用命令行(apt-get)进行安装,一种是在github上下载OpenSSL的源码进行自定义的安装。
命令行形式:
sudo apt-get install openssl libssl-dev
使用apt-get安装,会覆盖系统自带的OpenSSL,若不想覆盖,则可采用自定义的方式.
自定义安装
首先在github上下载OpenSSL的源码,链接地址为:
/* 第1步:拉取OpenSSL源码 */
git clone https://github.com/openssl/openssl.git
/* 第2步:自定义编译OpenSSL */
cd openssl /* 进入OpenSSL源码目录 */
./config shared --prefix=/usr/local/jack/openssl --openssldir=ssl --debug -Wl,-rpath=/usr/local/jack/openssl/lib /* 自定义配置 */
make -j4 /* 编译 */
make -j4 install /* 安装 */
ldd ./apps/openssl /* 查询刚刚编译出来的openssl所依赖的库 */
/* 第3步:修改环境变量 */
vi ~/.bashrc /* 打开文件,添加如下两条环境变量 */
export PATH=/usr/local/jack/openssl/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/jack/openssl/lib:$LD_LIBRARY_PATH
source ~/.bashrc
# shared:表示将OpenSSL编译为共享库
# --prefix=DIR:指定OpenSSL的安装路径,默认路径是:/usr/local,上边的自定义安装路径为:/usr/local/jack/openssl
# --openssldir=DIR:指定OpenSSL的配置文件、证书、秘钥的路径,默认路径为:/usr/local/ssl,上边的自定义配置的路径为:ssl(/usr/local/jack/openssl/ssl)
# --debug:编译OpenSSL时,添加调试符号
# -rpath=DIR:指定动态库的路径,上边配置的动态库路径为:/usr/local/jack/openssl/lib
2.2 安装Nginx
第1步:获取Nginx源码:https://github.com/nginx/nginx.git 第2步:进入Nginx源码目录,分别指向如下几条命令:
./configure --prefix=/usr/local/nginx-1.22.0 --with-http_ssl_module --with-pcre --with-http_stub_status_module
make
make install
# --prefix:指定安装目录
# --with-http_ssl_module:支持https
# --with-pcre:为了支持rewrite的重写功能,必须指定pcre
# --with-http_stub_status_module:支持nginx的状态查询
当执行完make install
命令之后,在/usr/local/下,就会生成一个nginx-1.22.0文件夹,如下:
2.3 配置防火墙
如果想从本地浏览器对Nginx发起访问的话,我们还需要修改防火墙配置,首先我们可以通过命令查看防火墙配置,我们可以查看哪些端口是开放的:
- 查询防火墙的状态
[root@jack:~] firewall-cmd --state
running
- 启动或关闭防火墙服务
root@jack:~# systemctl start firewalld.service
root@jack:~# systemctl stop firewalld.service
- 查询开放的端口号(示例中开放了4个端口号,分别为80、9001、443、8080)
[root@jack:~] firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: enp5s0
sources:
services: dhcpv6-client http https ssh
ports: 80/tcp 9001/tcp 443/tcp 8080/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
- 添加开放的端口号(以设置永久开放的80端口为例)
[root@jack:~] firewall-cmd --add-service=http --permanent
[root@jack:~] firewall-cmd --add-port=80/tcp --permanent
- 重启防火墙
[root@jack:~] firewall-cmd --reload
success
2.4 运行Nginx
进入nginx的安装目录,执行./nginx
[root@jack:~] cd /usr/local/nginx-1.22.0/sbin/
root@jack:/usr/local/nginx-1.22.0/sbin# ls
nginx nginx.old
[root@jack:/usr/local/nginx-1.22.0/sbin] ./nginx
[root@jack:/usr/local/nginx-1.22.0/sbin]
如上,执行完./nginx
命令之后,打开浏览器,输入运行nginx服务器的IP(我的这台Nginx服务器电脑IP为192.168.200.130),即可打开Nginx的欢迎界面:
3. Nginx常用命令
- 启动nginx
root@jack:/usr/local/nginx-1.22.0/sbin# ./nginx
- 通过curl命令读取web信息
root@jack:/usr/local/nginx-1.22.0/sbin# curl -s http://localhost | grep nginx.com
- 重新打开日志文件
root@jack:/usr/local/nginx-1.22.0/sbin# ./nginx -s reopen
- 快速关闭Nginx(可能不保存相关信息,并迅速终止web服务)
root@jack:/usr/local/nginx-1.22.0/sbin# ./nginx -s stop
- 平稳关闭Nginx,保存相关信息,有安排的结束web服务
root@jack:/usr/local/nginx-1.22.0/sbin# ./nginx -s quit
- 重新加载Nginx
root@jack:/usr/local/nginx-1.22.0/sbin# ./nginx -s reload
- 显示 nginx 的版本
root@jack:/usr/local/nginx-1.22.0/sbin# ./nginx -v
nginx version: nginx/1.22.0
- 显示 nginx 的版本,编译器版本和配置参数
root@jack:/usr/local/nginx-1.22.0/sbin# ./nginx -V
nginx version: nginx/1.22.0
built by gcc 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)
built with OpenSSL 1.1.1 11 Sep 2018 (running with OpenSSL 1.1.1h 22 Sep 2020)
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx-1.22.0 --with-http_ssl_module --with-pcre --with-http_stub_status_module
4. Nginx配置文件
路径:/usr/local/nginx-1.22.0/conf
特别注意
(1)此配置文件为 Nginx 安装目录中的配置文件,上面提到的”路径“仅是我安装的Nginx的路径;
(2)配置文件的名称为:nginx.conf,我们对nginx的配置都是通过修改该文件完成的;
配置文件由3部分组成:
第1部分:全局块
从配置文件开始到 events 块之间的内容,主要会设置一些影响nginx 服务器整体运行的配置指令,主要包括配 置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以 及配置文件的引入等。
比如上面第一行配置的:
worker_processes 1;
这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是 会受到硬件、软件等设备的制约。
第2部分:events块
events {
worker_connections 1024;
}
events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,
常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。
上述例子就表示每个 work process 支持的最大连接数为1024。这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。
第3部分:http块
最复杂的部分,包括http全局块、http server块(此部分的内容主要以实例的形式给出,在这里不进行详细的讲解)。
5. Nginx配置实例
5.1 实例1 - 反向代理
1. 实现效果
打开浏览器,在浏览器地址栏输入地址 www.123.com,跳转到linux系统的tomcat主页面中。
2. 准备工作
(1)在linux中安装jdk环境,因为tomcat需要改环境
apt install default-jre
apt install openjdk-11-jre-headless
apt install openjdk-8-jre-headless
(2)在linux系统安装tomcat
tomcat的官网:https://tomcat.apache.org/index.html
下载完成之后,进入tomcat工程目录,执行./startup.sh
即可运行tomcat
(3)对外开放访问的端口 8080
由于tomcat的默认端口为8080,那么要想访问tomcat,则需要对外开放8080端口。
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --reload
(4)测试是否可以打开tomcat
至此,准备工作已完成。
3. 具体实现
(1)在windows系统的 hosts文件中进行域名与IP对应关系的配置
(2)在nginx中进行请求转发的配置(反向)
文件路径:/nginx-1.22.0/conf/nginx.conf (注意:这是安装目录,非源文件目录)
(3)测试
5.2 实例2 - 反向代理
1. 实现效果
(1)使用nginx反向代理,根据访问的路径跳转到不同端口的服务中去;
(2)nginx的监听端口为:9001;
(3)访问 http://192.168.200.130:9001/edu 时跳转到127.0.0.1:8080;
(4)访问 http://192.168.200.130:9001/vod 时跳转到127.0.0.1:8081;
2. 准备工作
(1)准备两个Tomcat服务器,一个8080端口, 一个是8081端口
- 新建两个文件夹,分别命名为tomcat8080和tomcat8080,然后分别将“tomcat”的源码复制到文件夹中;
- 将tomcat0的端口号改为8080,将tomcat1的端口号改为8081,修改路径为:
apache-tomcat-10.0.27/conf/server.xml
......
# 下面的端口号也必须修改,比如一个为8015, 一个8005等,只要不一样即可
<Server port="8015" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
......
# 下面的端口号也必须修改,一个为8080, 一个8081
<Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
......
(2)创建文件夹和测试页面
- 在webapps目录下新建两个文件夹,分别为vod、edu;
- 在vod目录下新建a.html,并输入如下内容:
<h1>jack 8081 port test success!!!!</h1>
- 在edu目录下新建a.html,并输入如下内容:
<h1> jack 8081 port test success!!! </h1>
(3)nginx的配置文件修改
server {
listen 9001;
server_name localhost;
location ~ /edu/ {
proxy_pass http://127.0.0.1:8080;
}
location ~ /vod/ {
proxy_pass http://127.0.0.1:8081;
}
}
(4)配置防火墙,开放9001端口
firewall-cmd --add-port=9001/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-all
(5)分别启动nginx,tomcat8080,tomcat8081
root@jack:/usr/local/nginx-1.22.0/sbin# ./nginx
root@jack:/home/jack/source/tomcat8080/apache-tomcat-10.0.27# ./bin/startup.sh
Using CATALINA_BASE: /home/jack/source/tomcat8080/apache-tomcat-10.0.27
Using CATALINA_HOME: /home/jack/source/tomcat8080/apache-tomcat-10.0.27
Using CATALINA_TMPDIR: /home/jack/source/tomcat8080/apache-tomcat-10.0.27/temp
Using JRE_HOME: /usr
Using CLASSPATH: /home/jack/source/tomcat8080/apache-tomcat-10.0.27/bin/bootstrap.jar:/home/jack/source/tomcat8080/apache-tomcat-10.0.27/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.
root@jack:/home/jack/source/tomcat8080/apache-tomcat-10.0.27#
root@jack:/home/jack/source/tomcat8081/apache-tomcat-10.0.27/bin# ./startup.sh
Using CATALINA_BASE: /home/jack/source/tomcat8081/apache-tomcat-10.0.27
Using CATALINA_HOME: /home/jack/source/tomcat8081/apache-tomcat-10.0.27
Using CATALINA_TMPDIR: /home/jack/source/tomcat8081/apache-tomcat-10.0.27/temp
Using JRE_HOME: /usr
Using CLASSPATH: /home/jack/source/tomcat8081/apache-tomcat-10.0.27/bin/bootstrap.jar:/home/jack/source/tomcat8081/apache-tomcat-10.0.27/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.
root@jack:/home/jack/source/tomcat8081/apache-tomcat-10.0.27/bin#
3. 测试
打开8081端口:
打开8080端口,如下:
5.3 实例3 - 负载均衡
待完善
5.4 实例4 - 动静分离
待完善
5.5 实例5 - https配置
待完善