nginx

认识nginx

了解nginx

Nginx (engine x)采用C语言开发编写的,是一个高性能的Web服务器和反向代理服务器,也可以作为邮件代理服务器。
Nginx 特点是占有内存少,并发处理能力强,以高性能、低系统资源消耗而闻名,Nginx官方测试为5万并发请求。与Nginx同类型的Web服务器还有Apache、Lighttpd(音同lighty)、Tengine(阿里巴巴的) 等。

正向代理和反向代理概念

反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器;

正向代理类似一个跳板机,代理访问外部资源。比如:我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器,它能访问那个我不能访问的网站,于是我先连上代理服务器,告诉它我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。

综上所述:正向代理代理对象是客户端,反向代理代理对象是服务端
软件层面一般常用Nginx来做反向代理服务器,它的性能非常好,用来做负载均衡。

Linux安装nginx

安装nginx步骤

安装前准备

安装前需要确定Linux安装一下几个库:gcc、openssl、pcre、zlib
一次性安装命令:

yum install gcc openssl openssl-devel pcre pcre-devel zlib zlib-devel -y

如果已经安装,则不会重复安装,会跳过;如果有需要升级的库,则会下载升级包安装

检查是否安装,例如检查gcc是否安装:
yum list installed | grep gcc
其他检查一样,将gcc换成对应的库即可

单个安装:
gcc编译器安装
yum install gcc -y
openssl库安装
yum install openssl openssl-devel -y
pcre库安装
yum install pcre pcre-devel -y
zlib库安装
yum install zlib zlib-devel -y

正式安装

  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安装路径) 注意:等号左右不要有空格
    注意:如果安装步骤3执行完后出现下面情况,可以忽略,继续向下执行
Configuration summary
  + using system PCRE library
  + OpenSSL library is not used
  + using system zlib library
  1. 执行命令进行编译:make
  2. 执行命令进行安装:make install
    这时候才算安装成功,切换到/usr/local/nginx目录下,查看内容
    nginx_第1张图片

配置文件说明(注意每一行最后的“;”不要忽略)

#配置worker进程运行用户 nobody也是一个linux用户,一般用于启动程序,没有密码
#user  nobody;  
#配置工作进程数目,根据硬件调整,通常等于CPU数量或者2倍于CPU数量
worker_processes  1;  

#配置全局错误日志及类型,[debug | info | notice | warn | error | crit],默认是error,左侧的级别兼容右侧的级别
error_log  logs/error.log;  
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

pid        logs/nginx.pid;  #配置进程pid文件 


###====================================================


#配置工作模式和连接数
events {
    worker_connections  1024;  #配置每个worker进程连接数上限,worker_connections 连接上限是65535个请求 ,nginx支持的总连接数就等于worker_processes * worker_connections
}

###===================================================


