Nginx常用配置

一、简介

Nginx (engine x) 是一个高性能的Web服务器和反向代理服务器,也可以作为邮件代理服务器,使用C语言开发。

Nginx 特点是占有内存少,并发处理能力强,以高性能、低系统资源消耗而闻名,Nginx官方测试为5万并发请求。

日常中的并发量上限4万左右。

1. 正向代理

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

2. 反向代理

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

反向代理隐藏了真正的服务端,就像你每天使用百度的时候,只知道敲打www.baidu.com就可以打开百度搜索页面,但背后成千上万台百度服务器具体是哪一台为我们服务的,我们并不知道。我们只知道这个代理服务器,它会把我们的请求转发到真实为我们服务的那台服务器那里去。

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

二、Nginx环境搭建

1. 下载

免费开源版的官方网站:http://nginx.org/en/download.html,可以下载稳定版(Stable version)

Nginx 有 Windows 版本和 Linux 版本,但更推荐在 Linux 下使用 Nginx;
下载nginx-1.14.2.tar.gz的源代码文件:wget http://nginx.org/download/nginx-1.14.2.tar.gz
或者在Windows上下载下来再上传到Linux中

2. 安装

(1)安装相关库

Nginx的安装需要确定Linux安装相关的几个库,否则配置和编译会出现错误,相关库有:

  • gcc编译器
  • openssl库
  • pcre库
  • zlib库

一次性检查并安装,若已安装则跳过,若有更新,则进行更新:

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

检查库是否安装成功,下面的命令只能一个一个的检查,或者再运行一遍上面的命令,若没有操作则说明相关库已经存在:

yum list installed | grep gcc
yum list installed | grep openssl
yum list installed | grep pcre
yum list installed | grep zlib

(2)安装Nginx

  1. 解压下载下来的nginx文件(.tar.gz),执行命令:tar -zxvf nginx-1.14.2.tar.gz
  2. 切换至解压后的nginx主目录,在nginx主目录nginx-1.14.2下执行命令:
    ./configure --prefix=/usr/local/nginx 
    

(其中–prefix是指定nginx安装路径) 注意:等号左右不要有空格
3. 执行命令进行编译:make
4. 执行命令进行安装:make install

安装成功后,可以切换到/usr/local/nginx目录下,查看内容

(3)目录简介

  • conf:存放配置文件,文件夹中每个配置文件都有两份,以 .default 结尾的是默认配置
  • html:存放页面
  • logs:存放日志
  • sbin:存放可执行文件
  • *_temp:Nginx启动后,安装目录下会出现一些_temp结尾的文件,这些是临时文件,不用管。

3. 启动

  • 默认启动:
    • 切换到nginx安装目录的sbin目录下,执行:./nginx
  • 通过配置文件启动:
    • 通过 -c 指定配置文件的位置,而且配置文件路径必须指定绝对路径
    • 可以在配置文件后加上 -t 参数,检查配置文件是否存在语法错误
    ./nginx -c /usr/local/nginx/conf/nginx.conf  # 相对路径启动
    /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf # 绝对路径启动
    
    ./nginx -c /usr/local/nginx/conf/nginx.conf -t  # 检查配置文件是否存在语法错误
    

4. 查看进程

查看进程:ps -ef | grep nginx
在这里插入图片描述
nginx 体系结构由 master 进程和其 worker 进程组成,启动成功后至少有两个进程,少于两个则没有成功

  • master 进程为主进程,读取配置文件,并维护和管理 worker 进程,其父进程pid为1
  • worker 进程则对请求进行实际处理,worker可以有更多,>=1,父进程pid为master的pid

Nginx的默认端口为80,在浏览器中访问 http://ip地址:80 即可访问到Nginx,(默认端口为80时,在地址栏中可以不指定端口)

5. 关闭

(1)优雅的关闭

  • 找出nginx的进程号:ps -ef | grep nginx
  • 执行命令:kill -QUIT 主pid

注意

  • 其中pid是主进程号的pid(master process),其他为子进程pid(worker process)
  • 这种关闭方式会处理完请求后再关闭,所以称之为优雅的关闭

(2)快速关闭

  • 找出nginx的进程号:ps -ef | grep nginx
  • kill -TERM 主pid

注意

  • 其中pid是主进程号的pid(master process),其他为子进程pid(worker process)
  • 这种关闭方式不管请求是否处理完成,直接关闭,比较暴力,称之为快速的关闭

(3)直接kill

  • 找出nginx的进程号:ps -ef | grep nginx
  • kill -9 主pid

6. 重启

重启使用的较多,当修改配置文件后,便需要重启Nginx,重启时不需要指定配置文件,使用的是最近一次启动时用的配置文件

注意:如果用同一个Nginx使用多个不同的配置文件启动了多个Nginx,则不能使用重启,因为Nginx会不知道重启哪个配置文件

