目录html
咱们生活的世界中,有的时候须要上网。咱们能够浏览不少不少的网页,这些网页都是由一系列的程序组成,可是咱们是否想过,这些程序存储在什么地方呢?没错,这些程序都是存储在一种名叫服务器的硬件上,好比咱们的电脑也是一种服务器,只不过咱们的我的电脑做为服务器的话性能会比较低。咱们的网页程序存储在服务器硬件上,是否能够随意存储呢?不是的,咱们须要在服务器硬件的操做系统中搭建一个服务器软件,那么这样,有服务器软件跟服务器硬件配合,才造成一个完整的服务器。服务器软件有很是多,好比Apache、tomcat等等都是服务器软件,而咱们今天要学习的Nginx也是一种服务器软件之一。linux
Nginx是一种服务器软件,故而其最主要、最基本的功能固然是能够与服务器硬件结合,让程序员能够将程序放在Nginx服务器上,将程序发布出去,让成千上万的网民能够浏览。除此以外,Nginx是一种高性能的HTTP和反向代理服务器,同时也是一个代理邮件服务器。也就是说,咱们Nginx上能够发布网站,也能够实现负载均衡的功能,还能够做为邮件服务器实现收发邮件等功能。所谓的负载均衡是指,当同时有N多用户访问咱们服务器的时候,为了减小服务器压力,咱们须要将用户分别引入各服务器,分担服务器的压力。nginx
首先说IIS, IIS服务器只能在Windows上运行,Windows服务器性能不如Linux— 类服务器。其次说Tomcat,Tomcat服务器面向的是Java语言,是一种重量级的服 务器,而Nginx是轻量级服务器,Tomcat与Nginx不具有可比性。最后,咱们讲一 下Apache,Apache优势很是多,好比稳定、幵源、跨平台等等,可是Apache不支 持高并发。Nginx能支持处理百万级的TCP链接,10万以上的并发链接,而且是一 个很好的跨平台服务器。c++
Nginx的主要优势有能够实现高并发、部署简单、内存消耗少、成本低等等。程序员
Nginx的主要缺点有rewrite功能不够强大,模块没有Apache的多。web
新建压缩包下载位置(可选)正则表达式
新建目录 mkdir /usr/local/nginx_down 切换目录 cd /usr/local/nginx_down
下载解压 Nginx算法
下载 wget http://nginx.org/download/nginx-1.14.0.tar.gz 解压 tar -zxvf nginx-1.14.0.tar.gz 切换目录 cd nginx-1.14.0
配置 Nginx后端
./configure --with-http_ssl_module
这样会默认安装nginx在 /usr/local/nginx 目录,可使用--prefix=/usr/local/nginx
指定安装位置。tomcat
若是须要HTTPS(SSL)的支持,须要指定参数--with-http_ssl_module
。
若是提示错误,那么须要其它环境,请参考下面
安装 make
yum -y install gcc automake autoconf libtool make
安装 g++
yum -y install gcc gcc-c++
安装 PCRE库
yum -y install pcre pcre-devel
安装 Zlib
yum -y install zlib zlib-devel
安装 GD library
yum -y install gd-devel
安装 openssl
yum -y install openssl openssl-devel
-y:跳过全部手动确认输入
若是./configure
安装成功,只须要再执行两个命令:
make
make install
查看是否安装成功
cd /usr/local/nginx
若是安装成功,则会出现下列目录:
conf html logs sbin
切换到sbin目录
cd /sbin
启动程序
./nginx
追加参数 -c
能够指定配置文件。
在Linux操做系统下搭建Nginx服务器,不少时候会出现不一样的错误,在此,咱们对搭建过程当中出现的错误进行一些总结。主要有这些类型:
防火墙问题,缺乏gc++,缺乏pcre、zlib等库。
咱们有时候,用本身的计算机A想访问国外的某个网站B,可是访问不了,此时,有一台中间服务器C能够访问国外的网站B,那么,咱们能够用本身的电脑访问服务器C,经过C来访问B这个网站。那么这个时候,服务器C称为代理服务器,这种访问方式叫作正向代理。正向代理有一个特色,就是咱们明确知道要访问哪一个网站。再如,当咱们有一个服务器集中,而且服务器集群中的每台服务器的内容同样的时候,一样咱们要直接从我的电脑访问到服务器集中的服务器的时候没法访问,且此时第三方服务器能访问集群,这个时候,我扪经过第三方服务器访问服务器集群的内容,可是此吋咱们并不知道是哪一台服务器提供的内容,此时的代理方式称为反向代理。
当一台服务器的单位时间内的访问量越大的时候,服务器的压力会越大。当一台服务器压力大得超过自身的承受能力的时候,服务器会崩溃。为了不服务器崩溃,让用户有更好地体验,咱们一般经过负载均衡的方式来分担服务器的压力。那么什么是负载均衡呢?是这样,咱们能够创建不少不少个服务器,这些服务器组成一个服务器集群,而后,当用户访问咱们网站的时候,先访问一个中间服务器,再让这个中间服务器在服务器集群中选择一个压力较小的服务器,而后将该访问请求引入该选择的服务器。这样,用户的每次访问,都会保证服务器集群中的每一个服务器的压力趋于平衡,分担了服务器压力,避免了服务器崩溃的状况。
基于反向代理的原理实现负载均衡
Nginx 是一款能够经过反向代理实现负载均衡的服务器,使用 Nginx 服务实现负载均衡的时候,用户的访问首先会访问到 Nginx 服务器,而后 Nginx 服务器再从服务器集群表中选择压力较小的服务器,而后将该访问请求引向该服务器。若服务器集群中的某个服务器崩溃,那么从待选服务器列表中将该服务器删除,也就是说一个服务器假如崩溃了,那么 Nginx 就确定不会将访问请求引入该服务器了。那么下面,咱们经过实例来说解一下 Nginx 负载均衡的实现。
默认配置文件nginx.conf
很重要,咱们通常是新建一个配置文件,在启动时指定加载。
[root@yueshutong conf]# ls //查看目录 fastcgi.conf koi-win scgi_params fastcgi.conf.default mime.types scgi_params.default fastcgi_params mime.types.default uwsgi_params fastcgi_params.default nginx.conf uwsgi_params.default koi-utf nginx.conf.default win-utf [root@yueshutong conf]# touch fzjh.conf //新建负载均衡配置文件
编辑fzjh.conf
配置文件
vi fzjh.conf
worker_processes 1;#工做进程的个数,通常与计算机的cpu核数一致 events { worker_connections 1024;#单个进程最大链接数(最大链接数=链接数*进程数) 并发 } http { include mime.types; #文件扩展名与文件类型映射表 default_type application/octet-stream;#默认文件类型 sendfile on;#开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,若是用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,下降系统的负载。注意:若是图片显示不正常把这个改为off。 keepalive_timeout 65; #长链接超时时间,单位是秒 gzip on;#启用Gizp压缩 #服务器的集群 upstream myproject { #服务器集群名字 server 220.181.111.188:80 weight=1;#服务器配置 weight是权重的意思,权重越大,分配的几率越大。 server 42.121.252.58:80 weight=2; } #当前的Nginx的配置 server { listen 80; #监听80端口,能够改为其余端口 server_name localhost; ############## 当前服务的域名 location / { ##配置路径/下实现负载均衡 proxy_pass http://myproject; ##对应哪一个服务器集群 proxy_redirect default; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; #根目录 } } }
咱们在nginx目录下执行命令,启动负载均衡
./sbin/nginx -c ./conf/fzjh.conf
而后尝试访问你的服务器,多访问几回,你会发现它会访问2次csdn网站,1次百度。说明咱们的负载均衡已经部署完毕。
./sbin/nginx -s reload
1.查看nginx进程号
ps -ef|grep nginx
2.kill掉进程便可 (1709是第二列的进程号)
kill 1709
或者
killall -9 nginx
Upstream 模块是 Nginx 服务器的一个重要模块。 Upstream 模块实如今轮询和客户端 iP 之间实现后端的负载均衡。经常使用的指令有 ip_hash指令、 server 指令和 upstream 指令等,下面咱们分别来说一下。
在负载均衡系统中,假如用户在某台服务器上登陆,那么若是该用户第二次请求的时候,由于咱们是负载均衡系统,每次请求都会从新定位到服务器集群中的一个服务器,那么此时若是将已经登陆服务器A的用户再定位到其余服务器,显然不妥。故而,咱们能够采用 ip_hash指令解决这个问题,若是客户端请求已经访问了服务器A并登陆,那么第二次请求的时候,会将该请求经过哈希算法自动定位到该后端服务器中。下面咱们经过实例讲解。
实例
此时不该该使用weight权重。
http { .... upstream myproject { ip_hash; #实现会话跟踪 server 140.205.140.234; server 61.135.169.125; } .... }
upstream 指令主要是用于设置一组能够在 proxy_pass 和 fastcgi_pass 指令中使用代理服务器,默认负载均衡方式为轮询。
负载均衡的实现方法除了可使用 Nginx服务器实现外,还能够经过不少种方法来实现。负载均衡的核心就是创建一个服务器集群,而后用户首先访问到第三方代理服务器,而后由代理服务器选择一个集群中的服务器,而后将请求引入选定的服务器。那么代理服务器可使用多种方式来充当,故而实现负载均衡的方式也是多种。总的来讲,负载均衡实现的方式分为软件实现和硬件实现两种,若是中间的代理机构是硬件,那么就是经过硬件设备来实现负载均衡的方式,若是中间的代理机构为软件,就是软件实现负载均衡的方式。而其中,软件又能够是服务器软件、系统软件以及应用软件等充当。
下面咱们简单总结一下负载均衡不一样实现方式的优缺点:
假如使用硬件的方式实现负载均衡,那么中间的转发机构就是硬件,这个时候运行的效率很是高,可是对应的成本也很是高。若是咱们采用软件的方式来实现负载均衡,那么中间的转发机构就是软件,这个时候,运行效率不如硬件,可是成本相对来讲低得多。而使用Nginx服务器实现负载均衡,那么就是经过软件的方式来实现负载均衡,而且 Nginx自己支持高并发等。故而使用 Nginx服务器实现负载均衡,能大大节约企业的成本,而且因为 Nginx是服务器软件,其执行效率也是很是高。
location = /uri =开头表示精确匹配,只有彻底匹配上才能生效。
location ^~ /uri ^~ 开头对URL路径进行前缀匹配,而且在正则以前。
location ~ pattern ~开头表示区分大小写的正则匹配。
location ~* pattern ~*开头表示不区分大小写的正则匹配。
location /uri 不带任何修饰符,也表示前缀匹配,可是在正则匹配以后。
location / 通用匹配,任何未匹配到其它location的请求都会匹配到,至关于switch中的default。
1.获取证书
得到SSL证书文件 1_www.domain.com_bundle.crt 和私钥文件 2_www.domain.com.key
2.证书安装
将域名 www.domain.com 的证书文件1_www.domain.com_bundle.crt 、私钥文件2_www.domain.com.key保存到同一个目录,例如/usr/local/nginx/conf目录下。
3.配置conf
打开nginx.conf文件,找到nginx.conf的下段配置内容:
# HTTPS server # #server { # listen 443 ssl; # server_name localhost; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # location / { # root html; # index index.html index.htm; # } #}
打开注释,修改server_name为绑定证书的域名(如:www.domain.com),修改ssl_certificate 为 1_www.domain.com_bundle.crt,修改 ssl_certificate_key 为 2_www.domain.com.key 便可。
4.HTTP自动跳转HTTPS
对于用户不知道网站能够进行https访问的状况下,让服务器自动把http的请求重定向到https。 在服务器这边的话配置的话,能够在页面里加js脚本,也能够在后端程序里写重定向,固然也能够在web服务器来实现跳转。
Nginx是支持rewrite的(只要在编译的时候没有去掉pcre) 在http的server里增长rewrite ^(.*) https://$host$1 permanent;
这样就能够实现80进来的请求,重定向为https了。
仍是在此配置文件中,加入下面一句:
server { listen 80; server_name localhost; rewrite ^(.*) https://$host$1 permanent; ...