#配置http服务器,利用它的反向代理功能提供负载均衡支持
http {
    #配置nginx支持哪些多媒体类型,可以在conf/mime.types查看支持哪些多媒体类型,文件内容左侧是文件名,右侧是文件扩展名
    include       mime.types;  
    #默认文件类型 流类型,可以理解为支持任意类型,文件数据以流类型返回
    default_type  application/octet-stream;  
    #配置日志格式 
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #配置access.log日志及存放路径,并使用上面定义的main日志格式,打开当前日志配置,需要打开上面的日志格式配置
    #access_log  logs/access.log  main;

    sendfile        on;  #开启高效文件传输模式
    #tcp_nopush     on;  #防止网络阻塞(重点),默认被注释,在项目上线时,打开当前配置

    #keepalive_timeout  0;
    keepalive_timeout  65;  #长连接超时时间,单位是秒

    #gzip  on;  #开启gzip压缩输出(重点),项目上线时打开配置。提高服务响应速度,网络传输是IO流的形式,压缩输出可以减少访问的体积,去掉多余部分(像空格之类的)
	
	###-----------------------------------------------
	

    #配置虚拟主机,一个server相当于一个计算机
    server {
        listen       80;  #配置监听端口
        server_name  localhost;  #配置服务名,通常使用域名倒写

        #charset koi8-r;  #配置字符集

        #access_log  logs/host.access.log  main;  #配置本虚拟主机的访问日志

	#默认的匹配斜杠/的请求,当访问路径中有斜杠/,会被该location匹配到并进行处理,请求拦截规则,类似于Tomcat
        location / {
	    #root是配置服务器的默认网站根目录位置,默认为nginx安装主目录下的html目录
            root   html;  
	    #配置首页文件的名称
            index  index.html index.htm;  
        }		

        #error_page  404              /404.html;  #配置404页面
        # redirect server error pages to the static page /50x.html
        #error_page   500 502 503 504  /50x.html;  #配置50x错误页面
        
	#精确匹配,直接寻找50x.html文件
	location = /50x.html {
            root   html;
        }

		#PHP 脚本请求全部转发到Apache处理
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

		#PHP 脚本请求全部转发到FastCGI处理
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

		#禁止访问 .htaccess 文件
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }

	
	#配置另一个虚拟主机
    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


	#配置https服务,安全的网络传输协议,加密传输,端口443,运维来配置
	#
    # 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;
    #    }
    #}
}

启动与关闭nginx

启动

方式一:安装目录的sbin文件夹下执行命令:./nginx
方式二:配置文件启动,执行安装目录下sbin文件加下的nginx+conf文件夹下的nginx.conf文件,如下:
假设在sbin目录下
./nginx -c /usr/local/nginx/conf/nginx.conf
-c 表示这之后指定配置文件路径,配置文件路径必须指定绝对路径
./nginx 也可以使用绝对路径

关闭

使用杀死进程的方式关闭nginx
查找nginx进程:ps -ef | grep nginx
在这里插入图片描述
这里端口号108371是父进程,杀掉父进程同时可以杀掉子进程。
杀死进程命令:kill 108371
强制杀死进程:kill -9 108371

执行完成后再使用ps -ef | grep nginx 检查是否关闭nginx

部署静态网站

修改配置文件

修改配置文件中的http–>server–>location(注意每一行最后的“;”不要漏掉)
原文:

server {
	listen 80;#端口号
	server_name  localhost;#请求地址,一般使用域名倒写
	location / {
		root html;
		index  index.html index.htm;
	}
}

修改:location 后面跟的是请求,root后面是静态资源存放的位置

server{
	listen 80;#端口号
	server_name  localhost;#请求地址,一般使用域名倒写
	location / {
		root html;
		index  index.html index.htm;
	}
	location /ace {
		root /opt/static/ace;
		index  index.html index.htm;
	}
}

关于访问的解释:
http://IP地址:80/ = root = /opt/static/ace
http://IP地址:80/ace = root/ace = /opt/static/ace/ace (这里就是说在static/ace目录下还要有个文件夹ace)

上传静态文件资源

在/opt/static/ace/ace目录下上传静态文件资源,index.html一定放在这个文件夹下,不然找不到

启动nginx,访问

切换到nginx安装目录的sbin目录,启动nginx命令:./nginx
在外部浏览器访问:IP地址:80/ace
注意:这里80 可以省略,能正常访问

补充:location匹配顺序

在没有标识符的请求下,匹配规则如下:

  1. nginx服务器首先在server块的多个location块中搜索是否有标准的uri和请求字符串匹配。如果有多个标准uri可以匹配,就匹配其中匹配度最高的一个location。
  2. 然后,nginx在使用location块中,正则uri和请求字符串,进行匹配。如果正则匹配成功,则结束匹配,并使用这个location处理请求;如果正则匹配失败,则使用标准uri中,匹配度最高的location。

