Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器
Nginx可以作为一个Web服务器进行网站的发布,也可以作为反向代理进行负载均衡的实现,还可以作为邮件服务器
常见的Web服务器:Tomcat、Apache、Nginx、WebLogic、Jetty、IIS等
占用内存少,并发能力强(Nginx可处理2-3W并发连接,Apache可处理2-3K并发连接)
国内使用nginx的网站:百度、新浪、网易、腾讯、淘宝、京东等
参考: 官网 http://nginx.org
步骤:
下载nginx认证key文件,并添加到apt-key中
wget http://nginx.org/keys/nginx_signing.key
sudo apt-key add nginx_signing.key
注:添加认证文件是为了让apt包管理器能够认证nginx包
配置apt源,添加nginx软件源
编辑/etc/apt/sources.list文件,在末尾添加如下内容:
sudo vi /etc/apt/sources.list
deb http://nginx.org/packages/ubuntu/ trusty nginx
deb-src http://nginx.org/packages/ubuntu/ trusty nginx
更新apt软件源,并安装nginx
sudo apt-get update # 更新apt软件源
sudo apt-get install nginx # 安装nginx
注:下载的安装文件为nginx_1.14.0-1~trusty_i386.deb
访问测试
http://ip地址
注:nginx默认使用的端口是80
执行whereis nginx
查看
sudo nginx # 启动
sudo nginx -s stop # 停止
sudo nginx -s reload # 重启
ps aux | grep nginx # 查看进程信息
ps -ef | grep nginx # 查看进程信息
sudo netstat -ntpl | grep nginx
主配置文件nginx.conf
#HTTP配置
http {
#虚拟主机的配置
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;
}
}
}
在一台服务器上搭建多个网站,每个网站对应一个Web站点,有独立的域名和目录,称为虚拟主机
Nginx的虚拟主机是通过server节点配置的
步骤:
准备网站目录及测试页面
cd ~
mkdir -p www/ums
echo "welcome to ums
" > www/ums/index.html
mkdir -p www/sms
echo "welcome to sms
" > www/sms/index.html
配置虚拟主机
实现虚拟主机的三种方式:基于不同的IP、不同的端口 或 不同的域名(推荐)
编辑配置文件vi nginx.conf
server {
listen 80;
server_name www.ums.com;
location / {
root /home/soft01/www/ums;
index index.html index.htm;
}
}
server {
listen 80;
server_name www.sms.com;
location / {
root /home/soft01/www/sms;
index index.html index.htm;
}
}
3. 配置域名解析
在客户端主机中配置域名解析,即访问网站的电脑(不是nginx服务器)
域名解析的过程:本机的hosts文件——>DNS
- Windows:C:\windows\system32\drivers\etc\hosts
- Linux/Mac:/etc/hosts
编辑域名解析文件`vi /etc/hosts`
```bash
192.168.0.121 www.ums.com # 将域名映射到对应的服务器IP
192.168.0.121 www.sms.com
注:该方式仅是本地测试时使用,实际应用中要购买注册域名
访问测试
http://www.ums.com
http://www.sms.com
正常请求
客户端发送请求给服务器,服务器接收请求并响应数据
正向代理
概念:位于客户端和原始服务器之间的服务器,为了从原始服务器获取数据,客户端向代理服务器发送请求并指定请求目标(原始服务器) ,然后代理服务器将请求转发给原始服务器,并将响应的数据返回给客户端
正向代理是客户端使用的,对客户端进行代理,客户端知道并主动使用代理服务器
作用:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MzodsLe4-1669467452682)(assets/正向代理.png)]
反向代理
概念:客户端发送请求到服务器(客户端认为是原始服务器,实际上是一台反向代理服务器),反向代理服务器接受请求并将请求转发给内部网络中的集群服务器,并将响应的数据返回给客户端,此时代理服务器对外就表现为一个反向代理服务器
反向代理一般用于服务器集群、分布式部署等情况,实现负载均衡,如淘宝(使用的是封装了Nginx的Tengine)
反向代理是为内部服务器提供代理,对客户端来说是透明的,所以称为反向代理
作用:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kdDq3cnN-1669467452682)(assets/反向代理.png)]
使用Nginx作为反向代理服务器,如反向代理Tomcat
步骤:
配置反向代理
编辑配置文件vi nginx.conf
#后台服务器列表
upstream tomcat_server {
server localhost:8080; #后台服务器,可以有多个
}
server {
listen 80;
server_name www.tomcat.com;
location / {
proxy_pass http://tomcat_server; # 指定代理的后台服务器
}
}
配置域名解析
编辑域名解析文件vi /etc/hosts
192.168.0.121 www.tomcat.com
访问测试
http://www.tomcat.com
将接收到的请求按照一定的规则分发到不同的服务器进行处理,从而提高系统响应和处理速度,称为负载均衡
Nginx可以作为反向代理,实现负载均衡,此时既是反向代理服务器,也是负载均衡服务器
步骤:
准备网站(模拟淘宝,假设有两个后台服务器)
#拷贝两个tomcat
cp -r apache-tomcat-8.5.30 taobao1
cp -r apache-tomcat-8.5.30 taobao2
#修改tomcat的端口
vi taobao1/conf/server.xml
<Server port="8006">
<Connector port="8081">
<Connector port="8010">
vi taobao2/conf/server.xml
<Server port="8007">
<Connector port="8082">
<Connector port="8011"
#修改页面
vi taobao1/webapps/ROOT/index.jsp
<h2>淘宝1</h2>
vi taobao2/webapps/ROOT/index.jsp
<h2>淘宝2</h2>
#启动tomcat
./taobao1/bin/startup.sh
./taobao2/bin/startup.sh
配置负载均衡
编辑配置文件vi nginx.conf
#后台服务器列表
upstream taobao_server {
#默认按轮询方式来分发请求,平均分配
server localhost:8081 weight=7; #weight表示权重,权重越高被分配到的几率就越大
server localhost:8082 weight=3;
}
server {
listen 80;
server_name www.taobao.com;
location / {
proxy_pass http://taobao_server; # 指定代理的后台服务器
}
}
配置域名解析
编辑域名解析文件vi /etc/hosts
192.168.0.121 www.taobao.com
访问测试
http://www.taobao.com 多次刷新页面,查看是哪个后台服务器进行响应的
问题:tomcat在处理静态资源时效率不高,默认情况下所有资源都是由tomcat处理响应的,会导致Web应用响应慢,占用系统资源
解决:将静态资源的请求交由Nginx处理,动态资源(jsp、servlet等)仍由tomcat来处理,实现动静分离
实际上就是将Nginx作为静态资源服务器,通过Nginx来下载静态资源文件
注:Nginx处理静态资源的能力很强,但动态处理能力不行,因此在企业中常使用动静分离技术
步骤:
配置动静分离
编辑配置文件vi nginx.conf
server {
listen 80;
server_name www.taobao.com;
#处理动态资源
location / {
proxy_pass http://taobao_server; # 指定代理的后台服务器
}
#处理静态资源
location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|js|css)$ {
root /home/soft01/www/static;
expires 3d; #在客户端进行缓存,缓存时间为3天
}
}
创建存放静态资源的文件夹,并将静态资源放到该目录中
cd /home/soft01/www/
mkdir static
chmod 777 static #如果报错Nginx 403 forbidden,则设置权限为777
cd /home/soft01/taobao1/webapps/ROOT
cp tomcat.png tomcat.css /home/soft01/www/static/
访问测试
http://www.taobao.com
此时静态资源的请求都是由Nginx进行处理响应的
高并发时如何优化?
几种解决方法:
Session保持:负载均衡进行请求分发时保证每个客户端固定的访问后端的同一台服务器,如Nginx的ip_hash策略
优点:简单,不需要对session做任何处理
缺点:无法保证负载绝对的均衡
缺乏容错性,如果当前访问的服务器发生故障,用户被转移到第二个服务器上时,他的session信息都将失效
Session复制:将每个服务器中的Session信息复制到其它服务器节点,保证session的同步
缺点:如果session量大的话可能会造成网络堵塞,拖慢服务器性能
Session共享:将session放到一个统一的地方,一般推荐放到Memcached或Redis中