nginx的安装配置和应用

本文介绍了Nginx在互联网项目中的应用,包括安装所需组件及步骤、配置文件的六个区域及各模块含义,还阐述了Nginx的Master - worker模式。重点讲解了Nginx的反向代理和负载均衡应用,如反向代理基本配置和负载均衡的调度算法等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Nginx是一款轻量级Web服务器、反向代理服务器,由于占用内存少,启动极快,高并发能力强,在互联网项目中得到广泛应用。

架构图

上图为当下流行的技术架构,其中Nginx有点入口网关的味道。
目前Nginx主要用来实现反向代理负载均衡,本文将对两种应用进行介绍。

1.安装

下载必要组件
  1.nginx下载地址
   http://nginx.org/en/download.html
  2.pcre库下载地址,nginx需要
   http://sourceforge.net/projects/pcre/files/pcre/
  3.zlib下载地址,nginx需要
   http://www.zlib.net/
  4.openssl下载地址,nginx需要
   https://github.com/openssl/openssl
在同级目录下,解压安装zlib、openssl、pcre
进入nginx目录,进行配置安装

./configure \
 --prefix=/usr/local/nginx \
 --with-http_ssl_module \
 --with-http_flv_module \
 --with-http_stub_status_module \
 --with-http_gzip_static_module \
 --with-pcre=../pcre-8.39 \
 --with-zlib=../zlib-1.2.8 \ 
 --with-openssl=../openssl-master

下面可直接复制粘贴

./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre=../pcre-8.39 --with-zlib=../zlib-1.2.8 --with-openssl=../openssl-master

编译安装

$ make && sudo make install

Nginx会被安装在/usr/local/nginx目录下(也可以使用参数–prefix=指定自己需要的位置), 安装成功后 /usr/local/nginx 目录下有四个子目录分别是:conf、html、logs、sbin 。 其中 Nginx 的配置文件存放于 conf/nginx.conf, bin文件是位于 sbin 目录下的 nginx 文件。 确保系统的 80 端口没被其他程序占用,运行 sbin/nginx 命令来启动 Nginx

启动nginx

$sudo /usr/local/nginx/sbin/nginx

打开浏览器访问此机器的 IP,如果浏览器出现 Welcome to nginx! 则表示 Nginx 已经安装并运行成功

一些有关指令

	# 检查配置文件是否正确
    # /usr/local/sbin/nginx -t 
    # 可以看到编译选项
    # /usr/local/sbin/nginx -V
    #重启Nginx
    #sudo /usr/local/sbin/nginx -s reload
    #关闭Nginx
    #sudo /usr/local/sbin/nginx -s stop
    #优雅停止服务
    #sudo /usr/local/sbin/nginx -s quit
    #kill -s SIGQUIT pid_master
    #kill -s SIGWINCH pid_master

2.配置

nginx配置文件主要分为六个区域:

  • main(全局设置)
  • events(nginx工作模式)
  • http(http设置)
  • sever(主机设置)
  • location(URL匹配)
  • upstream(负载均衡服务器设置)

1.下面是一个main区域,他是一个全局的设置:

user nobody nobody;			# Nginx Worker进程运行用户以及用户组
worker_processes 2;			# Nginx要开启的子进程数
error_log  /usr/local/var/log/nginx/error.log  notice; 		# 定义全局错误日志文件
pid        /usr/local/var/run/nginx/nginx.pid; 		#	指定进程id的存储文件位置
worker_rlimit_nofile 1024; 		#	指定一个nginx进程可以打开的最多文件描述符数目

2.events 模块

# 指定nginx的工作模式和工作模式及连接数上限
events {			
    use epoll; 							       # Linux平台
    worker_connections  1024;  # 定义Nginx每个进程的最大连接数,即接收前端的最大请求数,默认是1024
}

3.http模块(最核心模块)
http模块:负责HTTP服务器相关属性的配置,它里面的server和upstream子模块,至关重要,等到反向代理和负载均衡以及虚拟目录等会仔细说。

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  /usr/local/var/log/nginx/access.log  main;
    sendfile        on;
    tcp_nopush      on;
    tcp_nodelay     on;
    keepalive_timeout  10;
    #gzip  on;
    upstream myproject {
        .....
    }
    server {
        ....
    }
}

配置选项含义:

  • include 设定文件的mime类型,类型在配置文件mime.type定义,来告诉nginx来识别文件类型
  • default_type 设定了默认的类型为二进制流
  • log_format 设置日志的格式,和记录哪些参数,这里设置为main
  • access_log 记录每次的访问日志的文件地址,后面的main是日志的格式样式,对应于log_format的main
  • sendfile 高效文件传输模式。将tcp_nopush和tcp_nodelay设置为on用于防止网络阻塞
  • keepalive_timeout 客户端连接保持活动的超时时间。超时后,服务器会关闭该连接

4.server 模块
sever 模块是http的子模块,用来定一个虚拟主机
一个简单的server:

server {
        listen       8080;
        server_name  localhost 192.168.12.10 www.yangyi.com;
        # 全局定义,如果都是这一个目录,这样定义最简单。
        root   /Users/yangyi/www;
        index  index.php index.html index.htm; 
        charset utf-8;
        access_log  usr/local/var/log/host.access.log  main;
        aerror_log  usr/local/var/log/host.error.log  error;
        ....
}
  • server 标志定义虚拟主机开始
  • listen 指定虚拟主机的服务端口
  • server_name 指定IP地址或者域名,多个域名之间用空格分开
  • root 表示在这整个server虚拟主机内,全部的root web根目录。(注意:要和locate {}下面定义的区分开来)
  • index 全局定义访问的默认首页地址。(注意:要和locate {}下面定义的区分开来)
  • charset 设置网页的默认编码格式
  • access_log 指定此虚拟主机的访问日志存放路径,最后的main用于指定访问日志的输出格式

5.location模块(nginx中用的最多,也最重要;负载均衡、反向代理、虚拟域名与其相关)
据字面可知,用于定位:定位URL,解析URL(正则匹配,支持条件判断匹配)
通过locaiton实现Nginx的动静态网页过滤处理

#	location /表示匹配访问根目录
location / {					
            root   /Users/yangyi/www;		#	root 指定访问根目录时,虚拟主机的web目录
            								#	目录可以是相对路径(相对路径是相对于nginx的安装目录)也可以是绝对路径
            index  index.php index.html index.htm;		#	设定默认首页
        }

6.upstram 模块(负载均衡模块)
通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡

upstream test.com{
    ip_hash;	#	ip_hash是一种负载均衡算法	
    server 192.168.123.1:80;
    server 192.168.123.2:80 down;
    server 192.168.123.3:8080  max_fails=3  fail_timeout=20s;
    server 192.168.123.4:8080;
}

上面的例子中,通过upstream指令指定了一个负载均衡器的名称test.com。这个名称可以任意指定,在后面需要的地方直接调用即可。

Nginx负载均衡模块目前支持4种调度算法:

  1. weight 轮询(默认)
    每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。weight。指定轮询权值,weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下。
  2. ip_hash
    每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题
  3. fair
    比上面两个更加智能的算法;可以依据页面大小加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块
  4. url_hash
    访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx 的hash软件包

在HTTP Upstream模块中,通过server指令指定后端服务器的IP地址端口,同时还可以设定每个后端服务器在负载均衡调度中的状态常用的状态有:

  • down: 当前的server暂时不参与负载均衡
  • backup: 预留的备份机器(当有非backup机器出现故障或者忙的时候,才会请求backup机器,压力最小)
  • max_fails: 允许请求失败的次数,默认为1;超过最大次数时,返回proxy_next_upstream 模块定义的错误
  • fail_timeout: 经历了max_fails次失败后,暂停服务的时间(可和max_fails一起使用)

(注意:当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weight和backup)

Nginx的Master-worker模式

Nginx进程信息

启动nginx后,其实就是在80端口启动Socket服务进行监听,如上图所示,Nginx涉及Master和Worker进程。
Master进程的作用:
读取并验证配置文件nginx.conf;管理worker进程;
Worker进程的作用:
每一个Worker进程都维护一个线程(避免线程切换),处理连接和请求;注意Worker进程的个数由配置文件决定,一般和CPU个数相关(有利于进程切换),配置几个就有几个Worker进程。

3. 应用

3.1 反向代理(proxy_pass)

正向代理

了解反向代理之前,先了解一下正向代理。

正向代理是从客户端的角度出发,服务于局域网用户,以访问非特定的服务,其中最典型的例子就是翻墙;
正向代理:
1.常说的代理;
2.正向代理的过程,它隐藏了真实的请求客户端,服务端不知道真实的客户端是谁,客户端请求的服务都被代理服务器代替来请求

反向代理:
反向代理正好与此相反,从服务端的角度出发,服务于所有用户,隐藏实际的服务节点,服务节点的架构对用户透明,以代理节点统一对外服务。
(注意:透明为计算机术语,指客观存在并且运行着但是我们看不到的特性。简单来说,透明就是黑盒,只需要应用它给出的接口,而不需要了解内在机理。)

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

反向代理基本配置

