Nginx基础入门学习笔记
Nginx是一个高性能的HTTP和反向代理web服务器,是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强等。
1. 反向代理
-
正向代理(代理用户)
客户端通过代理服务器访问网外网站。
-
反向代理(代理服务器)
客户端只需要知道反代理服务器的地址,而不需要知道它后面的多个tomcat服务器的地址。
2. 负载均衡
增加服务器的数量,以降低对单个服务器的负载。
负载均衡策略:
添加负载均衡后,要在
location / {...}中加入
proxy_pass http://myserver;。(myserver为定义的负载均衡列表名)
- 轮询:默认方式(缺省配置)
在轮询中,如果服务器down掉了,会自动剔除该服务器。
upstream myserver { server 10.211.55.17:8080; server 10.211.55.17:8081; }
- weight:权重方式
weight参数用于指定轮询几率,weight的默认值为1。weight越大,被访问的比率越大。
upstream myserver { server 10.211.55.17:8080 weight=5; server 10.211.55.17:8081 weight=10; }
- ip_hash:依据ip分配方式
客户端第一次访问到哪个服务器,之后会一直访问同一个服务器。也解决的session不能跨服务器的问题。
upstream myserver { ip_hash; server 10.211.55.17:8080; server 10.211.55.17:8081; }
- least_conn:最少连接方式
把客户端的请求发给连接比较少的服务器,使服务器整体负载相同。
upstream myserver { least_conn; server 10.211.55.17:8080; server 10.211.55.17:8081; }
- fair(第三方):响应时间方式
按照服务器端的响应时间来分配请求,响应时间短的优先分配。
upstream myserver { server 10.211.55.17:8080; server 10.211.55.17:8081; fair; }
- url_hash(第三方):依据URL分配方式
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,配合缓存使用。
upstream myserver { hash $request_uri; server 10.211.55.17:8080; server 10.211.55.17:8081; }
3. 动静分离
把静态资源和动态资源分别放在不同服务器上。
4. 高可用
高可用是为了解决只有一台nginx时,如果此时客户端发送请求,而nginx宕机了,请求就无法到达tomcat的问题。高可用是设置从nginx,如果主nginx宕机了,那么备nginx来实现反代理。
因为两个nginx的ip都是不一样的,所以对外需要一个虚拟ip,keepalived把虚拟ip挂到nginx1上,然后如同一个哨兵,检查nginx1的状态。当nginx1宕机了,keepalived就会把虚拟ip挂到nginx2上。
nginx常用命令
-
cd /usr/local/nginx/sbin
进入nginx目录 -
./nginx -v
查看nginx的版本号
-
./nginx
开启nginx
-
./nginx -s stop
停止nginx
-
./nginx -s reload
重新加载nginx
如果出现下面这种错误,需要用
./nginx -c /usr/local/nginx/conf/nginx.conf指定配置文件重启。此时,nginx目录下的logs目录会生成nginx.pid文件,就可以使用
./nginx -s reload命令重新加载nginx了。
nginx.conf配置文件
nginx.conf配置文件在nginx目录下的conf目录下,内容由全局块、events块和http块三部分组成。
建议拷贝一份nginx.conf,防止出现问题时恢复不了。
1. 全局块
#user nobody;配置用户或者组,默认nobody
worker_processes 1;允许生成的进程数,默认为1。
#error_log logs/error.log;制定日志路径
#pid logs/nginx.pid;指定nginx进程运行文件存放地址
2. events块
worker_connections 1024;支持的最大连接数,默认1024
3. http块
http块由http全局块和server块组成。
- http全局块
include mime.types;配置nginx支持哪些扩展名与文件类型映射表。在nginx/conf/mime.types可查看支持的文件类型。
default_type application/octet-stream;默认文件类型(流),支持很多文件、图片、js/css等。
log_format main自定义文件格式,默认即可。(文件的打印规则)
sendfile on;优化参数,允许sendfile方式传输文件,开启高效传输模式。
#tcp_nopush on;防止网络堵塞。
keepalive_timeout 65;长连接超时时间(单位秒)
#gzip on;开启gzip压缩
- server块(新版本nginx的server块在nginx.conf文件同个目录下的conf.d目录里的default.conf文件)
listen 80;
监听80端口
server_name localhost;
监听的地址
location / { root html; index index.html index.htm; }
在花括号里添加proxy_pass 转发地址;
实现页面转发
nginx配置实例
准备工作:需要在centos7下有jdk1.8,tomcat,nginx等环境。
-
进入tomcat的bin目录,
./startup.sh
启动tomcat服务器。(此目录下./shutdown.sh
为关闭tomcat) -
进入nginx的sbin目录,
./nginx
启动nginx服务器(./nginx -s stop
为关闭)
-
开放8080和80端口
firewall-cmd --add-port=80/tcp --permanent
开放80端口
firewall-cmd --add-port=8080/tcp --permanent
开放8080端口
(怕麻烦可临时关闭防火墙:systemctl stop firewalld.service
(centos7的命令),临时关闭防火墙就不需要重启防火墙了)
CentOS7 关闭和开启防火墙 -
firewall-cmd --reload
重启防火墙(开放新端口后需要重启防火墙)
firewall-cmd --list-all
查看开放的端口
-
此时,如果linux下的tomcat和nginx都启动了的话,在外的浏览器输入linux的ip冒号加80就可以访问nginx主页面,加8080就可以访问tomcat主页面。(linux的ip输入
ifconfig
查看)
一、反向代理
实例1
需求:在浏览器中输入www.123.com,页面跳转到linux系统的tomcat主页面。
- 修改本地的host文件,让其在输入www.123.com跳转到10.211.55.17。
(windows系统的host文件的路径:C:->Windows->System32->drivers->etc->HOSTS)
打开终端:
cd /private/etc
进入/private/etc
sudo vim hosts
进入hosts文件,需要权限(输入本机密码)
回车进入
:wq!
强制保存退出 - 然后在浏览器中输入www.123.com,页面成功跳转到10.211.55.17:80。
- 把http块下面server块里的server_name修改为linux的ip。
- 然后在其下面几行的
location / {...}
中加入proxy_pass http://127.0.0.1:8080;
让其跳转到tomcat的主页面。
:wq
保存退出后,在浏览器输入www.123.com
成功跳转到tomcat的主页面。
- 如果输入
www.123.com
后是nginx的主页面,请到nginx的sbin目录下输入./nginx -s reload
重启nginx服务器,如果清除浏览器的缓存。
实例2
需求:根据访问的路径跳转到不同端口的服务中
nginx监听8888端口
访问 http://10.211.55.17:8888/edu/a.html 跳转到127.0.0.1:8080/edu/a.html
访问 http://10.211.55.17:8888/vod/a.html 跳转到127.0.0.1:8081/vod/a.html
- 需要两个tomcat来实现我们的需求,所以解压我们的tomcat包。
- 进入tomcat2的conf目录,修改配置文件server.xml,让两个tomcat不冲突。
这里以我的配置文件行数为例(一共需要改三处):
-
修改22行,把8005改为8015。
-
修改69行,把8080改为8081。
-
修改119行,把8009改为8019。(注释也改,以防后面需要用到而忘改。)
-
然后进入两个tomcat的bin目录,
./startup.sh
分别启动两个tomcat,进入nginx的sbin目录,./nginx
启动nginx。 -
添加8081端口。
firewall-cmd --add-port=8081/tcp --permanent
开放8081端口
firewall-cmd --add-port=8888/tcp --permanent
开放8888端口
firewall-cmd --reload
重启防火墙
firewall-cmd --list-all
查看开放的端口
-
在浏览器测试
-
页面能打开后,我们需要新建目录和网站,用于等会不同路径的页面跳转。进入tomcat的webapp目录。
第一个tomcat新建edu目录,在目录下新建a.html,
-
第二个tomcat新建vod目录,在目录下新建a.html。
准备工作完成,接下来配置nginx。
- 进入nginx/conf/nginx.conf配置文件。
改为
87 server { 88 listen 8888; 89 server_name 10.211.55.17; 90 91 location ~ /edu { 92 proxy_pass http://127.0.0.1:8080; 93 } 94 location ~ /vod { 95 proxy_pass http://127.0.0.1:8081; 96 } 97 }
-
打开浏览器输入10.211.55.17:8888,跳转成功。
-
访问 http://10.211.55.17:8888/edu/a.html跳转到127.0.0.1:8080/edu/a.html,跳转成功。
-
访问 http://10.211.55.17:8888/vod/a.html跳转到127.0.0.1:8081/vod/a.html,跳转成功。
二、负载均衡
需求:浏览器中输入http://10.211.55.17/edu/a.html,实效负载均衡的效果,平均8080和8081端口中。
准备工作:在两个tomcat的webapp目录下分别创建edu目录,在edu目录下创建a.html(之前8080的tomcat已经有edu和a.html了,所以只要在8081的tomcat创建就可以了)。
- 修改nginx.conf配置文件
35 upstream myserver { 36 server 10.211.55.17:8080; 37 server 10.211.55.17:8081; 38 39 } 40 41 server { 42 listen 80; 43 server_name 10.211.55.17; 44 45 #charset koi8-r; 46 47 #access_log logs/host.access.log main; 48 49 location / { 50 proxy_pass http://myserver; 51 root html; 52 #proxy_pass http://127.0.0.1:8080; 53 index index.html index.htm; 54 }
- 重启nginx。(
./nginx -s reload
) - 在浏览器输入http://10.211.55.17/edu/a.html,刷新几次会发现页面在8080和8081之间切换。
三、动静分离
准备工作:- 新建一个data目录,在里面新建www和image两个目录,在www目录中新建一个a.html用于测试。
2. 在Mac的终端往linux的data/image目录复制图片。
scp o1.jpeg root@10.211.55.17:/data/image
配置nginx.conf文件:
- 修改nginx.conf文件
40 server { 41 listen 80; 42 server_name 10.211.55.17; 43 44 #charset koi8-r; 45 46 #access_log logs/host.access.log main; 47 48 location /www/ { 49 root /data/; 50 index index.html index.htm; 51 } 52 location /image/ { 53 root /data/; 54 autoindex on; 55 }
- 重启nginx。
- 在浏览器中输入http://10.211.55.17/image/,显示出image目录下的内容。
- 点击o1.jpeg成功跳转。
- 输入http://10.211.55.17/www/a.html,成功跳转。
四、高可用集群
需要两台nginx,一个keepalived脚本,一个虚拟ip。
准备工作:- 两台nginx分别需要对应的linux系统(虚拟机直接使用连接克隆,可以快速获得一台一样的linux)。
- 如果使用克隆,需要把第二台linux中nginx.conf的监控路径改成新的ip。
- 启动两台nginx,然后在浏览器中测试。
- 在两台服务器上安装keepalived。
yum install keepalived -y
安装keepalived
rpm -q -a keepalived
查看安装的keepalived版本
修改配置文件:
- 先修改主机的keepalived的配置文件。(keepalived配置文件在/etc/keepalived/下)
加了注释的都是需要改或者重要的(建议先备份一份keepalived.conf)。
1 ! Configuration File for keepalived 2 3 global_defs { #全局定义 4 notification_email { 5 acassen@firewall.loc 6 failover@firewall.loc 7 sysadmin@firewall.loc 8 } 9 notification_email_from Alexandre.Cassen@firewall.loc 10 smtp_server 192.168.200.1 11 smtp_connect_timeout 30 12 router_id LVS_DEVEL 13 vrrp_skip_check_adv_addr 14 vrrp_strict 15 vrrp_garp_interval 0 16 vrrp_gna_interval 0 17 router_id 10.211.55.17 #访问到本服务器 18 } 19 20 vrrp_script chk_hhttp_port { #检测脚本和权重的参数 21 script "/usr/local/src/nginx_check.sh" #检测监本(先写个路径,等会再写脚本) 22 interval 2 #检测脚本执行的间隔 23 weight 2 #权重 24 } 25 26 vrrp_instance VI_1 { 27 state MASTER #主,备份服务器为BACKUP 28 interface eth0 #网卡,ifconfig查看ip冒号前面为网卡 29 virtual_router_id 51 #主、备的virtual_router_id必须相同 30 priority 100 #优先级,主机的优先级大,备机小 31 advert_int 1 32 authentication { 33 auth_type PASS 34 auth_pass 1111 35 } 36 virtual_ipaddress { 37 10.211.55.100 #VRRP H虚拟地址 38 } 39 } 40 # 下面可不需要,可以都删了或者注释了
- 然后进入/usr/local/src/,新建nginx_check.sh文件。(这里因为使用的是root用户,所以有执行权限。如果是其他用户,需要先给权限)
1 #!/bin/bash 2 A=`ps -C nginx -no-header |wc -l` 3 if [ $A -eq 0 ];then 4 /usr/local/nginx/sbin/nginx 5 sleep 2 6 if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then 7 killall keepalived 8 fi 9 fi
-
修改备机的keepalived的配置文件。
和上面的代码有三处不同:-
把17行的
10.211.55.17
换成10.211.55.20
- 把27行的
MASTER
改为BACKUP
- 把30行的
100
改为90
- (用ifconfig查看网卡,如果网卡不同需要改28行)
-
然后进入/usr/local/src/,新建nginx_check.sh文件,复制上面代码。
-
重启两台nginx。
-
先启动nginx再启动keepalived。
systemctl start keepalived.service
ps -ef | grep keepalived
查看keepalived进程。
-
然后在浏览器输入10.211.55.100,页面成功加载出来。
-
把主机的nginx停止,清除缓存然后重新访问。
./nginx -s stop
停止nginx
keepalived.conf配置文件
-
global_defs:全局配置
最重要是:router_id。通过这个id可以访问到这个服务器,写本机ip。 -
vrrp_script:脚本配置
script:执行的检测脚本。 - interval:检测脚本的执行间隔(单位秒)
- weight:权重
vrrp_instance VI_1:虚拟ip配置
-
state:服务器类型。(主服务器为MASTER,备份服务器为BACKUP)
advert_int:检测服务器是否存活的时间间隔,默认1秒(单位秒)
authentication { #权限校验
auth_type PASS #格式为密码
auth_pass 1111 #密码为1111
}
virtual_ipaddress { #可绑定多个虚拟ip
10.211.55.100 #VRRP H虚拟地址
}
nginx原理
-
master和worker
nginx启动后会有master和worker两个进程。master只有一个,worker可以有多个,master负责管理分配任务,worker负责执行master分配下来的任务。
-
worker的工作过程
当client发送请求,首先到master,然后master把请求分担给worker,多个worker采用争抢的方式决定哪个worker获得请求,然后反向代理调用tomcat。
-
一个master和多个worker的好处
可以使用nginx -s reload
热部署(nginx不需要停止就可以让改过的配置文件生效)。 - 每个worker都是独立的进程,不需要加锁,其中如果有一个worker出现问题,其他worker可以继续进行争抢,实现请求过程,保证服务不被中断。
worker数和服务器的cpu数相同最合适。
连接数worker_connection
发送请求,占用了worker的几个连接数?
答案:2个或者4个。
情况一:如果请求只要静态资源,那么请求到worker,然后worker把资源响应回去,一来一回为2个。
情况二:如果请求需要数据库的数据,那么发送请求到worker,worker发送给tomcat,让tomcat去数据库拿数据,然后,tomcat把数据给worker,worker再把数据响应给客户端,除了之前两个,还有和tomcat一来一回的两次。
nginx有一个master,有四个worker,每个worker支持最大的连接数据为1024,支持的最大并发数是多少?
答: worker最大支持的连接数:4 * 1024
最大并发数:最大连接数 / (2或4)
- 普通的静态访问最大并发数是:worker_connection * worker_processes / 2
- 如果是HTTP作为反代理来说,最大并发数是:worker_connection * worker_processes / 4
学习视频:
https://www.bilibili.com/video/BV1zJ411w7SV?p=1
- ArcGIS API for Silverlight 入门学习笔记(三):基础地图实例
- Python学习入门笔记-基础知识
- [原]java专业程序代写(qq:928900200),学习笔记之基础入门<Hibernate_实战演练>(三十七)
- Spring框架学习笔记1:Spring简介,入门示例和Spring基础
- java 从零开始,学习笔记之基础入门<网络编程_带QQ模拟功能>(二十)
- [原]java专业程序代写(qq:928900200),学习笔记之基础入门<Oracle_函数_触发器_游标_存储过程_视图>(三十五)
- [cocos2d-x学习笔记][入门基础]Box-2d物理引擎的使用02制作一个简易的愤怒小鸟Demo
- 【百度文库课程】Java语言基础与OOP入门学习笔记一
- java 从零开始,学习笔记之基础入门<重载_覆盖_继承>(十)
- [原]java专业程序代写(qq:928900200),学习笔记之基础入门<SQL_Server_常用查询>(二十二)
- [原]java专业程序代写(qq:928900200),学习笔记之基础入门<javascript>(三十)
- Hadoop学习笔记—2.不怕故障的海量存储:HDFS基础入门
- Hadoop基础入门学习笔记(基本概念)
- [cocos2d-x学习笔记][入门基础]使用loardingbar创建怪物hp条
- java 从零开始,学习笔记之基础入门<Oracle_基础>(三十三)
- java 学习笔记(入门篇)_java的基础语法
- java 从零开始,学习笔记之基础入门<数组>(七)
- java 从零开始,学习笔记之基础入门<内部类>(十四)
- java 从零开始,学习笔记之基础入门<线程及实例分析>(十九)
- [原]java专业程序代写(qq:928900200),学习笔记之基础入门<JDBC>(二十四)