备注:

  1. 如果有精确匹配,会先进行精确匹配,匹配成功,立刻返回结果。
  2. 普通匹配与顺序无关,因为按照匹配的长短来取匹配结果。
  3. 正则匹配与顺序有关,因为是从上往下匹配。(首先匹配,就结束解析过程)
  4. 在location中,有一种统配的location,所有的请求,都可以匹配,如下:
location  / {
  # 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求
  # 但是正则和最长字符串会优先匹配
}	

结合标识符,匹配顺序如下:
(location =) > (location 完整路径) > (location ^~ 路径) > (location ,* 正则顺序) > (location 部分起始路径) > (location /)

(精确匹配)> (最长字符串匹配,但完全匹配) >(非正则匹配)>(正则匹配)>(最长字符串匹配,不完全匹配)>(location通配)

负载均衡

概述

负载均衡通常是指将请求"均匀"分摊到集群中多个服务器节点上执行,这里的均匀是指在一个比较大的统计范围内是基本均匀的,并不是完全均匀。

实现方式

硬负载均衡

比如 F5、深信服、Array 等
优点是有厂商专业的技术服务团队提供支持,性能稳定
缺点是费用昂贵,对于规模较小的网络应用成本太高

软负载均衡

比如 Nginx、LVS、HAProxy 等
优点是免费开源,成本低廉

Nginx负载均衡的实现

Nginx通过在nginx.conf文件进行配置即可实现负载均衡
配置2步即可

  1. 在http模块加上upstream配置,upstream在http内部,server外部(注意每一行最后的“;”不要漏掉)
upstream www.myweb.com { 
     	server  127.0.0.1:9100 weight=3; 
      	server  127.0.0.1:9200 weight=1;  
} 

其中weight=1表示权重,用于后端服务器性能不均的情况,访问比率约等于权重之比,权重越大访问机会越多
weight不添加则表示轮询方式实现负载均衡
upstream是配置nginx与后端服务器负载均衡非常重要的一个模块,并且它还能对后端的服务器的健康状态进行检查,若后端服务器中的一台发生故障,则前端的请求不会转发到该故障的机器

  1. 在server模块里添加location,并配置proxy_pass(注意每一行最后的“;”不要漏掉)
location /myweb {
	proxy_pass http://www.myweb.com;
}

其中 www.myweb.com 字符串要和 upstream 后面的字符串相等,当然这部分内容也可以随便填写,只是为了保证和upstream后的字符串相同

  1. 测试
    部署项目
    配置两个Tomcat,修改端口号,将一个相同的项目放在Tomcat中,运行程序,访问相同地址

Nginx常用负载均衡策略

轮询

就是均匀的将请求分配给不同的服务器。
注意:这里的轮询并不是每个请求轮流分配到不同的后端服务器,与ip_hash类似,但是按照访问url的hash结果来分配请求,使得每个url定向到同一个后端服务器,主要应用于后端服务器为缓存时的场景下。如果后端服务器down掉,将自动剔除

upstream backserver { 
    	server 127.0.0.1:8080; 
    	server 127.0.0.1:9090; 
} 

权重

每个请求按一定比例分发到不同的后端服务器,weight值越大访问的比例越大,用于后端服务器性能不均的情况
upstream中需要添加weight

	upstream backserver { 
    	server 192.168.0.14 weight=5; 
    	server 192.168.0.15 weight=2; 
	} 

ip_hash

ip_hash也叫IP绑定,每个请求按访问ip的hash值分配,这样每个访问客户端会固定访问一个后端服务器,可以解决会话Session丢失的问题
ip_hash可能会出现过载问题。
upstream中需要添加ip_hash;
算法:hash(“124.207.55.82”) % 2 = 0, 1

	upstream backserver { 
    	ip_hash; 
    	server 127.0.0.1:8080; 
    	server 127.0.0.1:9090; 
	}

最少连接

web请求会被转发到连接数最少的服务器上
upstream中需要添加least_conn;