./nginx -s reload

7. 其它

Linux上查看nginx版本:/usr/local/nginx/sbin/nginx -V

  • -v:显示 nginx 的版本
  • -V:显示 nginx 的版本、编译器版本和配置参数

8. Windows环境简介

在官方网站下载最新windows版的nginx:http://nginx.org/en/download.html
将下载下来的nginx压缩包解压到一个目录下,解压后该软件就可以启动使用了
启动方式1:双击解压目录下的nginx.exe文件即可运行nginx;
启动方式2:进入dos窗口,切换到nginx主目录下,在dos窗口执行命令:start nginx
关闭方式1:在资源管理器杀掉Nginx进程(有两个进程)
关闭方式2:在dos窗口切换到Nginx安装主目录下执行命令:nginx -s stop

三、配置文件

学习Nginx首先需要对它的核心配置文件有一定的认识,这个文件位于Nginx的安装目录/usr/local/nginx/conf目录下,名字为nginx.conf

Nginx的核心配置文件主要由三个部分构成:基本配置,events配置,http配置

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文件 

2. events配置

events主要用于配置工作模式和连接数,在 events{} 中进行配置

events {
	# 配置每个worker进程连接数上限,nginx支持的总连接数就等于worker_processes * worker_connections
	# 需要注意的是,worker_connections最大为 65536
    worker_connections  1024;  
}

3. 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压缩输出,上线时必须开,开发时不开,防止没有格式
	
	###-----------------------------------------------
	

    #配置虚拟主机
    server {
        listen       80;  #配置监听端口
        server_name  localhost;  #配置服务名

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

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

		#默认的匹配斜杠/的请求,当访问路径中有斜杠/,会被该location匹配到并进行处理
        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错误页面
        
		#精确匹配
		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;
    #    }
    #}
}

(1)基本配置

http配置主要是配置http服务器,利用它的反向代理功能提供负载均衡支持,在 http{} 中进行配置

注意:

  • 上线必需要打开的配置:gzip on(开发时不开)tcp_nopush on

(2)配置虚拟主机

虚拟主机配置在 http{server{}} 中,可以配置多个,其中比较重要的是location:
牢记 ip + port 等于root的原则

  • location后的 / 表示:ip + 端口号,后面跟的参数相当于是网站名
  • location中的 root 参数表示:
    • 若参数前不加 / 则表示 nginx的安装路径,例如:默认指定为html,即表示为nginx安装主目录下的html目录
    • 若参数前加 / 则表示 Linux 中的根路径(/)路径

/root 后的路径是一一对应的:举个例子:比如说的我 Nginx 的ip为192.168.0.1,端口为 80,location 参数指定的值为 /aa(相当于是war包的名字),root 配置参数指定的值为 /opt/web(相当于把war包直接放到里面),若访问路径为 http://192.168.0.1:80/aa/index.html,则Nginx会访问 /opt/web/aa/index.html 静态文件

# 默认的匹配斜杠/的请求,当访问路径中有斜杠/,会被该location匹配到并进行处理
# 网站为:http://www.ip:80/aa
location /aa {
	# 磁盘路径为:/opt/web/aa
    root   /opt/web;  
}	

4. 修改配置文件的小技巧

适用于不太会用vim或者需要对文件进行大改的情况:

