Nginx 笔记


文章目录

  • Nginx 笔记
  • 一、nginx 概念
  • 1.1 作为服务器
  • 二、安装 nginx
  • 2.1 windows 安装~
  • 2.2 linux 安装~
  • 三、 nginx 配置文件
  • 3.1 windows环境
  • 3.2 linux环境
  • 四、nginx 反向代理
  • 4.1 概念
  • 4.2 反向代理的作用
  • 4.3 如何配置?
  • 4.4 location 指令说明
  • 五、nginx 动静分离
  • 5.1 动静分离概念
  • 5.2 如何配置?
  • 六、nginx 负载均衡
  • 6.1 负载均衡概念
  • 6.2 负载均衡的特点
  • 6.3 如何配置?
  • 七、nginx session共享
  • 7.1 什么是 session共享问题?
  • 7.2 如何解决?
  • 方法1:ip_hash
  • 方法2:redis+tomcat-sessoin-manager
  • 7.3 完整配置
  • 八、firewall防火墙


一、nginx 概念

Nginx是一款轻量级Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东新浪网易腾讯淘宝等。

1.1 作为服务器

Nginx作为负载均衡服务:Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务,也可以支持作为 HTTP代理服务对外进行服务。Nginx采用C进行编写,不论是系统资源开销还是CPU使用效率都比 Perlbal 要好很多。

处理静态文件,索引文件以及自动索引;打开文件描述符缓冲。

无缓存的反向代理加速,简单的负载均衡和容错。

FastCGI,简单的负载均衡和容错。

模块化的结构。包括 gzipping, byte ranges, chunked responses,以及 SSI-filter 等 filter。如果由 FastCG或其它代理服务器处理单页中存在的多个 SSI,则这项处理可以并行运行,而不需要相互等待。

