16小白入坑指南——Nginx

前言:在开始介绍之前,先贴出官网地址,一切还是以官网为准
官网地址

http://nginx.org/en/download.html

一、什么是Nginx

Nginx(engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx是由伊戈尔·赛索耶夫
为俄罗斯访问量第二的http://Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。 其将源
代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,
Nginx 1.0.4发布。 Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like
协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用
Nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
——来自官方解释

看不懂没关系,我也看不懂。
简单的说,使用Nginx可以帮助你完成以下的需求:

  • 1.搭建个人网站;

  • 2.可以用来做反向代理服务器;

  • 3.可以做文件服务器;

  • 4.可以做电子邮件代理服务器;

  • 5.搭建多个虚拟主机。

二、为什么要使用Nginx

有人说WEB服务器完全可以使用Apache ,为什么要使用Nginx,但是在你看完它的特点之后相信你就不会这么说了。

Nginx的优势:
1.轻量的安装包,占用更少的内存,具有很强的高并发能力;
2.稳定性强,可以做到7*24 *365不宕机(非人为);
3.具有丰富的模块,配置简单

这个感受好比,明明可以使用2000多的手机就能完成的事,那为什么还要去买6000多的手机的道理是一样的。

三、该用什么方式安装

如果使用yum的方式安装,可以说,谁都会。所以不管是在实际生产中,还是平时的练习使用中,都要学会使用源码包的方式安装。

先贴出官网地址,可能有的同学想要使用不同的版本,可以自己下载:

源码包下载地址

http://nginx.org/en/download.html

image-20210608140748689.png

安装之前准备(必选):
因为Nginx是使用C语言编写的,在编译安装之前要确保系统安装有C语言的编译环境和相关依赖包

#gcc是C语言的编译工具
#PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正则表达式库
#zlib库提供了开发人员的压缩算法,在Nginx的各个模块中需要使用gzip压缩,所以我们也需要提前安装其库及源代码zlib和zlib-devel
#OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包进行安全通信,并且避免被窃听。
yum  install -y  make gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel

总之,用就对了,不然在检查环境configure的时候会报错,一旦报错就不能进行下一步操作了

安装过程

安装部署:
1.下载

cd /usr/local/src/
wget http://nginx.org/download/nginx-1.16.1.tar.gz

2.解压

tar -zxf /usr/local/src/nginx-1.16.1.tar.gz

3.进入解压后的目录

cd /usr/local/src/nginx-1.16.1/

4.执行configure工具(简单安装不需要添加任何编译参数)

./configure

5.编译安装

make && make install

6.启动测试

/usr/local/nginx/sbin/nginx
netstat -tlunp|grep 80

在安装部署的第4步./configure的时候可以指定一些编译参数,启动模块功能

  使用命令`/usr/local/src/nginx-1.16.1/configure --help`查看全部的参数,当然也可以不写,不写就是默认值
/usr/local/src/nginx-1.16.1/configure --help

 --help                             print this message

 --prefix=PATH                      set installation prefix
 --sbin-path=PATH                   set nginx binary pathname
 --modules-path=PATH                set modules path
 --conf-path=PATH                   set nginx.conf pathname
 --error-log-path=PATH              set error log pathname
 --pid-path=PATH                    set nginx.pid pathname
 --lock-path=PATH                   set nginx.lock pathname

 --user=USER                        set non-privileged user for
                                    worker processes
 --group=GROUP                      set non-privileged group for
                                    worker processes

 --build=NAME                       set build name
 --builddir=DIR                     set build directory

 --with-select_module               enable select module
 --without-select_module            disable select module
 --with-poll_module                 enable poll module
 --without-poll_module              disable poll module

 --with-threads                     enable thread pool support

 --with-file-aio                    enable file AIO support

  参数有很多,这里只列出了几个常用的。

四、常用命令

Nginx的命令本身就不多,常用的几个命令如下

所有命令建议使用绝对路径的方式启动,不建议将命令加入全局变量

#查看Nginx版本号
/usr/local/nginx/sbin/nginx -V
#nginx帮助命令
/usr/local/nginx/sbin/nginx -h
#验证配置语法是否正确
/usr/local/nginx/sbin/nginx -t
#启动nginx
/usr/local/nginx/sbin/nginx
#关闭nginx
/usr/local/nginx/sbin/nginx -s stop
#配置文件修改重装载命令
/usr/local/nginx/sbin/nginx -s reload

五、配置文件讲解

先给出一份知乎上看到了清单配置

一份配置清单例析
nginxconf.jpg

配置文件说明(不必死记硬背,可以当作工具查看,需要的时候在看)

#定义Nginx运行的用户和用户组
user www www;
#
#nginx进程数,建议设置为等于CPU总核心数.
worker_processes 8;
#
#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
error_log /var/log/nginx/error.log info;
#
#进程文件
pid /var/run/nginx.pid;
#
#一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致.
worker_rlimit_nofile 65535;
#
#工作模式与连接数上限
events
{
    #参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型.
    use epoll;
    #单个进程最大连接数(最大连接数=连接数*进程数)
    worker_connections 1024;    #最大连接数,默认为512
}
#
#设定http服务器
http
{
    include mime.types; #文件扩展名与文件类型映射表
    default_type application/octet-stream; #默认文件类型
    #charset utf-8; #默认编码
    server_names_hash_bucket_size 128; #服务器名字的hash表大小
    client_header_buffer_size 32k; #上传文件大小限制
    large_client_header_buffers 4 64k; #设定请求缓
    client_max_body_size 8m; #设定请求缓
      keepalive_timeout 65;  #连接超时时间,默认为75s,可以在http,server,location块。
    # 开启目录列表访问,合适下载服务器,默认关闭.
    autoindex on; # 显示目录
    autoindex_exact_size on; # 显示文件大小 默认为on,显示出文件的确切大小,单位是bytes 改为off后,显示出文件的大概大小,单位是kB或者MB或者GB
    autoindex_localtime on; # 显示文件时间 默认为off,显示的文件时间为GMT时间 改为on后,显示的文件时间为文件的服务器时间
    
    sendfile on; # 开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载.注意:如果图片显示不正常把这个改成off.
    tcp_nopush on; # 防止网络阻塞
    tcp_nodelay on; # 防止网络阻塞
    
    
    # FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度.下面参数看字面意思都能理解.
    fastcgi_connect_timeout 300; ## 链接
    fastcgi_send_timeout 300;  ##读取 是指nginx进程向fastcgi进程发送request的整个过程的超时时间
    fastcgi_read_timeout 300;  ##发请求 是指fastcgi进程向nginx进程发送response的整个过程的超时时间
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;
    
    # gzip模块设置
    gzip on; #开启gzip压缩输出
    gzip_min_length 1k; #允许压缩的页面的最小字节数,页面字节数从header偷得content-length中获取.默认是0,不管页面多大都进行压缩.建议设置成大于1k的字节数,小于1k可能会越压越大
    gzip_buffers 4 16k; #表示申请4个单位为16k的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果
    gzip_http_version 1.1; #压缩版本(默认1.1,目前大部分浏览器已经支持gzip解压.前端如果是squid2.5请使用1.0)
    gzip_comp_level 2; #压缩等级.1压缩比最小,处理速度快.9压缩比最大,比较消耗cpu资源,处理速度最慢,但是因为压缩比最大,所以包最小,传输速度快
    gzip_types text/plain application/x-javascript text/css application/xml;
    #压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn.
    gzip_vary on;#选项可以让前端的缓存服务器缓存经过gzip压缩的页面.例如:用squid缓存经过nginx压缩的数据
    
    #开启限制IP连接数的时候需要使用
    #limit_zone crawler $binary_remote_addr 10m;
    
    ##upstream的负载均衡,四种调度算法(下例主讲)##
    
    #虚拟主机的配置
    server
    {
        # 监听端口
        listen 80;
        # 域名可以有多个,用空格隔开
        server_name 127.0.0.1;
        # HTTP 自动跳转 HTTPS
        rewrite ^(.*) https://www.baidu.com;
        deny 127.0.0.1;  #拒绝的ip
        allow 172.18.5.54; #允许的ip 
    }
    upstream myserver {   
      server 127.0.0.1:8080;
      server 192.168.24.189:8080 backup;  #热备
    }
    server
    {
        # 监听端口 HTTPS
        listen 443 ssl;
        server_name https://www.baidu.com;
        root /data/www/;
        # 配置域名证书
        ssl_certificate      C:\WebServer\Certs\certificate.crt;
        ssl_certificate_key  C:\WebServer\Certs\private.key;
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;
        ssl_protocols SSLv2 SSLv3 TLSv1;
        ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
        ssl_prefer_server_ciphers  on;
    
        index index.html index.htm index.php;
        
        location ~ .*\.(php|php5)?$
        {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            include fastcgi.conf;
        }
        
        # 配置地址拦截转发,解决跨域验证问题
        location /oauth/{
            proxy_pass https://localhost:13580/oauth/;
            proxy_set_header HOST $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
        
        # 图片缓存时间设置
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
            expires 10d;
        }
        
        # JS和CSS缓存时间设置
        location ~ .*\.(js|css)?$ {
            expires 1h;
        }

        # 日志格式设定
        log_format access '$server_name $remote_addr -$remote_user [$time_local] "$request"'
                  '$status $uptream_status $body_bytes_sent "$http_referer"'
                  '"$http_user_agent" "$http_x_forwarded_for" '
                  '$ssl_protocol $ssl_cipher $upstream_addr $request_time $upstream_response_time';
       # 定义本虚拟主机的访问日志
        access_log /var/log/nginx/access.log access;
        
        # 设定查看Nginx状态的地址.StubStatus模块能够获取Nginx自上次启动以来的工作状态,此模块非核心模块,需要在Nginx编译安装时手工指定才能使用
        location /NginxStatus {
            stub_status on;
            access_log on;
            auth_basic "NginxStatus";
            auth_basic_user_file conf/htpasswd;
            #htpasswd文件的内容可以用apache提供的htpasswd工具来产生.
        }
    }
}

简化版实用版

# nginx运行的用户名
user nginx;
# nginx启动进程,通常设置成和cpu的数量相等,这里为自动
worker_processes auto;

# errorlog文件位置
error_log /var/log/nginx/error.log;
# pid文件地址,记录了nginx的pid,方便进程管理
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
# 用来加载其他动态模块的配置
include /usr/share/nginx/modules/*.conf;

# 工作模式和连接数上限
events {
    # 每个worker_processes的最大并发链接数
    # 并发总数:worker_processes*worker_connections
    worker_connections 1024;
}

# 与提供http服务相关的一些配置参数类似的还有mail
http {
    # 设置日志的格式
    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记录访问的用户、页面、浏览器、ip和其他的访问信息
    access_log  /var/log/nginx/access.log  main;

    # 这部分下面会单独解释
    # 设置nginx是否使用sendfile函数输出文件
    sendfile            on;
    # 数据包最大时发包(使用Nagle算法)
    tcp_nopush          on;
    # 立刻发送数据包(禁用Nagle算法)
    tcp_nodelay         on;
    # 链接超时时间
    keepalive_timeout   65;
    # 这个我也不清楚...
    types_hash_max_size 2048;

    # 引入文件扩展名与文件类型映射表
    include             /etc/nginx/mime.types;
    # 默认文件类型
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    # http服务上支持若干虚拟主机。
    # 每个虚拟主机一个对应的server配置项
    # 配置项里面包含该虚拟主机相关的配置。
    server {
        # 端口
        listen       80 default_server;
        listen       [::]:80 default_server;
        # 访问的域名
        server_name  _;
        # 默认网站根目录(www目录)
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.

        include /etc/nginx/default.d/*.conf;

        # 默认请求
        location / {
        }

        # 错误页(404)
        error_page 404 /404.html;
            location = /40x.html {
        }

        # 错误页(50X)
        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
}

六、虚拟主机

虚拟主机,也叫“网站空间”,就是把一台运行在互联网上的物理服务器划分成多个“虚拟”服务器。虚拟主机技术极大的促进了网络技术的应用和普及。同时虚拟主机的租用服务也成了网络时代的一种新型经济形式。

在主配置文件的http块添加include vhosts/*.conf;

vim /usr/local/nginx/conf/nginx.conf
#user  nobody;
worker_processes  1;

events {
    worker_connections  1024;
}

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

    sendfile        on;

    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

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

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

mkdir  /usr/local/nginx/conf/vhosts/

七、代理

01.正向代理

02.反向代理

八、负载均衡

官方地址

http://nginx.org/en/docs/http/ngx_http_upstream_module.html#upstream

简单来说所谓的负载均衡就是把很多请求进行分流,将他们分配到不同的服务器去处理。比如我有3个服务器,分别为A、B、C,
然后使用Nginx进行负载均衡,使用轮询策略,此时如果收到了9个请求,那么会均匀的将这9个请求分发给A、B、Cf服务器,
每一个服务器处理3个请求,这样的话我们可以利用多台机器集群的特性减少单个服务器的压力。

负载均衡架构和策略
image-20210608172542079.png

准备三个服务器(单节点多实例)

cd /usr/local/src/
wget https://mirrors.bfsu.edu.cn/apache/tomcat/tomcat-8/v8.5.66/bin/apache-tomcat-8.5.66.tar.gz
tar xf apache-tomcat-8.5.66.tar.gz
mv apache-tomcat-8.5.66 /usr/local/tomcat-8.5
cd /usr/local/
#准备三个实例
cp -a  tomcat-8.5/ tomcat-8.5.80
cp -a  tomcat-8.5/ tomcat-8.5.81
cp -a  tomcat-8.5/ tomcat-8.5.82
#修改每个实例的端口和首页
sed -i  s/8080/8081/g /usr/local/tomcat-8.5.81/conf/server.xml 
sed -i  s/8005/8006/g /usr/local/tomcat-8.5.81/conf/server.xml 
sed -i  s/8009/8010/g /usr/local/tomcat-8.5.81/conf/server.xml 

sed -i  s/8080/8082/g /usr/local/tomcat-8.5.82/conf/server.xml 
sed -i  s/8005/8007/g /usr/local/tomcat-8.5.82/conf/server.xml 
sed -i  s/8009/8011/g /usr/local/tomcat-8.5.82/conf/server.xml 

echo "8080"  > /usr/local/tomcat-8.5.80/webapps/ROOT/index.jsp
echo "8081"  > /usr/local/tomcat-8.5.81/webapps/ROOT/index.jsp
echo "8082"  > /usr/local/tomcat-8.5.82/webapps/ROOT/index.jsp

/usr/local/tomcat-8.5.80/bin/startup.sh
/usr/local/tomcat-8.5.81/bin/startup.sh
/usr/local/tomcat-8.5.82/bin/startup.sh

确保三个实例都能正常访问

负载均衡策略

01.轮询

编写虚拟主机配置文件

/usr/local/nginx/conf/vhosts/
vim tomcat.conf 

upstream backend {
    server 127.0.0.1:8080;
    server 127.0.0.1:8081;
    server 127.0.0.1:8082;
}

server {
    listen 80;
    location / {
        proxy_pass http://backend;
    }
}
#重现加载配置服务
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
#浏览器访问可以看到每次的页面都是不一样的,说明可以能将请求分发到后端的服务器上

02.权重

只需要修改配置文件upstream模块的功能

vim tomcat.conf
upstream backend {
    server 127.0.0.1:8080 weight=5;
    server 127.0.0.1:8081 weight=3;
    server 127.0.0.1:8082 weight=1;
}
...
#重现加载配置服务
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload

03.ip_hash

只需要修改配置文件upstream模块的功能

vim tomcat.conf
upstream backend {
    ip_hash;
    server 127.0.0.1:8080 ;
    server 127.0.0.1:8081 ;
    server 127.0.0.1:8082 ;
}
...
#重现加载配置服务
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload

负载均衡的实现最主要的还是依赖于两个模块upstreamproxy_pass模块

九、动静分离

Nginx的并发能力公式:

worker_processes * worker_connections / 4|2 = Nginx最终的并发能力

动态资源需要/4,静态资源需要/2

Nginx通过动静分离来提升Nginx的并发能力,更快的给用户响应

为什么要进行动静分离?

在Web开发中,通常来说,动态资源其实就是指那些后台资源,而静态资源就是指HTML,JavaScript,CSS,img等文件。

一般来说,都需要将动态资源和静态资源分开,将静态资源部署在Nginx上,当一个请求来的时候,如果是静态资源的请求,就直接到nginx配置的静态资源目录下面获取资源,如果是动态资源的请求,nginx利用反向代理的原理,把请求转发给后台应用去处理,从而实现动静分离。

在使用前后端分离之后,可以很大程度的提升静态资源的访问速度,同时在开过程中也可以让前后端开发并行可以有效的提高开发时间,也可以有些的减少联调时间 。

01.动态资源配置

在配置文件修改

location / {
    proxy_pass URL;
}

02.静态资源配置

#配置如下
location / {
    root 静态资源路径;
    index 默认访问路径下的什么资源;
    autoindex on;#代表展示静态资源的全部内容,以列表的形式展开
}

一般的静态资源文件是放在Nginx所在的服务器上的,可以使用NFS挂载目录。

十、Nginx服务器版本升级

对Nginx版本进行不宕机更新,就需要用到Nginx服务器提供的平滑升级功能。

步骤:

01.查看旧版本的参数配置

/usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.16.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) 
configure arguments: #(如果之前没有添加参数配置的话,就不会有以下的参数)

02.下载新版本的源码包

cd /usr/local/src/
wget http://nginx.org/download/nginx-1.18.0.tar.gz

03.解压、进入、进行参数配置和编译,不需要进行安装(make install)。

#进入源码包目录
cd /usr/local/src/
#解压
tar xf nginx-1.18.0.tar.gz
#参数配置:./configure的时候需要加上旧源码包的参数配置,没有就不添加
./configure
#编译make
make

在make之后就会在目录下生成Makefile文件和objs目录,objs目录就会有刚刚编译生成的二进制可执行文件

04.重命名旧版本的二进制文件

cd /usr/local/nginx/sbin/
mv nginx nginx.old

05.将新编译生成的二进制文件拷贝到原来/usr/local/nginx/sbin目录下

cp /usr/local/src/nginx-1.18.0/objs/nginx /usr/local/nginx/sbin/

06.进入到新版本的安装目录,执行make upgrade

cd /usr/local/src/nginx-1.18.0/
make upgrade

07.查看是否更新成功

/usr/local/nginx/sbin/nginx -V

十一、Nginx添加新模块

添加新模块的思路和版本升级的思路是一样的,不同的地方有两个地方:
1.在添加新模块的时候,确保Nginx使用源码包是同一个
2.在参数配置./configure的时候需要带上–add-module=path_of_new_module

步骤:

01.查看nginx编译安装时安装了哪些模块

/usr/local/nginx/sbin/nginx -V
...
configure arguments:...
...

02.下载好第三方扩展模块nginx-rtmp-module

cd /usr/local/src
wget https://github.com/arut/nginx-rtmp-module/archive/master.zip
unzip master.zip
ls nginx-rtmp-module-master/

02.进入原来编译安装的源码包目录(不建议安装完之后删除目录,不然又得去查找相同的源码包)

如果在添加新模块之前已经完成版本升级,需要进入新版本解压好之后的目录
cd /usr/local/src/nginx-1.18.0/
./configure --add-module=/usr/local/src/headers-more-nginx-module-0.23 --add-module=/usr/local/src/nginx-http-concat-master --with-http_gzip_static_module --add-module=/usr/local/src/nginx-rtmp-module-master

03.编译(千万不能make install)

make

04.替换原来的二进制包

cd /usr/local/nginx/sbin/
mv nginx nginx.old
cp /usr/local/src/nginx-1.18.0/objs/nginx /usr/local/nginx/sbin/

05.再次确认是否安装成功

/usr/local/nginx/sbin/nginx -V

你可能感兴趣的:(16小白入坑指南——Nginx)