upstream backserver { 
 	least_conn;
 	server 127.0.0.1:8080; 
 	server 127.0.0.1:9090; 
}	

静态代理

概念

把所有静态资源的访问改为访问nginx,而不是访问tomcat,这种方式叫静态代理。因为nginx更擅长于静态资源的处理,性能更好,效率更高。
在实际应用中,我们将静态资源比如图片、css、html、js等交给nginx处理,而不是由tomcat处理。
nginx_第2张图片

实现方式

放静态资源时在root指定路径下需要向创建一个以war包包名的文件夹,静态资源放在这个文件加下

方式一:在nginx.conf的location中配置静态资源的后缀

例如:部署myweb.war ,当访问静态资源,则从linux服务器/opt/static目录下获取(举例)
root 指定的是根路径,我们要访问的是 ip地址:8080/myweb/,root的根路径=ip地址:8080,所以要在static下添加myweb文件夹

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;
}

更具体的位置是/opt/static/myweb/静态资源文件(夹)
说明

  • ~ 表示正则匹配,也就是说后面的内容可以是正则表达式匹配
  • 第一个点 . 表示任意字符
  • *表示一个或多个字符
  • . 是转移字符,是后面这个点的转移字符
  • | 表示或者
  • $ 表示结尾

整个配置表示以.后面括号里面的这些后缀结尾的文件都由nginx处理
放置静态资源的目录,要注意一下目录权限问题,如果权限不足,给目录赋予权限; 否则会出现403错误 chmod 755

方式二:在nginx.conf的location中配置静态资源所在目录实现

例如:部署myweb.war ,当访问静态资源,则从linux服务器/opt/static目录下获取(举例)
root 指定的是根路径,我们要访问的是 ip地址:8080/myweb/,root的根路径=ip地址:8080,所以要在static下添加myweb文件夹

location ~ .*/(css|js|img|images) {                           
    	root   /opt/static;
}

更具体的位置是/opt/static/myweb/静态资源文件(夹)
xxx/css
xxx/js
xxx/img
xxx/images
我们将静态资源放入 /opt/static 目录下,然后用户访问时由nginx返回这些静态资源

动静分离

概念

Nginx的负载均衡和静态代理结合在一起,我们可以实现动静分离,这是实际应用中常见的一种场景。
动态资源,如jsp由tomcat或其他web服务器完成
静态资源,如图片、css、js等由nginx服务器完成

nginx_第3张图片
整个架构中,一个nginx负责负载均衡,两个nginx负责静态代理。Nginx在一台Linux上安装一份,可以启动多个Nginx,每个Nginx的配置文件不一样即可

实现方式

动态资源通过负载均衡,静态资源也通过负载均衡来访问。
首先明确一点:nginx服务启动可以通过携带配置文件的方式启动多个服务。

  1. 首先拷贝nginx.conf文件两份,依次做出如下修改
    配置文件nginx1.conf
server{
	listen 81;
	server_name localhost;
	...
	location ~ .*/(css|js|img|images) {                           
	    	root   /opt/static;
	}
}

配置文件nginx2.conf

server{
	listen 82;
	server_name localhost;
	...
	location ~ .*/(css|js|img|images) {                           
	    	root   /opt/static;
	}
}

配置文件nginx.conf

upstream www.myweb.com{
	server IP地址:8080;
	server ip地址:8081;
}
upstream static.myweb.com{
	server ip地址;81;
	server ip地址;82;
}
server{
	listen 80;
	server_name localhost;
	...
	location /myweb{                           
	    	proxy_pass http://www.myweb.com;
	}
	location ~ .*/(css|js|img|images) {                           
	    	proxy_pass http://static.myweb.com;
	}
}
  1. 在两台Tomcat服务器,部署myweb.war项目
  2. 启动三台nginx服务器,启动两台tomcat服务器
  3. 浏览器输入http://IP地址/myweb/进行测试

虚拟主机

概念

