Nginx是一款轻量级、高性能的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。其特点是占有内存少,并发能力强,nginx的并发能力在同类型的网页服务器中表现较好。
Nginx 可以在大多数 Unix Linux OS 上编译运行,并有 Windows 移植版。 Nginx 是一个很强大的高性能Web和反向代理服务,它具有很多非常优越的特性:
在连接高并发的情况下,Nginx是Apache服务不错的替代品。能够支持高达 50,000 个并发连接数的响应。
正向代理代理的是客户端,需要在客户端配置,我们访问的还是真实的服务器地址
反向代理代理的是服务器端,客户端不需要任何配置,客户端只需要将请求发送给反向代理服务器即可,代理服务器将请求分发给真实的服务器,获取数据后将数据转发给你。隐藏了真实服务器,有点像网关。
正向代理与反向代理的区别
最根本的区别是代理的对象不同:
l 正向代理代理的是客户端,需要为每一个客户端都做一个代理服务器,客户端访问的路径是目标服务器。
l 反向代理代理的是真实服务器,客户端不需要做任何的配置,访问的路径是代理服务器,由代理服务器将请求转发到真实服务器。
默认在Linux上安装的Nginx,配置文件在安装的nginx目录下的conf目录下,名字叫做nginx.conf。
nginx.conf 主要由三部分组成
代码语言:javascript
代码语言:javascript
解释
# 全局快
------------------------------------------------------------------------------
#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块
events {
worker_connections 1024;
}
# http块
http {
------------------------------------------------------------------------------# 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;
------------------------------------------------------------------------------
# server块
server {
# server全局块
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
# location块
location / {
root html;
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;
#}
}
# 可以配置多个server块
}
就是配置文件从头开始到 events 块之间的内容,主要设置的是影响nginx服务器整体运行的配置指令比如 worker_process, 值越大,可以支持的并发处理量也越多,但是还是和服务器的硬件相关
events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。
上述例子就表示每个 work process 支持的最大连接数为 1024. 这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置
包括 http 全局块,以及多个 server 块
http 全局块配置的指令包括文件引入、 MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。
每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机
而每个 server 块也分为全局 server 块,以及可以同时包含多个 location 块。
最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。
解释
#这一行表示这个server块监听的端口是80,只要有请求访问了80端口,此server块就处理请求
listen 80;
# 表示这个server块代表的虚拟主机的名字
server_name localhost;
一个 server 块可以配置多个 location 块。
主要作用是根据请求地址路径的匹配,匹配成功进行特定的处理
这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
代码语言:javascript
# 表示如果请求路径是/就是用这个location块进行处理
location / {
root html;
index index.html index.htm;
}
1.cd /usr/local/nginx/sbin/
2.·/nginx 启动
3../nginx -s stop 停止
4../nginx-s quit 安全退出
./nginx -s reload 重新加载配置文件
6.ps aux grep nginx 查看nginx进程
在linux系统上编辑脚本。
vim ./sum/sh
#!/bin/bash
SERVER1_COUNT=0
SERVER2_COUNT=0
SERVER3_COUNT=0
for i in {1..10}; do
RESPONSE=$(curl -s https://abc.web.com/)
if [ $RESPONSE == web01 ]; then
SERVER1_COUNT=$((SERVER1_COUNT + 1))
elif [ $RESPONSE == web02 ]; then
SERVER2_COUNT=$((SERVER2_COUNT + 1))
elif [ $RESPONSE == web03 ]; then
SERVER3_COUNT=$((SERVER3_COUNT + 1))
fi
done
echo "Server 1 received: $SERVER1_COUNT requests"
echo "Server 2 received: $SERVER2_COUNT requests"
echo "Server 3 received: $SERVER3_COUNT requests"
轮询(Round Robin): 这是默认的负载均衡算法。案例如下:
http {
upstream backend {
server 192.168.1.101:8080;
server 192.168.1.102:8080;
server 192.168.1.103:8080;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
}
加权轮询(Weighted Round Robin): Nginx根据每个后端服务器的配置权重将请求分配给服务器。
http {
upstream backend {
server 192.168.1.101:8080 weight=3;
server 192.168.1.102:8080 weight=2;
server 192.168.1.103:8080 weight=1;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
}
最少连接(Least Connections):Nginx会统计每个后端服务器当前的活动连接数,并将请求分配给活动连接数最少的服务器,以实现负载均衡。
http {
upstream backend {
least_conn;
server 192.168.1.101:8080;
server 192.168.1.102:8080;
server 192.168.1.103:8080;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
}
1、根据拓扑图,将节点中的IP配置好。
2、配置Nginx: 配置为支持TCP代理,设置TCP代理的相关配置,包括upstream服务器和监听端口等。
3、在安装web服务器中安装httpd服务,并配置网页的内容(web01、web02、web03)。
4、准备测试环境:准备至少四个服务器,一个作为客户端,一个作为反向代理服务器,三个作为目标服务器。确保服务器之间可以相互访问,并且nginx服务器能够访问到目标服务器。
5、创建测试用例:在客户端服务器上,使用for循环脚本执行连接到nginx服务器的代理端口。验证连接是否成功建立以及数据是否正确传输。
在官网下载nginx安装包,上传到linux进行安装。或者直接配置本地yum源,执行yum install -y nginx进行nginx服务的安装。
进入/etc/nginx/nginx.conf进行nginx文件的配置。配置的命令如下:
worker_processes 1; #开启一个业务进程,默认为1。
events {
worker_connections 1024; ### nginx处理的并发数。
}
###定义TCP模块
stream {
###对接多个后端负载的服务器/业务系统。
upstream backendServer {
### 定义TCP模块上游服务器
server 172.16.100.2:80; ###后端服务器的IP + 端口
server 172.16.100.11:80;
server 172.16.100.17:80;
}
###定义服务器模块。
server {
listen 80; ###本次代理服务监听的端口
### 反向代理upstream
proxy_pass backendServer; ###加载后端服务器模块
}
}
注释:目前centos 7.9版本默认安装版本是1.20.1,但不支持steam模块,我们想做TCP转发,就实现不了。需要做以下配置。
目前centos 7.9版本默认安装版本是1.20.1,但不支持steam模块,我们想做mqtt转发,就实现不了。
1、备份原有的nginx
mv /usr/sbin/nginx /usr/sbin/nginx.bak
cp -r /etc/nginx /etc/nginx.bak
2、下载nginx
wget http://nginx.org/download/nginx-1.20.1.tar.gz && tar xf nginx-1.20.1.tar.gz
3、安装依赖
yum -y install libxml2 libxml2-dev libxslt-devel gd-devel perl-devel perl-ExtUtils-Embed GeoIP GeoIP-devel GeoIP-data
yum -y install --skip-broken gcc gcc-c++ autoconf automake gperftools
yum -y install --skip-broken zlib zlib-devel openssl-devel pcre-devel
4、编译
cd nginx-1.20.1/
./configure --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client\_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/run/nginx.pid --lock-path=/run/lock/subsys/nginx --user=nginx --group=nginx --with-compat --with-debug --with-file-aio --with-google\_perftools\_module --with-http\_addition\_module --with-http\_auth\_request\_module --with-http\_dav\_module --with-http\_degradation\_module --with-http\_flv\_module --with-http\_gunzip\_module --with-http\_gzip\_static\_module --with-http\_image\_filter\_module=dynamic --with-http\_mp4\_module --with-http\_perl\_module=dynamic --with-http\_random\_index\_module --with-http\_realip\_module --with-http\_secure\_link\_module --with-http\_slice\_module --with-http\_ssl\_module --with-http\_stub\_status\_module --with-http\_sub\_module --with-http\_v2\_module --with-http\_xslt\_module=dynamic --with-mail=dynamic --with-mail\_ssl\_module --with-pcre --with-pcre-jit --with-stream=dynamic --with-stream\_ssl\_module --with-stream\_ssl\_preread\_module --with-threads --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D\_FORTIFY\_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -m64 -mtune=generic' --with-ld-opt='-Wl,-z,relro -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -Wl,-E' --with-stream
5、生成nginx二进制文件
make -j2 # 不要输入make install ,会替换现有nginx,造成事故
直接在当前的文件下,输入上面的命令
6、测试,并把新的编译好的文件,复原到原来的目录
查看编译后的版本
./nginx -v
./nginx -t
把编译好的文件,移植到原来安装的目录上。
cd /tmp/nginx-1.20.1
cp objs/nginx /usr/sbin/
到/usb/sbin目录看看,备份的文件是nginx.bak,新移动过去的文件是nginx
现在可以在任何一个位置使用nginx命令查看版本,和检测语法。
根据拓扑图,把web服务器对应的节点的IP进行配置。
yum install -y httpd
vim /var/www/html/index.html
输入web01,接下来:x,保存。其他两台以此类推。
systemctl start httpd
systemctl enable httpd
systemctl status httpd ##查看服务状态
在客户端中访问反向代理节点172.16.100.10。由于在nginx设置监听端口为80,默认访问的端口为80。http服务默认执向80端口。
执行 curl http://172.16.100.10
依次访问web01、web02、web03。
1、根据拓扑图,将节点中的IP配置好。
2、配置Nginx: 配置服务器和监听端口等。
3、在安装web服务器中安装httpd服务,并配置网页的内容(web01、web02、web03)。
4、准备测试环境:准备至少四个服务器,一个作为客户端,一个作为反向代理服务器,三个作为目标服务器。确保服务器之间可以相互访问,并且nginx服务器能够访问到目标服务器。
5、创建测试用例:在客户端服务器上,使用for循环脚本执行连接到nginx服务器的代理端口。验证连接是否成功建立以及数据是否正确传输。
worker_processes 1; ###开启一个业务进程,默认为1。
events {
worker_connections 1024; ### nginx处理的并发数。
}
###定义http模块
http{
###对接多个后端负载的服务器/业务系统。
upstream backendServer {
定义http模块上游服务器,以及相关的权重;
server tweb01.com weight=3;
server tweb02.com weight=2;
server tweb03.com weight=1;
}
###定义服务器模块。
server {
listen 80; ###本nginx代理服务监听的端口
server_name abc.web.com; ###本nginx代理自我解析的域名
location / {
proxy_pass http://backendserver; #本次代理服务映射的后端服务器
proxy_set_header Host $host; #用于获取nginx服务器的ip信息,说明这个流量是哪个nginx服务器转发的
proxy_set_header X-Real-IP $remote_addr; #将客户端的真实IP地址传递给后端服务器,获取请求真实来源。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #显示请求的源IP地址列表
proxy_set_header X-Forwarded-Proto $scheme; #传递客户端请求的协议(HTTP或HTTPS)
}
}
}
将nginx服务器中/etc/hosts文件中加入这行。
172.16.100.2 tweb01.com
172.16.100.2 tweb02.com
172.16.100.2 tweb03.com
172.16.100.10 abc.web.com
根据拓扑图,把web服务器对应的节点的IP进行配置。
将客户端中/etc/hosts文件中加入这行。
vim /etc/hosts
172.16.100.10 abc.web.com
在linux系统上编辑脚本。
vim ./sum/sh
#!/bin/bash
SERVER1_COUNT=0
SERVER2_COUNT=0
SERVER3_COUNT=0
for i in {1..10}; do
RESPONSE=$(curl -s https://abc.web.com/)
if [ $RESPONSE == web01 ]; then
SERVER1_COUNT=$((SERVER1_COUNT + 1))
elif [ $RESPONSE == web02 ]; then
SERVER2_COUNT=$((SERVER2_COUNT + 1))
elif [ $RESPONSE == web03 ]; then
SERVER3_COUNT=$((SERVER3_COUNT + 1))
fi
done
echo "Server 1 received: $SERVER1_COUNT requests"
echo "Server 2 received: $SERVER2_COUNT requests"
echo "Server 3 received: $SERVER3_COUNT requests"
yum install -y httpd
vim /var/www/html/index.html
输入web01,接下来:x,保存。其他两台以此类推。
systemctl start httpd
systemctl enable httpd
systemctl status httpd ##查看服务状态
执行sh sum.sh,查看统计次数。
1、根据拓扑图,将节点中的IP配置好。
2、配置Nginx: 配置服务器和监听端口等。
3、在安装web服务器中安装httpd服务,并配置网页的内容(web01、web02、web03)。
4、准备测试环境:准备至少四个服务器,一个作为客户端,一个作为代理服务器,两个作为目标服务器。确保服务器之间可以相互访问,并且nginx服务器能够访问到目标服务器。
5、创建测试用例:在客户端服务器上,使用for循环脚本执行连接到nginx服务器的代理端口。验证连接是否成功建立以及数据是否正确传输。
worker_processes 1; ###开启一个业务进程,默认为1。
events {
worker_connections 1024; ### nginx处理的并发数。
}
###定义http模块
http {
###对接多个后端负载的服务器/业务系统。
upstream backendServer {
### 定义http模块上游服务器
server tweb01.com:80 weight=3;
server tweb02.com:80 weight=2;
server tweb03.com:80 weight=1;
}
###定义服务器模块。
server {
listen 443 ssl; #本次代理服务监听的端口
server_name abc.web.com; #本nginx代理自我解析的域名
location / {
ssl_certificate /etc/nginx/server.crt; #SSL证书和私钥的路径。
ssl_certificate_key /etc/nginx/server.key; #SSL证书和私钥的路径。
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #这指定了支持的 SSL/TLS 协议版本。
ssl_session_timeout 5m; #这个指令设置 SSL 会话的超时时间。
ssl_ciphers HIGH:!aNULL:!MD5; #这个指令设置允许使用的加密算法(cipher suites)。HIGH 表示使用强安全性的加密算法。!aNULL 和 !MD5 是加密算法的选项,这里表示禁止使用匿名加密(aNULL)和 MD5 散列算法。
ssl_prefer_server_ciphers on; #这个指令启用了服务器端的加密算法优先。这意味着服务器端的加密算法优先于客户端提议的算法,提高了安全性。
location / {
proxy_pass http://backend_servers; #本次代理服务映射的后端服务器
proxy_set_header Host $host; #用于获取nginx服务器的ip信息,说明这个流量是哪个nginx服务器转发的
proxy_set_header X-Real-IP $remote_addr; #将客户端的真实IP地址传递给后端服务器,获取请求真实来源。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #显示请求的源IP地址列表
proxy_set_header X-Forwarded-Proto $scheme; #传递客户端请求的协议(HTTP或HTTPS) }
}
}
注意:这里的证书是open ssl生成的测试证书,只能用于测试。需要将生成的证书放到指定路径,证书的域名是反向代理的域名。
证书配置命令:
openssl genrsa -des3 -out server.key 1024
openssl req -new -key server.key -out server.csr
openssl rsa -in server.key -out server.key
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
将nginx服务器中/etc/hosts文件中加入这行。
vim /etc/hosts
172.16.100.2 tweb01.com
172.16.100.2 tweb02.com
172.16.100.2 tweb03.com
172.16.100.10 abc.web.com
根据拓扑图,把web服务器对应的节点的IP进行配置。
将客户端中/etc/hosts文件中加入这行。
172.16.100.10 abc.web.com
在linux系统上编辑脚本。
vim ./sum/sh
#!/bin/bash
SERVER1_COUNT=0
SERVER2_COUNT=0
SERVER3_COUNT=0
for i in {1..10}; do
RESPONSE=$(curl -s https://abc.web.com/)
if [ $RESPONSE == web01 ]; then
SERVER1_COUNT=$((SERVER1_COUNT + 1))
elif [ $RESPONSE == web02 ]; then
SERVER2_COUNT=$((SERVER2_COUNT + 1))
elif [ $RESPONSE == web03 ]; then
SERVER3_COUNT=$((SERVER3_COUNT + 1))
fi
done
echo "Server 1 received: $SERVER1_COUNT requests"
echo "Server 2 received: $SERVER2_COUNT requests"
echo "Server 3 received: $SERVER3_COUNT requests"
yum install -y httpd
vim /var/www/html/index.html
输入web01,接下来:x,保存。其他两台以此类推。
systemctl start httpd
systemctl enable httpd
systemctl status httpd ##查看服务状态
根据拓扑图,把web服务器对应的节点的IP进行配置。
将客户端中/etc/hosts文件中加入这行。
172.16.100.10 abc.web.com
这里是在第二个实验(http)的基础上做的。
1、根据拓扑图,将节点中的IP配置好。
2、配置Nginx: 配置服务器和监听端口等。
3、在安装web服务器中安装httpd服务,并配置网页的内容(web01、web02、web03)。
4、准备测试环境:准备至少五个服务器,一个作为客户端,一个作为正向代理服务器,一个方向代理服务器、三个作为目标服务器。确保服务器之间可以相互访问,并且nginx服务器能够访问到目标服务器。
5、创建测试用例:在客户端服务器上,使用for循环脚本执行连接到nginx服务器的代理端口。验证连接是否成功建立以及数据是否正确传输。
worker_processes 1; #开启一个业务进程,默认为1。
events {
worker_connections 1024; ### nginx处理的并发数。
}
###定义http模块
http {
include mime.types; #包含 mime.types 文件,用户定义文件扩展名和对应的 MIME 类型。
default_type application/octet-stream; #定义了默认的 MIME 类型。使用 application/octet-stream 作为默认的 MIME 类型。
sendfile on; #启用操作系统的 sendfile 功能,利用操作系统提供的这种高效文件传输方式。
keepalive_timeout 65; #定义客户端与服务器之间 keep-alive 连接的超时时间。
###定义服务器模块。
server {
listen 80; #本次代理服务监听的端口
server_name webnginx.com;本次代理服务器的域名
location / {
resolver 172.16.100.14; #解析域名的DNS服务器地址
proxy_pass http://abc.web.com; #要访问的服务器的IP或者域名
proxy_set_header Host $host; #用于获取nginx服务器的ip信息,说明这个流量是哪个nginx服务器转发的
proxy_set_header X-Real-IP $remote_addr; #将网站真实IP地址传递给客户端,获取请求真实来源。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #显示请求的源IP地址列表
proxy_set_header X-Forwarded-Proto $scheme; #传递访问请求的协议(HTTP或HTTPS) }
}
}
将nginx服务器中/etc/hosts文件中加入这行。
172.16.100.10 abc.web.com
172.16.100.14 webnginx.com
将nginx服务器中/etc/hosts文件中加入这行。
vim /etc/hosts
172.16.100.14 webnginx.com
在linux系统上编辑脚本。
vim ./sum/sh
#!/bin/bash
SERVER1_COUNT=0
SERVER2_COUNT=0
SERVER3_COUNT=0
for i in {1..10}; do
RESPONSE=$(curl -s http://webnginx.com/)
if [ $RESPONSE == web01 ]; then
SERVER1_COUNT=$((SERVER1_COUNT + 1))
elif [ $RESPONSE == web02 ]; then
SERVER2_COUNT=$((SERVER2_COUNT + 1))
elif [ $RESPONSE == web03 ]; then
SERVER3_COUNT=$((SERVER3_COUNT + 1))
fi
done
echo "Server 1 received: $SERVER1_COUNT requests"
echo "Server 2 received: $SERVER2_COUNT requests"
echo "Server 3 received: $SERVER3_COUNT requests"
yum install -y httpd
vim /var/www/html/index.html
输入web01,接下来:x,保存。
systemctl start httpd
systemctl enable httpd
systemctl status httpd ##查看服务状态
执行sh sun.sh
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。