Nginx学习
1 Nginx简介
1、Nginx 是一个高性能的web服务器和反向代理服务器;(服务器)
2、Nginx 是由俄罗斯人 Igor Sysoev 采用C语言开发编写的,第一个公开版本 0.1.0发布于2004年10月4日;
3、Nginx 特点是占有内存少,并发处理能力强,以高性能、低系统资源消耗而 闻名,Nginx 官方测试为5万并发请求
4、与Nginx同类型的web服务器还有Apache、Lighttpd(音同lighty) 等;
5、Nginx 的并发处理能力在同类型的Web服务器中表现极好(Apache、Lighttpd), 在全世界范围内大量的网站使用了Nginx,国内互联网中也大量使用了Nginx, 比如:淘宝、新浪、搜狐、网易、美团等;
6、国内淘宝基于Nginx开发了一个Tengine,性能也非常优秀;http://tengine.taobao.org/
7、Nginx是免费开源的,同时Nginx也有收费的商业版本,商业版本提供了性能 优化、宕机等紧急问题处理等技术支持和服务;商业版本: http://www.nginx.com,开源版:http://nginx.org
2 正向与反向代理
正向代理:隐藏了真实的请求客户端
反向代理:隐藏了真实的服务端
3 Nginx环境搭建
3.1下载
免费开源版的官方网站:http://nginx.orgNginx 有 windows 版本和 linux 版本,但推荐在 linux 下使用 Nginx;
3.2 安装前准备
Nginx的安装需要Linux安装相关的几个库,否则配置和编译会出现错误;执行如下命令:
yum install gcc openssl openssl-devel pcre pcre-devel zlib zlib-devel -y
3.3 正式安装
1、解压下载下来的nginx文件,执行命令:
tar -zxvf nginx-1.14.2.tar.gz
2、切换至解压后的nginx主目录,执行命令:
cd nginx-1.14.2
3、在nginx主目录nginx-1.14.2下执行命令:
./configure --prefix=/usr/local/nginx (其中--prefix是指定nginx安装路径)
如果需要配置https,或者http反向代理https网址需要http_ssl_module 模块支持
./configure --prefix=/usr/local/nginx --with-http_ssl_module
4、执行命令进行编译:make
5、执行命令进行安装:make install
3.4 启动
1、启动nginx执行命令:
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
(其中-c是指定配置文件)
重启:
/usr/local/nginx/sbin/nginx -s reload
2、检查Nginx是否启动:通过查看进程:
ps -ef | grep nginx
3、Nginx体系结构:
nginx 体系结构由 master 进程和其 worker 进程组成;master 进程读取配置文件,并维护 worker 进程,而 worker 进程则对请求进行实际处理;
3.5 关闭
1、优雅关闭Nginx:
优雅关闭会将已经进来的请求处理完后再关闭;
找出nginx的进程号:ps -ef | grep 执行命令:
kill -QUIT 主pid
其中pid是主进程号的pid(master process),其他为子进程pid(worker process)
2、快速关闭Nginx:
找出nginx的进程号:ps -ef | grep nginx
kill -TERM 主pid
快速关闭会直接关闭,已经进来的请求也不会处理;
3.6 启动前检查
当修改Nginx配置文件后,可以使用Nginx命令进行配置文件语法检查,用于检查Nginx配置文件是否正确;
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf -t
4 Windows环境搭建
在Windows环境下搭建:
1、在官方网站下载最新windows版的nginx
2、将下载下来的nginx压缩包解压到一个目录下,解压后该软件就可以启动使用了 ;
3、启动:进入dos窗口,切换到nginx主目录下,在dos窗口执行命令:
start nginx
4、关闭:进入dos窗口,切换到nginx主目录下,在dos窗口执行命令:
nginx -s stop
5 Nginx配置文件
学习Nginx首先需要对它的核心配置文件nginx.conf有一定的认识;Nginx的核心配置文件主要由三个部分构成:
1、基本配置
2、events配置
3、http配置:基本配置和多个Server配置
6 Nginx主要应用
1、静态网站
2、负载均衡
3、静态代理
4、动静分离
5、虚拟主机
7 静态网站
工作中,我们经常采用Nginx部署静态网站,Nginx十分擅长于对静态资源的处理;如果有一个ace的静态网站,用Nginx进行部署
规则:ip + port 等于 root
1)、地址栏通过http://192.168.92.128:80/就能访问,conf文件需要这样配置
location / {
root /opt/www/ace; #静态文件路径
}
1、访问http://192.168.92.128:80/
2、其实是访问http://192.168.92.128:80/index.html
3、把http访问还原成磁盘的路径,看文件位置是否正确
4、/opt/www/ace + /index.html (能找到该文件,配置就没有问题)
2)、地址栏通过http://192.168.92.128:80/ace就能访问conf文件需要这样配置·
location /ace {
root /opt/www; #静态文件路径
}
1、访问 http://192.168.92.128:80/ace
2、其实是访问 http://192.168.92.128:80/ace/index.html
3、 /opt/www/ + ace /index.html (能找到该文件,配置就没有问题)
8 负载均衡
8.1 负载均衡概述
负载均衡通常是指将请求"均匀"分发到多个不同服务器节点上执行,如图:
8.2 负载均衡的实现方式
1)、硬件负载均衡:
比如 F5、深信服、Array 等;
优点是有厂商专业的技术服务团队提供支持,性能稳定;
缺点是费用昂贵,对于规模较小的网络应用或创业团队成本太高;
2)、软件负载均衡:
比如 Nginx、LVS、HAProxy 等;
优点是免费开源,成本低廉;
8.3 Nginx实现负载均衡
Nginx如何实现负载均衡:(通过在Nginx的nginx.conf文件进行配置即可实现)
配置如下:(配置3步即可):
1、在http模块配置upstream:
upstream www.myweb.com {
server 127.0.0.1:9100 weight=3;
server 127.0.0.1:9200 weight=1;
}
其中weight=1表示权重,用于后端服务器性能不均的情况,访问比例约等于权重之比,权重越大访问机会越多;
upstream用于配置nginx负载均衡,并且它还能对后端服务器的健康状态进行检查,若后端服务器中的一台发生故障,则前端的请求不会转发到该故障的机器;
2、在server模块里配置:
location /myweb {
proxy_pass http://www.myweb.com;
}
其中 www.myweb.com 字符串要和 upstream 后面的字符串相等;
3 、将网站分别在两个Tomcat上进行发布(注意配置3个端口号不要重复),启动Nginx服务器
8.3 Nginx的常用策略
1、轮询(默认)
每个请求轮流分配到不同的后端服务器,如果后端服务器down掉,将自动剔除;
upstream backserver {
server 127.0.0.1:8080;
server 127.0.0.1:9090;
}
2、权重
每个请求按一定比例分发到不同的后端服务器,weight值越大访问的比例越大,用于后端服务器性能不均的情况;
upstream backserver {
server 192.168.0.14 weight=5;
server 192.168.0.15 weight=2;
}
3、ip_hash
ip_hash也叫IP绑定,每个请求按访问ip的hash值分配,这样每个访问客户端会固定访问一个后端服务器,可以解决会话Session丢失的问题;
hash(“124.207.55.82”) % 2 = 0, 1
upstream backserver {
ip_hash;
server 127.0.0.1:8080;
server 127.0.0.1:9090;
}
4、最少连接
web请求会被转发到连接数最少的服务器上;
upstream backserver {
least_conn;
server 127.0.0.1:8080;
server 127.0.0.1:9090;
}
8.4 负载均衡其他几个配置
1、其它所有的非backup机器down的时候,才请求backup机器
upstream backserver {
server 127.0.0.1:9100;
server 127.0.0.1:9200 backup;
}
2、down表示当前的server是down状态,不参与负载均衡
upstream backserver {
server 127.0.0.1:9100;
server 127.0.0.1:9200 down;
}
9 静态代理
9.1 静态代理概述
把所有静态资源的访问改为访问nginx,而不是访问tomcat,因为nginx更擅长于静态资源的处理,性能更好,效率更高;
所以在实际应用中,我们将静态资源比如图片、css、html、js等交给nginx处理,而不是由tomcat处理;
Nginx静态代理如何实现?(通过在Nginx的nginx.conf文件进行配置即可实现)
9.2 Nginx静态代理
首先将web项目中的静态资源(html文件、img文件、css文件)等静态文件或者文件夹,从项目中移动到linux 系统下的某个文件夹下,让Nginx对静态资源进行管理。配置有两种方式
9.3 第一种方式
#当访问静态资源,则从linux服务器/opt/static目录下获取
location~ .*\.(js|css|htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ {
root /opt/static;
}
其中:
1、~ 表示正则匹配,也就是说后面的内容可以是正则表达式匹配;
2、第一个点 . 表示任意字符;
3、* 表示一个或多个字符;
4、. 是转移字符,是后面这个点的转移字符;
5、| 表示或者
6、$ 表示结尾
整个配置表示以 .后面括号里面的这些后缀结尾的文件都由nginx处理;
放置静态资源的目录,要注意一下目录权限问题,如果权限不足,给目录赋予权限; 403错误 chmod 755
9.4 第二种方式
通过在nginx.conf配置文件中配置静态资源所在目录实现,比如:
location ~ .*/(css|js|img|image) {
root /opt/static;
}
1、xxx/css
2、xxx/js
3、xxx/img
4、xxx/image
我们将静态资源放入 /opt/static 目录下,然后用户访问时由nginx返回这些静态资源;
10 动静分离
Nginx的 负载均衡 和 静态代理 结合在一起,我们可以实现动静分离,这是实际应用中常见的一种场景;
动态资源,如jsp由tomcat或其他web服务器完成;
静态资源,如图片、css、js等由nginx服务器完成;
它们各司其职,专注于做自己擅长的事情;
动静分离充分利用了它们各自的优势,从而达到更高效合理的架构;
Nginx在一台Linux上安装一份,可以启动多个Nginx,每个Nginx的配置文件不一样即可.
负载均衡Nginx配置:
upstream www.myweb.com {
server 127.0.0.1:9100 weight=5;
server 127.0.0.1:9200 weight=2;
}
upstream static.myweb.com {
server 127.0.0.1:81 weight=1;
server 127.0.0.1:82 weight=1;
}
location /myweb {
proxy_pass http://www.myweb.com;
}
location ~ .*/(css|js|img|image) {
proxy_pass http://static.myweb.com;
}
两台静态代理服务器Nginx配置:
location ~ .*/(css|js|img|image) {
root /opt/static;
}
注意静态代理的两个Nginx,配置文件中的端口一个为81,另一个为82
11 虚拟主机
11.1 虚拟主机简介
1、虚拟主机,就是把一台物理服务器划分成多个“虚拟”的服务器,这样我们 的一台物理服务器就可以当做多个服务器来使用,从而可以配置多个网站;
2、Nginx提供虚拟主机的功能,就是为了让我们不需要安装多个Nginx,就可以 运行多个网站;
3、Nginx下,一个server标签就是一个虚拟主机;
4、nginx的虚拟主机就是通过nginx.conf中server节点指定的,想要设置多个虚 拟主机,配置多个server节点即可;
11.2 两种配置方式
1、基于端口的虚拟主机配置,使用端口来区分;
server {
listen 8080;
server_name www.myweb.com;
location /aweb {
proxy_pass http://www.aweb.com;
}
}
-----------------------------------------------------
server {
listen 9090;
server_name www.bweb.com;
location /bweb {
proxy_pass http://www.bweb.com;
}
}
2、基于域名的虚拟主机
基于域名的虚拟主机是最常见的一种虚拟主机,基于域名来区分。
server {
listen 80;
server_name www.aweb.com;
location /myweb {
proxy_pass http://www.aweb.com;
}
}
---------------------------------------------------
server {
listen 80;
server_name www.bweb.com;
location /myweb {
proxy_pass http://www.bweb.com;
}
}
11.3 虚拟主机配置实例
1、基于域名的虚拟主机,城市站点网站(举例说明,我们配置三个城市站点)
配置3个Tomcat,每个tomcat一个站点,项目部署在tomcat的ROOT目录下;并且手动的解压缩war包,unzip命令,然后删除war包,这样做的目的是可以通过域名直接访问
2、配置三个虚拟主机
第一种:在nginx.conf文件添加三个server节点,用于配置三个虚拟主机
server {
listen 80;
server_name beijing.myweb.com;
location / {
proxy_pass
http://beijing.myweb.com;
}
}
------------------------------------------------------------
server {
listen 80;
server_name nanjing.myweb.com;
location / {
proxy_pass http://nanjing.myweb.com;
}
}
-------------------------------------------------------------
server {
listen 80;
server_name tianjin.myweb.com;
location / {
proxy_pass
http://tianjin.myweb.com;
}
}
第二种:通过include的方式引入虚拟主机配置
include /usr/local/nginx/conf/vhost/vhost.conf;
将虚拟目录的配置文件加入到”http {}”部分的末尾,与其他server并列;文件是隔开的,配置更清晰,主文件没有那么多server配置;
3、配置每个虚拟主机请求转发所对应的后端服务器
upstream beijing.myweb.com {
server 127.0.0.1:9100;
}
upstream nanjing.myweb.com {
server 127.0.0.1:9200;
}
upstream tianjin.myweb.com {
server 127.0.0.1:9300;
}
如果某一个网站是集群部署,只需追加多个Server即可
4、修改hosts文件,让Linux的ip指向到三个站点的域名
C:\Windows\System32\drivers\etc\hosts
192.168.92.128 beijing.myweb.com
192.168.92.128 nanjing.myweb.com
192.168.92.128 tianjin.myweb.com
6. 通过三个域名可以访问三个网站
http://beijing.myweb.com
http://nanjing.myweb.com
http://tianjing.myweb.com
12 Nginx在项目中的实际应用
假设有一个项目application主要是将 app- web 和 app -dataService 两个web项目进行发布,使用负载均衡和静态代理。
将web 项目分别发布到两台Tomcat上,同时删除掉静态资源。静态资源也由两台Niginx服务器实现静态资源的负载均衡
upstream www.app.com {
server 127.0.0.1:9100 weight=5;
server 127.0.0.1:9200 weight=2;
}
upstream static.app.com {
server 127.0.0.1:81 weight=1;
server 127.0.0.1:82 weight=1;
}
--------------------------------------------------
location /app{
proxy_pass http://www.app.com;
}
location ~ .*/(css|js|img|image) {
proxy_pass http://static.app.com;
}
将代理静态资源的两台服务器,配置如下
location ~ .*/(css|js|img|image) {
root /opt/static;
}
将静态资源放到 static/app/**中