有关详细设置不进行详细赘述(仅简介)

  1. proxy_pass
    将当前请求代理到URL参数指定的服务器上,URL可以是主机名或者IP地址加PORT的形式
   proxy_pass URL;
   配置块 location if
   proxy_pass http://localhost:8000;
   也可以结合负载均衡实用<负载均衡会说明这种情况>
   也可以把HTTP转换成HTTPS
   proxy_pass http://192.168.0.1;
  1. proxy_method
    此配置项表示转发时的协议方法名:
	proxy_method method_name;
    配置块 http server location
        proxy_method POST;
    那么客户端发来的GET请求在转发时方法改为POST;
  1. proxy_hide_header
    Nginx会将上游服务器的响应转发给客户端,但默认不转发HTTP头部字段(Date Server X-Pad X-Accel-* )
    proxy_hide_header header1;
    配置块 http server location;
    使用proxy_hide_header可以指定任意头部不能被转发
    proxy_hide_header Cache-Control;
  1. proxy_pass_header
    功能与 proxy_hide_header相反,是设置哪些头部允许转发.
    proxy_pass_header header1;
    配置块 http server location
    proxy_pass_header X-Accel-Redirect;
  1. proxy_pass_request_body
    确定上游服务器是否向上游服务器转发HTTP包体
    proxy_pass_request_body off|on;
    默认 on
    配置块 http server location;
  1. proxy_pass_request_header
    确定是否转发HTTP头部
    proxy_pass_request_header on | off;
    默认on
    配置块 http server location
  1. proxy_redirect
    当上游服务响应时重定向或刷新(HTTP 301 302),proxy_redirect可以重设HTTP头部的location或refresh字段
    proxy_redirect [default | off |redirect |replacement]
    默认default
    配置块 http server location
  1. proxy_next_upstream
    表示上游一台服务器转发请求出现错误时,继续换一套服务器处理这个请求其参数用来说明在那些情况下继续选择下一台上游服务器转发请求.
	proxy_next_upstream [error |timeout |invalid_header |http_500 |http_502~504 |http_404 | off]
    默认 proxy_next_upstream error timeout;
    配置块 http server location

可以通过阅读 ngx_http_proxy_module了解更多详细情况

	#sudo vim /usr/local/nginx/conf/nginx.conf 

	server {
		listen       80;
	    server_name  localhost;
        location / {
        #保证代理机器能访问到 下面的机器并装有nginx  在主机号为100的机器上有响应网页
        proxy_pass http://192.168.1.100;
        root   html;
        index  index.html index.htm;
        	   }
    }
    sudo /usr/local/nginx/sbin/nginx -s reload

3.2 负载均衡(upstream)

负载均衡:由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助。通过某种负载分担技术,将外部发送来的请求按照事先设定分配算法分配到对称结构中的某一台服务器上,而接收到请求的服务器独立地回应客户的请求。

  1. upstream块
upstream name {...}
配置块 http
upstream块定义一个上游服务器的集群,便于反向代理中的proxy_pass使用

upstream mynet{
    server www.wopai1.com;
    server www.wopai2.com;
    server www.wopai3.com;
}
server {
    location /{
        proxy_pass http://mynet;
    }
}
  1. server
server name [paramenters]
配置块upstream
server配置项指定了一台上游服务器的名字,可以是域名 IP地址端口 UNIX句柄
weight= number;设置向这台服务器转发的权重,默认为1
max_fails=number;该选项域fail_timeout配合使用
      指在fail_timeout时间段内如果转发上游失败超过number次就认为当前的fail_timeout时间内
      这台服务器不可用,max_fails默认为1 如果设置为0 表示不检查失败次数
fail_timeout=time; fail_timeout表示该时间内转发多少次失败后就认为上游不可用.默认10s
down    表示上游服务器永久下线,只能在ip_hash配置时才有效
backup  在ip_hash配置时无效.只有所有非备份机都失败,才向上游备份服务器转发请求.
upstream mynet{
  server www.wopai1.com weight=5;
  server www.wopai2.com:8081 max_fails=3 fail_timeout=300s;
  server www.wopai2.com down;
}
  1. ip_hash
配置块 upstream
希望来自某一个用户的请求始终落在固定的一台服务器上进行处理.
根据客户端的IP散列计算出一个key,将key按照upstream集群中的上游服务器进行取模,求得的值对应的主机接收转发请求.
ip_hash不可以与weight同时使用
如果upstream配置中有一台服务器暂时不可用,不能直接删除该配置,而应该使用down标识.
upstream mynet{
    ip_hash;
    server www.wowpai1.top;
    server www.wowpai2.top;  
    server www.wowpai3.top down;
}

最后,附上 Nginx负载均衡基本配置(示例)

	    upstream my.net{    #my.net是自定义的命名 在server结构中引用即可

        #代理服务器为 两台机器192.168.22.136 192.168.22.147做负载均衡操作 
        #两台机器上 可以跑apache负载功能更为强大的网页相关任务

        #max_fails 表示尝试出错最大次数 即可认为该服务器 在fail_timeout时间内不可用
        # server servername:port   servername可以写主机名 或者点分式IP
        server 192.168.22.136:80 max_fails=1 fail_timeout=300s;
        server 192.168.22.147:80 max_fails=1 fail_timeout=300s;  
        }


        server {
        listen       80;
        server_name  localhost; 
        location / {
            #upstream 块名
            proxy_pass http://my.net;
            root   html;
            index  index.html index.htm;
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值