先将配置文件下载到Windows上,修改完毕后再上传到Linux中,覆盖原文件

  • sz :从Linux下载文件到本机 , 在Linux终端输入命令回车后,选择本地存储路径即可。

    • 命令格式:
      • sz filename 下载文件filename
      • sz file1 file2 下载多个文件
      • sz dir/*   下载dir目录下所有文件
  • rz:从本地上传文件到Linux,在Linux终端输入命令回车后,选择本地要上传的文件即可,可一次指定多个文件

    • 命令格式: rz -y 选择文件并上传到执行命令所在的目录

注意:

  1. 如果机器上没有安装过 lrzsz 安装包,则无法使用 rz 和 sz 命令。

    • 使用yum命令安装:yum install -y lrzsz

    • 下载源码进行安装。下载地址:https://ohse.de/uwe/software/lrzsz.html

  2. 上传和下载都默认使用Linux当前登录的用户,使用时要根据个人需要修改文件的权限。

四、负载均衡

1. 简介

(1)硬件负载均衡

比如 F5、深信服、Array 等

  • 优点:有厂商专业的技术服务团队提供支持,性能稳定
  • 缺点:费用昂贵,对于规模较小的网络应用成本太高

(2)软件负载均衡

比如 Nginx、LVS、HAProxy 等

  • 优点:免费开源,成本低廉
  • 缺点:性能没有硬件高

所以,实际中,往往会两者结合使用,在关键的位置使用硬件负载均衡,而其余地方使用软件负载均衡

2. 负载均衡配置

(1)在http模块中加上upstream配置

  • upstream:后面的地址随便指定,但是不能有重复
  • server:指定Tomcat服务器的地址
upstream www.myweb.com { 
     	server  127.0.0.1:9100; 
      	server  127.0.0.1:9200;  
} 

upstream是配置nginx与后端服务器负载均衡非常重要的一个模块,并且它还能对后端的服务器的健康状态进行检查,若后端服务器中的一台发生故障,则前端的请求不会转发到该故障的机器

(2)在server模块里添加location,并配置proxy_pass

  • proxy_pass:http:// 加上 upstream 后面的字符串(固定结构:proxy_pass http://
location /myweb {
	proxy_pass  http://www.myweb.com;
}

(3)location中添加配置

nginx反向代理配置时,后端的tomcat会出现request.getServerName()取不到代理地址(或域名)的问题,需要在location中添加下面的参数:

location /myweb {
	proxy_pass  http://www.myweb.com;
	proxy_set_header Host $host;  
}

参考:http://www.phpfensi.com/php/20131127/466.html
很详细:https://blog.csdn.net/t8116189520/article/details/80668651

3. 常用负载均衡策略

实际中,若是服务器配置相同,则可以使用轮询,若配置不同,简单一点可以使用最小连接,也可以经过测试后,使用权重。至于Session丢失问题,这里使用的是通过SpringSession来解决:https://editor.csdn.net/md?articleId=103880228

(1)轮询(默认)

这里的轮询并不是每个请求轮流分配到不同的后端服务器,与ip_hash类似,但是按照访问url的hash结果来分配请求,使得每个url定向到同一个后端服务器,主要应用于后端服务器为缓存时的场景下。如果后端服务器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丢失的问题

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

4. 其它配置

  • backup:其它所有的非backup机器down的时候,才请求backup机器:

    upstream backserver { 
       	server 127.0.0.1:9100;
    	#其它所有的非backup机器down的时候,才请求backup机器
       	server 127.0.0.1:9200 backup; 
    } 
    
  • down:down表示当前的server是down状态,不参与负载均衡:

    upstream backserver { 
    	server 127.0.0.1:9100;
    	#down表示当前的server是down状态,不参与负载均衡
        server 127.0.0.1:9200 down; 
    } 
    

五、静态代理

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

1. 方式一:配置后缀

当访问静态资源,则从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;
}

说明:

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

整个配置表示以 '.'后面括号里面的这些后缀结尾的文件都由nginx处理

注意:放置静态资源的目录,要注意一下目录权限问题,如果权限不足,给目录赋予权限; 否则会出现403错误

2. 方式二:配置目录

当访问静态资源,则从linux服务器/opt/static目录下获取(举例)

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

整个配置表示路径中含有这些括号里面的关键字的请求,都由nginx处理

注意:Nginx查找静态资源位置也是根据ip + port等于root的原则查找图片,假如网页请求的图片地址为http://192.168.235.128/myweb/image/001.jpg,不管是方式一还是方式二,请求都会交给nginx服务器进行处理。根据ip + port等于root的原则,Nginx会找位置为/opt/static/myweb/image/001.jpg的图片

六、动静分离

Nginx的负载均衡和静态代理结合在一起,我们可以实现动静分离,这是实际应用中常见的一种场景。
动态资源,如jsp由tomcat或其他web服务器完成
静态资源,如图片、css、js等由nginx服务器完成
它们各司其职,专注于做自己擅长的事情
动静分离充分利用了它们各自的优势,从而达到更高效合理的架构

实际中很常见的一种动静分离的架构:
在这里插入图片描述

七、虚拟主机

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

Nginx提供虚拟主机的功能,就是为了让我们不需要安装多个Nginx,就可以运行多个域名不同的网站。

Nginx下,一个server{}标签就是一个虚拟主机。nginx的虚拟主机就是通过nginx.conf中server节点指定的,想要设置多个虚拟主机,配置多个server节点即可;

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

基于端口的虚拟主机配置,使用端口来区分
浏览器使用 同一个域名+端口 或 同一个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;
  		}
}

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

基于域名的虚拟主机是最常见的一种虚拟主机

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

在windows中模拟DNS服务器解析域名:
需要修改一下本地的hosts文件,文件位置:C:\Windows\System32\drivers\etc\hosts
在hosts文件配置(前面是Linux的IP,后面是你自定义的域名):
192.168.208.128 www.myweb.com
192.168.208.128 www.p2p.com

3. include引入单独的配置文件

可以将多个server{}标签配置在一个 nginx.conf 文件的 http{} 标签中,也可以单独配置在一个文件中,然后通过include的方式引入虚拟主机配置

include /usr/local/nginx/conf/vhost/vhost.conf;

将虚拟目录的配置文件加入到”http {}”部分的末尾,与其他server并列;

文件是隔开的,配置更清晰,主文件没有那么多的server

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章