文章目录
Nginx的概念
Nginx(发音同 engine x)是一款轻量级的Web服务器、反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在一个BSD-like 协议下发行。
由俄罗斯的程序设计师Igor Sysoev(伊戈尔·西索夫)开发,供俄罗斯大型的入口网站及搜索引擎Rambler(漫步者)(俄文:Рамблер)使用。
其特点是占有内存少,并发能力强。中国大陆使用nginx的网站用户有:新浪、网易、 腾讯等企业。
优点:
- 占用内存少,并发能力强。
- 专为性能优化而开发,在高连接并发的情况下,能够支持高达 50,000 个并发连接数的响应。
- 支持热部署,可以在不间断服务的情况下,对软件版本进行升级。
应用场景
- http服务器:作为网页静态服务器来使用。
- 虚拟主机:可以实现在一台服务器虚拟出多个网站。例如个人网站使用的虚拟主机。
- 反向代理,负载均衡:当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要使用多台服务器集群,此时可以使用nginx做反向代理。且多台服务器可以平均分担负载,不会出现因某台服务器高负载宕机而导致服务器闲置的情况。
Nginx的安装
- 官方网站:http://nginx.org/
- 我们这里使用1.17.8版本来演示Nginx在Linux系统下的安装。
- Nginx只提供了源代码,所以我们首先需要进行编译。
安装环境配置
因为Nginx是C语言编写的,所以需要配置C语言编译环境 (在联网状态下安装)
# 安装gcc环境
yum install -y gcc-c++
如果执行命令后出现以下提示,则表示yum当前处于锁定状态中:
解决方案:
# 强制关掉yum进程
rm -f /var/run/yum.pid
在编译之前安装第三方的开发包
# PCRE:nginx的http模块使用pcre来解析正则表达式
yum install -y pcre pcre-devel
# zlib:nginx使用zlib对http包的内容进行gzip
yum install -y zlib zlib-devel
# OpenSSL:一个强大的安全套接字层密码库,nginx不仅支持http协议,还支持https
yum install -y openssl openssl-devel
安装Nginx
将Nginx的源码包上传到Linux服务器并进行解压:
# 解压源码包
tar -xvf nginx-1.17.8.tar
进入到解压后的目录nginx-1.17.8
cd nginx-1.17.8
执行命令,生成MakeFile
文件
./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi \
--add-module=/opt/fastdfs-nginx-module/src
# 创建临时文件目录
mkdir -p /var/temp/nginx/client
# 执行make命令进行编译
make
# 安装
make install
Nginx核心配置文件说明
文件路径:/usr/local/nginx/conf/nginx.conf
# work的进程数,默认为1
worker_processes 1;
# 配置影响nginx服务器与用户的网络连接
events {
worker_connections 1024; # 单个work最大并发连接数
}
# http块是配置最频繁的部分,可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能
http {
# 引入mime类型定义文件
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65; # 超时时间
# server 配置虚拟主机的相关参数,可以有多个,一个server就是一个虚拟主机
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;
}
}
}
启动并访问Nginx
# 进入到sbin目录
cd /usr/local/nginx/sbin
# 启动Nginx
./nginx
通过浏览器访问,弹出如下界面则表示启动成功(此处建议关闭防火墙)。
配置虚拟主机
虚拟主机:在一台服务器中,使用Nginx来配置多个网站。
通过端口号与域名来区分不同的网站。
通过端口号区分虚拟主机
在nginx.conf
配置文件中新增一个server
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
# tcp_nopush on;
# keepalive_timeout 0;
keepalive_timeout 65;
# gzip on;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
}
# 配置新的server
server {
listen 81; # 修改端口
server_name localhost;
location / {
root html81; # 重新制定一个目录
index index.html index.htm;
}
}
}
# 复制一份html目录
cp -r html html81
# 重载配置文件
sbin/nginx -s reload
# 访问第一个server
http://192.168.52.100
# 访问第二个server
http://192.168.52.100:81
通过域名区分虚拟主机
域名的概念:
简单理解:网址就是域名,也就是一个网站的地址,由域名提供商提供,一般需要购买。
域名的级别:
- 一级域名
- 例如:
.com
.org
.cn
- 例如:
- 二级域名
- 二级域名:在一级域名前加一级
- 例如:
baidu.com
zhihu.com
- 三级域名
- 例如:
www.baidu.com
image.baidu.com
- 例如:
域名的绑定:
- 一个域名对应一个ip地址,而一个ip地址可以被多个域名绑定。
- 通过DNS服务器解析域名。
配置域名映射:
- 本地测试可以修改windows的hosts文件:
C:\Windows\System32\drivers\etc\hosts
- 如果hosts文件中配置了域名和ip的映射关系,则不需要走dns服务器。
# 配置nginx的域名映射
192.168.52.100 www.ng.com
- 也可以借助工具
SwitchHosts
来修改hosts
SwitchHost下载链接 - 右键以管理员身份运行:
配置域名映射:
配置nginx.conf
文件:
# 通过域名区分虚拟主机
server {
listen 80;
server_name www.t1.com;
location / {
root html-t1;
index index.html index.htm;
}
}
server {
listen 80;
server_name www.t2.com;
location / {
root html-t2;
index index.html index.htm;
}
}
# 创建html-t1和html-t2目录:
cp -r html html-t1
cp -r html html-t2
# 重载nginx
sbin/nginx -s reload
访问:(此前修改了index.html
文件,以区分两个域名访问时的内容)
反向代理
代理的概念
代理可以理解为中介。A和B本来可以直连,中间插入一个C,C就是中介。
刚开始的时候,代理多数是用来帮助内网client
访问外网server
。
客户机在发送请求时,不会直接发送给目的主机,而是先发送给代理服务器,代理服务器接收到客户机请求之后,再向主机发出,并接收目的主机返回的数据再发送给客户机。
正向代理
正向代理代理的是客户端,服务端不知道实际发起请求的是哪一个客户端。
反向代理
而反向代理则恰恰相反——代理服务器端。
反向代理:用代理服务器接收客户端的请求,然后将请求转发给网站内部应用服务器,并将从服务器上得到的结果返回给客户端。
Nginx实现反向代理
Nginx作为反向代理服务器安装在服务端。
作用:接收客户端的请求,转发给应用服务器。
配置步骤:
- 简单的使用2个tomcat实例模拟两台http服务器,分别将tomcat的端口改为8080和8081。
- 启动tomcat
# 启动tomcat
./bin/startup.sh
# 访问两个tomcat
http://192.168.52.100:8080/
http://192.168.52.100:8081/
- 配置反向代理服务器
# 反向代理配置
# upstream中的server是真正处理请求的应用服务器地址
upstream test1{
# 用server定义HTTP地址
server 192.168.52.100:8080;
}
server {
listen 80;
server_name www.test1.com;
location / {
# 利用 proxy_ pass可以将请求代理到upstream命名的HTTP服务
proxy_pass http://test1; # 转发到的地址
index index.html index.htm;
}
}
upstream test2{
# 用server定义HTTP地址
server 192.168.52.100:8081;
}
server {
listen 80;
server_name www.test2.com;
location / {
proxy_pass http://test2;
index index.html index.htm;
}
}
- 重载Nginx
nginx -s reload
- 在本地
hosts
文件中添加域名和ip的映射关系
192.168.52.100 www.test1.com
192.168.52.100 www.test2.com
通过浏览器输入域名,访问Nginx代理服务器,Nginx根据域名将请求转发给对应的目标服务器,作为用户我们看到的是服务器的响应结果页面,在整个过程中目标服务器相对于客户端是不可见的,服务端向外暴露的是Nginx的地址。
负载均衡
负载均衡的概念
当一个请求发送过来时,Nginx作为反向代理服务器,会根据请求找到后面的目标服务器去处理请求,这就是反向代理。
那么,如果存在多台目标服务器的话,应该找哪一台服务器去处理当前的请求呢?
这个合理分配请求到服务器的过程就叫做负载均衡。
为什么使用负载均衡
当系统面临大量用户访问,负载过高时,通常会增加服务器数量来进行横向扩展。负载均衡就是为了分担访问量,将请求合理分发给不同的服务器,避免出现临时的网络堵塞。
负载均衡的策略
轮询方式:
这也是默认策略,每个请求按照时间顺序逐一分配到不同的服务器,如果某一个服务器下线,则自动剔除该服务器。
# 轮询式负载均衡
upstream testServer{
# 用server定义HTTP地址
server 192.168.52.100:8081;
server 192.168.52.100:8082; # 直接在此处配置server即开启了轮询方式的负载均衡
}
server {
listen 80;
server_name www.test.com;
location / {
# 利用proxy_pass可以将请求代理到upstream命名的HTTP服务
proxy_pass http://testServer;
index index.html index.htm;
}
}
权重方式:
可以根据服务器的实际情况调整服务器权重。权重越高分配的请求越多,默认为1。
# 权重式负载均衡
upstream testServer{
# 用server定义HTTP地址
server 192.168.52.100:8081 weight=1; # 使用weight关键字来定义权重
server 192.168.52.100:8082 weight=10;
}