虚拟主机,就是把一台物理服务器划分成多个“虚拟”的服务器,这样我们的一台物理服务器就可以当做多个服务器来使用,从而可以配置多个网站。

Nginx提供虚拟主机的功能,就是为了让我们不需要安装多个Nginx,就可以运行多个域名不同的网站。
Nginx下,一个server标签就是一个虚拟主机。nginx的虚拟主机就是通过nginx.conf中server节点指定的,想要设置多个虚拟主机,配置多个server节点即可;

例如:www.meituan.com 切换城市,可以看到不同的城市地址不一样(二级域名)
比如一个公司有多个二级域名,没有必要为每个二级域名都提供一台Nginx服务器,就可以使用虚拟主机技术,在一台nginx服务器上,模拟多个虚拟服务器。

配置虚拟主机方式

基于端口的虚拟主机(了解)

基于端口的虚拟主机配置,使用端口来区分:同域名不同端口
浏览器使用 同一个域名+端口 或 同一个ip地址+端口访问;

server {
	    listen 8080;
  		server_name www.myweb.com;
  		location /myweb {
          	proxy_pass http://www.myweb.com;
  		}
}
server {
  		listen 9090;
  		server_name www.myweb.com;
  		location /p2p {
         		proxy_pass http://www.p2p.com;
  		}
}

基于域名的虚拟主机(掌握)

可以理解为:同端口不同域名
基于域名的虚拟主机是最常见的一种虚拟主机

server {
       listen       80;
       server_name  www.myweb.com;
       location /myweb {
          proxy_pass http://www. myweb.com;
       }
}
server {
       listen       80;
       server_name  www.p2p.com;
       location /myweb {
          proxy_pass http://www.p2p.com;
       }
}

因为nginx安装在了Linux虚拟机上,所以在自己计算机上测试需要修改一下本地的hosts文件,文件位置:C:\Windows\System32\drivers\etc\hosts
在hosts文件配置:
192.168.208.128 www.myweb.com
192.168.208.128 www.p2p.com
前面是Linux的IP,后面是你自定义的域名

案例:模拟城市站点网站

案例架构图

nginx_第4张图片

实现步骤

  1. 配置3个Tomcat,每个Tomcat一个站点项目
    - 部署在Tomcat的ROOT目录下,目的是访问的时候不用加上下文根,测试方便
    - 修改server.xml配置文件中的端口号:第22行左右的,第69行和第116行左右的 标签,这三个port修改,每个Tomcat的这三个端口不能重复
  2. 清空三个tomcat的webapps/ROOT目录
    - 使用Xftp将三个war包上传到三个tomcat的ROOT目录
    - 使用unzip命令,直接解压三个war包,否则tomcat启动的时候,自动解压,还是有一个上下文目录的
  3. 在nginx.conf中配置3个Nginx虚拟主机(两种方式)
    方式一:直接在nginx.conf中配置
    在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;
      }
}

方式二:B、通过单独的配置文件配置虚拟主机
通过include的方式引入虚拟主机配置
include /usr/local/nginx/conf/vhost/vhost.conf;
将虚拟目录的配置文件加入到”http {}”部分的末尾,与其他server并列;
文件是隔开的,配置更清晰,主文件没有那么多是server

  1. 在nginx.conf中配置每个虚拟主机请求转发所对应的后端服务器(负载均衡,可以配置多个服务器)
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;
}
  1. 修改hosts文件,让Linux的ip指向到三个站点的域名
C:\Windows\System32\drivers\etc\hosts
ip地址 beijing.myweb.com
ip地址 nanjing.myweb.com
ip地址 tianjin.myweb.com
  1. 启动3个Tomcat服务器
  2. 启动nginx,通过浏览器访问nginx进行测试

xshell文件上传下载命令

windows文件上传:rz -y (首先切换到要上传的文件路径)
Linux文件下载:sz 要下载的文件名

你可能感兴趣的:(服务器,nginx,服务器)