支持 [SSL ](https://baike.baidu.com/item/SSL /320778)和 TLSSNI。

百度百科

二、安装 nginx

2.1 windows 安装~
# 启动 nginx
# 1. 直接双击nginx.exe启动

# 2. cmd 进入 nginx目录

# 1. 启动
start nginx

# 2. 关闭
nginx -s stop

# 3. 重启
nginx -s reload

3.开启后,浏览器访问 http://127.0.0.1:8088,看到这个就表示启动成功了

重启 nginx 配置命令 重启nginx windows_linux

2.2 linux 安装~
一.报错
configure: error: You need a C++ compiler for C++ support.
# 安装c++ compiler
yum install -y gcc gcc-c++

(1)安装 pcre-8.37

cd /usr/src
tar -xvf pcre-8.37.tar.gz
cd /pcre-8.37
./configure
make && make install

# 查看版本号
pcre-config --version

(2)安装 openssl 、zlib 、 gcc 依赖

yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel

(3)安装 nginx

# 先进入 /usr/src
cd /usr/src
tar -xvf nginx-1.12.2.tar.gz
cd /nginx-1.12.2
./configure
make && make install

# 安装完成,查看版本号
nginx --version

(4)启动 nginx

# 进入目录 /usr/local/nginx/sbin 启动服务
cd /usr/local/nginx/sbin
./nginx
# 查看是否启用成功
ps -ef | grep nginx

# (5)访问 nginx,默认80端口
http://42.192.41.99/

(6)开放端口号

# 查看开放的端口号
firewall-cmd --list-all
# 设置开放的端口号
firewall-cmd --add-service=http –permanent
firewall-cmd --add-port=80/tcp --permanent   # 开放80
firewall-cmd --add-port=8080/tcp --permanent # 开放8080
firewall-cmd --add-port=3306/tcp --permanent --zone=public # mysql
# 重启防火墙
firewall-cmd –reload

linux – 常用命令

# 0、先进入 nginx的目录  /usr/local/nginx/sbin
cd /usr/local/nginx/sbin

# 1、查看 nginx 版本号
./nginx -v

# 2、启动 nginx
./nginx

# 3、停止 nginx
./nginx -s stop

# 4、重新加载 nginx  -->修改配置文件后,需要重新加载
./nginx -s reload

三、 nginx 配置文件

3.1 windows环境

1.修改默认端口

打开 nginx 目录下的 conf/nginx.conf 文件,找到 listen 80 ,修改为其他端口号即可

server {
 		# 端口设置为 8088
        listen       8088; 
        # 主机名
        server_name  localhost;
        
        # ....
 }

2.页面存放位置

表示页面都存放在 nginx 的 html目录下

root html;

3.欢迎页面

默认会访问 index.html 或者 index.htm文件【位于 html 目录下】

index index.html index.htm;
3.2 linux环境
# 1.配置文件位置
cat /usr/local/nginx/conf/nginx.conf

# 2.配置文件组成 主要分为三部分

第一部分:全局块

从配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配 置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以 及配置文件的引入等。

比如上面第一行配置的:

worker_processes  1;

这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约

第二部分:events 块

比如上面的配置:

events {
    worker_connections  1024;
}

events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。

上述例子就表示每个 work process 支持的最大连接数为 1024.

这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。

第三部分:http 块(包括 http全局块 + server块

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
	
	# 负载均衡配置,weight 表示权重,值越大,被分配到的几率越大。10以内
	upstream tomcat_8111_8222{
	server	127.0.0.1:8111 weight=1;
	server	127.0.0.1:8222 weight=2;
    }

    server {
        listen       8088;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;
		
		# 负载均衡配置,weight
		location / {
			proxy_pass http://tomcat_8111_8222;
		}
		
        # location / 表示处理所有请求
		# proxy_pass http://127.0.0.1:8111; 表示把请求都交给http://127.0.0.1:8111来处理
        #location / {
        #    proxy_pass http://127.0.0.1:8111;
        #}
		
		# 表示所有的css js png访问都由nginx来做,访问的地址是
		# 注意,填写本地地址的时候,要用正斜杠 / 不要用反斜杠 \
		location ~ \.(css|js|png)$ {
			root D:/Java/develop/z_for_study_use/tomcat_8111/webapps/ROOT;
		}

    }

Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。

①、http 全局块

该配置包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。

②、server 块

这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。

每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。

而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。

  • 2.1、全局 server 块

最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。

  • 2.2、location 块

一个 server 块可以配置多个 location 块。

这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。

四、nginx 反向代理

4.1 概念

正向代理

客户端需要配置代理服务器【租房中介

用户知道目标服务器地址,但由于网络限制等原因,无法直接访问。这时候需要先连接代理服务器,然后再由代理服务器访问目标服务器。

重启 nginx 配置命令 重启nginx windows_负载均衡_02

反向代理

客户端对代理服务器无感知,无需配置代理服务器【买票黄牛

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

重启 nginx 配置命令 重启nginx windows_java_03

4.2 反向代理的作用

(1)保证内网的安全,阻止web攻击,大型网站,通常将反向代理作为公网访问地址,Web服务器是内网

(2)负载均衡,通过反向代理服务器来优化网站的负载

4.3 如何配置?

示例1:

实现效果:访问 http://127.0.0.1:8088,跳转到 http://127.0.0.1:8111

1.首先打开 端口号为 8111的 tomcat

2.修改nginx.conf

  • location /:表示处理所有请求
  • 流程图:

重启 nginx 配置命令 重启nginx windows_linux_04

server {
        listen       8088;
        server_name  localhost;
        
        # location / 表示处理所有请求
		# proxy_pass http://127.0.0.1:8111; 表示把请求都交给http://127.0.0.1:8111来处理
        location / {
            proxy_pass http://127.0.0.1:8111;
        }
		# ...
    }

示例2:

实现效果:使用 nginx 反向代理,根据访问的路径跳转到不同端口的服务中

nginx 监听端口为 9001,

访问 http://127.0.0.1:9001/edu/ 直接跳转到 127.0.0.1:8081

访问 http://127.0.0.1:9001/vod/ 直接跳转到 127.0.0.1:8082

1.启动2个tomcat,一个8081,一个8082

2.在2个tomcat的 webapps 目录下分别创建了 edu 和 vod 目录。然后放置了一个a.html 文件。内容是 8081,8082

2.增加 ngnix.conf 配置

server{
	listen 9001;
 	server_name 42.192.41.99;

	location ~ /edu/ {
	    proxy_pass http://127.0.0.1:8082;
	}	
	
        location ~ /vod/ {
	    proxy_pass http://127.0.0.1:8081;
	}
    }

测试:

访问:http://42.192.41.99:9001/vod/a.html ==> http://42.192.41.99:8081/vod/a.html

重启 nginx 配置命令 重启nginx windows_linux_05

访问:http://42.192.41.99:9001/edu/a.html ==> http://42.192.41.99:8082/edu/a.html

重启 nginx 配置命令 重启nginx windows_重启 nginx 配置命令_06

4.4 location 指令说明

该指令用于匹配 URL。

语法如下:

1、= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配

成功,就停止继续向下搜索并立即处理该请求。

2、~:用于表示 uri 包含正则表达式,并且区分大小写。

3、~*:用于表示 uri 包含正则表达式,并且不区分大小写。

4、^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字

符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。

注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~* 标识。

五、nginx 动静分离

5.1 动静分离概念

Nginx 动静分离就是将动态请求和静态请求分开,可以理解成使用 Nginx 处理静态页面,Tomcat 处理动态页面。动静分离从目前实现角度来讲大致分为两种,

  • 一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上。(推荐,示例2
  • 另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。

通过 location 指定不同的后缀名实现不同的请求转发。

通过 expires 参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义:是给一个资 源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可, 所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件, 不建议使用 Expires 来缓存),比如设置 3d,表示3 天内访问这个 URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码 304,如果有修改,则直接从服务器重新下载,返回状态码 200。

好处:nginx处理静态内容的吞吐量很高,比tomcat高多了,提升性能。

重启 nginx 配置命令 重启nginx windows_nginx_07

5.2 如何配置?

示例1:windows

1.在 nginx.conf 新增配置

注意:写本地地址的时候,要用正斜杠 / 不要用反斜杠 \

server {
        listen       8088;
        server_name  localhost;  
        
        # location / 表示处理所有请求
		# proxy_pass http://127.0.0.1:8111; 表示把请求都交给http://127.0.0.1:8111来处理
        location / {
            proxy_pass http://127.0.0.1:8111;
        }
        
        #****************>>>>>>>>新增配置<<<<<<<<<<*****************
		# 表示所有 css js png访问都由nginx来做,访问的地址是
		# 注意,填写本地地址的时候,要用正斜杠 / 不要用反斜杠 \
		location ~\.(css|js|png)$ {
			root D:/Java/develop/z_for_study_use/tomcat_8111/webapps/ROOT;
		}
		#*********************************************************

     	# ...
    }

访问地址,观察到静动都有的效果 http://127.0.0.1:8088/login.jsp

查看 tomcat 输出目录, 会发现,只访问了jsp, 所有的css,js,png都不会经过 tomcat,而是由nginx自己处理。

示例2:linux

1.在 linux 根目录下创建了一个 staticData目录,里面又建了2个文件夹,分别存放图片和一个html 文件

重启 nginx 配置命令 重启nginx windows_java_08

2.然后配置 server块,增加对应的 location

server {
        listen       80;
        server_name  42.192.41.99;

        location /www/ {
            root   /staticData/;
            index  index.html index.htm;
        }

	# 访问路径
	location /image/ { 
			# 磁盘目录-绝对路径
	        root /staticData/;  
	        # 添加索引
            autoindex on;
	}

    }

3.访问 http://42.192.41.99/www/a.html, http://42.192.41.99/image/01.jpg。即可访问到静态资源

重启 nginx 配置命令 重启nginx windows_java_09

六、nginx 负载均衡

6.1 负载均衡概念

将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡

6.2 负载均衡的特点

1、提高服务器响应速度,解决网络拥塞问题,达到高质量的网络访问效果。

2、能够远距离为用户提供完全的透明服务,真正实现与地理位置无关性

3、能够避免各种单点失效,既包括数据中心、服务器等的单点失效,也包括专线故障引起的单点失效。

6.3 如何配置?

linux 环境

1.启动2个tomcat ,一个8081端口,一个8082。然后在webapps 目录下创建 xuxu目录,分别放入一个 a.html

重启 nginx 配置命令 重启nginx windows_java_10

2.修改 nginx.conf

  • 增加一个upstream ,用来指向这两个tomcat
upstream myserver {
        server 42.192.41.99:8081 weight=1;
        server 42.192.41.99:8082 weight=1;
   }
  • 然后修改location,反向代理到上述配置。
location / {
        proxy_pass http://myserver;
        root html;
        index index.html index.htm;
  }
  • weight表示权重,值越大,被分配到的几率越大。 (10以内)
# 负载均衡配置,weight 表示权重,值越大,被分配到的几率越大。10以内
	upstream myserver {
        server 42.192.41.99:8081 weight=1;
        server 42.192.41.99:8082 weight=1;
    }

    server {
        listen       80;
        server_name  42.192.41.99;
		
		# 负载均衡配置,weight
		location / {
        	proxy_pass http://myserver;
        	root html;
        	index index.html index.htm;
  		}
		
		# ...
    }

3.使用命令 nginx -s reload 重启,多次访问 http://42.192.41.99/xuxu/a.html ====>就会被分发给

4.查看效果,说明被分发到不同的tomcat

重启 nginx 配置命令 重启nginx windows_负载均衡_11

重启 nginx 配置命令 重启nginx windows_java_12

七、nginx session共享

参考 how2j

7.1 什么是 session共享问题?

当同一个用户第一次访问tomcat_8111 并且登录成功, 而第二次访问却被分配到了tomcat_8222, 这里并没有记录其登陆状态,此时就会呈现未登录状态,严重影响用户体验

重启 nginx 配置命令 重启nginx windows_nginx_13

7.2 如何解决?
方法1:ip_hash

通过ip地址标记用户,如果多次请求都是从同一个ip来的,那么就都分配到同一个tomcat.
这样就不会出现负载均衡 session问题了,处理手段也很简单,如图所示在upstream最后加上ip_hash;就行了。

不过这种方案并不完美,当如下几种情况发生时就有问题:

  1. 大量请求来之某个局域网,那么相当于就没有负载均衡了】
  2. 如果tomcat_8111 挂了,那么此时nginx只能把请求交给tomcat_8222,但是这里却没有记录session,用户体验依然受影响。
upstream tomcat_8111_8222{
	server	127.0.0.1:8111 backup;
	server	127.0.0.1:8222 weight=2;
	ip_hash;
    }
方法2:redis+tomcat-sessoin-manager

用Redis来存取session,
当tomcat1需要保存session值的时候,就可以把它放在Redis上,需要取的时候,也从Redis上取。
那么考虑这个情景:

  1. 用户提交账号密码的行为被分配在了tomcat8111上,登陆信息被存放在redis里。
  2. 当用户第二次访问的时候,被分配到了tomcat8222上
  3. 那么此时tomcat8222就会从redis去获取相关信息,一看有对应信息,那么就会呈现登陆状态。

重启 nginx 配置命令 重启nginx windows_nginx_14

配置步骤:

  1. 启动redis
  2. 给两个tomcat使用jar包,把这3个jar包放到tomcat 的lib目录下
  • jedis-2.5.2.jar,
  • commons-pool2-2.0.jar,
  • tomcat-redis-session-manager1.2.jar。
  1. 配置两个tomcat

修改 tomcat/conf/context.xml ,增加下面配置

<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />  
  <Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"  
   host="127.0.0.1"  
   port="6379"  
   database="0"  
   maxInactiveInterval="60" />
  1. 重启两个tomcat
  2. 测试,先在 8111端口的tomcat登录用户,然后去访问 8222端口。可以直接跳转到已登录页面。这样便实现了session 共享
7.3 完整配置

linux 下的

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {
    worker_connections  1024;
}

http {
    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  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on; 
    
    upstream myserver {
	server 42.192.41.99:8081;
	server 42.192.41.99:8082;    	
    }

    server {
        listen       80;
        server_name  42.192.41.99;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

	location / {
	    proxy_pass http://myserver;
	    root html;
            index index.html index.htm;
	}
	
    location /www/ {
        root   /staticData/;
    #   proxy_pass http://127.0.0.1:8080;
        index  index.html index.htm;
    }

	location /image/ { # 访问路径
	    root /staticData/;  # 磁盘目录-绝对路径
        autoindex on;
	}

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }

    # 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;
    #    }
    #}
    
    # 配置第二台虚拟 nginx 服务器
    server{
	listen 9001;
 	server_name 42.192.41.99;

	location ~ /edu/ {
	    proxy_pass http://127.0.0.1:8081;
	}	
	
        location ~ /vod/ {
	    proxy_pass http://127.0.0.1:8082;
	}
    }

}

八、firewall防火墙

1、查看firewall服务状态

systemctl status firewalld

2、查看firewall的状态

firewall-cmd --state

3、开启、重启、关闭、firewalld.service服务

# 开启
systemctl start firewalld
# 重启
firewall-cmd –reload
# 关闭
systemctl stop firewalld

4、查看防火墙规则

firewall-cmd --list-all

5、查询、开放、关闭端口

# 查询端口是否开放
firewall-cmd --query-port=8080/tcp

# 开放80端口
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=8081/tcp

# 移除端口
firewall-cmd --permanent --remove-port=8080/tcp 

#重启防火墙(修改配置后要重启防火墙)
firewall-cmd --reload

# 参数解释
1、firwall-cmd:是Linux提供的操作firewall的一个工具;
2、--permanent:表示设置为持久;
3、--add-port:标识添加的端口;

如果服务器未开启,操作会出现 FirewallD is not running