文章

Nginx 服务

Nginx简介

1、Nginx介绍

Nginx (”engine x“)一个具有高性能的“HTTP”和“反向代理”的WEB服务,同时也是一个“POP3/SMTP/IMAP代理服务“,是由伊戈尔·赛索耶夫(俄罗斯人)使用C语言编写的,Nginx的第一个版本是2004年10月4号发布的0.1.0版本。另外值得一提的是伊戈尔·赛索耶夫将Nginx的源码进行了开源,这也为Nginx的发展提供了良好的保障。

nginxfather.jpeg

2、Nginx功能分类

Nginx提供的服务功能从大体上归纳为”基本HTTP服务“、”高级HTTP服务“和”邮件服务“等三大类。

2.1 基本HTTP服务

Nginx可以提供基本HTTP服务,可以作为HTTP代理服务器和反向代理服务器,支持通过缓存加速访问,可以完成简单的负载均衡和容错,支持包过滤功能,支持SSL等。

  • 处理静态文件、处理索引文件以及支持自动索引;
  • 提供反向代理服务器,并可以使用缓存加上反向代理,同时完成负载均衡和容错;
  • 提供对FastCGl、memcached等服务的缓存机制;
  • 使用Nginx的模块化特性提供过滤器功能。Nginx基本过滤器包括gzip压缩、ranges支持、chunked响应、XSLT、SSI以及图像缩放等;
  • 支持HTTP下的安全套接层安全协议SSL;
  • 支持基于加权和依赖的优先权的HTTP/2。

2.2 高级HTTP服务

  • 支持基于名字和IP的虚拟主机设置;
  • 支持HTTP/1.0中的KEEP-Alive模式和管线(PipeLined)模型连接;
  • 自定义访问日志格式、带缓存的日志写操作以及快速日志轮转;
  • 提供3xx~5xx错误代码重定向功能;
  • 支持重写(Rewrite)模块扩展;
  • 支持重新加载配置以及在线升级时无需中断正在处理的请求;
  • 支持网络监控;
  • 支持FLV和MP4流媒体传输。

2.3 邮件代理服务

Nginx提供邮件代理服务也是其基本开发需求之一,主要包含以下特性:

  • 支持IMPA/POP3代理服务功能
  • 支持内部SMTP代理服务功能

3、Nginx特点

  1. 速度更快、并发更高

    单次请求或者高并发请求的环境下,Nginx都会比其他Web服务响应的速度更快。一方面在正常情况下,单次请求会得到更快的响应,另一方面,在高峰期(如有数以万计的并发请求),Nginx比其他Web服务更快的响应请求。Nginx之所以有这么高的并发处理能力和这么好的性能原因在于Nginx采用了多进程和I/O多路复用(epoll)的底层实现。

  2. 配置简单,扩展性强

    Nginx的设计极具扩展性,它本身就是由很多模块组成,这些模块的使用可以通过配置文件的配置来添加。这些模块有官方提供的也有第三方提供的模块,如果需要完全可以开发服务自己业务特性的定制模块。

  3. 高可靠性

    Nginx采用的是多进程模式运行,其 中有一个master主进程和N多个worker进程,worker进程的数量我们可以手动设置,每个worker进程之间都是相互独立提供服务,并且master主进程可以在某一个worker进程出错时,快速去"拉起"新的worker进程提供服务。

  4. 热部署

    现在互联网项目都要求以7*24小时进行服务的提供,针对于这一要求,Nginx也提供了热部署功能,即可以在Nginx不停止的情况下,对Nginx进行文件升级、更新配置和更换日志文件等功能。

  5. 成本低、BSD许可证
    BSD是一个开源的许可证;Nginx本身是开源的,我们不仅可以免费的将Nginx应用在商业领域,而且还可以在项目中直接修改Nginx的源码来定制自己的特殊要求。这些点也都是Nginx为什么能吸引无数开发者继续为Nginx来贡献自己的智慧和青春。

4、Nginx和Apache对比

nginx相对于apache的优点:

  • 轻量级,同样起web 服务,比apache占用更少的资源;

  • 抗并发,nginx处理请求是异步非阻塞的,而apache则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能;

  • 高度模块化的设计,编写模块相对简单。

apache 相对于nginx 的优点:

  • rewrite功能比nginx的rewrite 强大;

  • 模块超多,基本想到的都可以找到;

  • 超稳定,nginx相对apache来说bug较多。

Nginx与Apache使用场景:

  • 追求性能web服务用nginx,nginx占用资源少,并发高,静态资源处理性能比apache强;如果不需要性能只求稳定选择apache;
  • apache模块更多,各种功能模块实现比nginx更好、配置项更多,但apache配置起来更复杂;追求功能模块使用apache,想要配置简单使用nginx;
  • nginx处理动态请求较差,一般动态请求要apache去做,nginx更适合静态和反向代理;
  • nginx本身就是一个反向代理服务器,nginx支持7层负载均衡。

nginx_apache.png

5、Nginx安装部署

5.1 yum/dnf部署

yum -y install epel-release
yum makecache
yum -y install nginx

5.2 源码编译部署

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

useradd -s /sbin/nologin -M nginx
mkdir -p /data
tar -xf nginx-1.20.2.tar.gz
cd nginx-1.20.2/

./configure --prefix=/data/nginx --user=nginx --group=nginx --http-client-body-temp-path=/data/nginx/tmp/client/ --http-proxy-temp-path=/data/nginx/tmp/proxy/ --http-fastcgi-temp-path=/data/nginx/tmp/fcgi/ --http-uwsgi-temp-path=/data/nginx/tmp/uwsgi --http-scgi-temp-path=/data/nginx/tmp/scgi --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --with-stream --with-pcre --with-compat

make && make install

mkdir -p /data/nginx/tmp/client

echo 'export PATH=$PATH:/data/nginx/sbin' > /etc/profile.d/nginx.sh
source /etc/profile.d/nginx.sh

#配置systemd启动
chown -R nginx.nginx /data/nginx/

cat > /usr/lib/systemd/system/nginx.service << 'EOF'
[Unit]
Description=nginx
After=network.target

[Service]
Type=forking
PIDFile=/data/nginx/logs/nginx.pid
ExecStartPre=/data/nginx/sbin/nginx -t
ExecStart=/data/nginx/sbin/nginx -c /data/nginx/conf/nginx.conf
ExecReload=/data/nginx/sbin/nginx -s reload
ExecStop=/data/nginx/sbin/nginx -s stop
PrivateTmp=true

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable nginx --now

6、Nginx配置详解

nginx的配置文件是整个服务器的核心所在,它不仅规定了nginx如何响应请求、处理数据,还决定了服务器的各种高级功能如何运作。通过修改配置,我们可以轻松实现诸如反向代理、负载均衡、静态资源服务等功能,从而提升服务器的性能和可靠性;nginx主配置文件为nginx.conf,一般位于nginx安装目录下的conf目录中。

6.1 配置文件结构

nginx配置文件由三个主要部分组成:全局块、events块和http块。其中http块还包含了http全局块和多个server块。每个server块中又进一步包含了server全局块以及多个location块。

  • 全局块涵盖了配置文件开头的部分,主要涉及worker_processes指令,它用于指定Nginx的工作进程数,通常设置为与服务器CPU核数相等。
  • events块中,worker_connections指令至关重要,它定义了Nginx服务器可同时处理的网络连接数。该数值的计算方式为worker_processes乘以worker_connections,例如,当worker_processes=4且worker_connections=1024时,服务器最多可支持4096个并发连接。
  • http块则是Nginx服务器配置中的核心部分,负责配置诸如反向代理、负载均衡和动静分离等关键功能。
  • server块用于设置虚拟主机,支持基于IP、端口号和域名三种方式的配置。
  • location块在Nginx的整个配置文档中扮演着至关重要的角色,许多功能的实现都需要在此进行详尽的配置。
#全局块
user  nginx;
worker_processes  auto;

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

pid        logs/nginx.pid;

#events块
events {
    use                 epoll;
    worker_connections  10240;
}

#http块
http {
    #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  65;
    gzip  on;

    #server块
    server {
        #server全局块
        listen       80;
        server_name  localhost;
        
        access_log  logs/host.access.log  main;
        error_log   logs/host.error.log;
        
        #location块
        location / {
            root   html;
            index  index.html index.htm;
        }

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

        #location块
        location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }

        #location块
        location ~ /\.ht {
            deny  all;
        }
    }

    #server块
    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_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

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

6.2 配置文件解释

user  nginx;               #nginx使用哪个用户运行
worker_processes  auto;    #指定Nginx的工作进程数,通常设置为与服务器CPU核数相等

error_log  logs/error.log;		        #nginx错误日志存放路径,相对与nginx安装目录的路径
#error_log  logs/error.log  notice;		#指定错误日志存放路径的同时指定日志级别,notice表示通知类日志也会记录,info表示普通的信息日志也会记录,默认是error只记录错误日志
#error_log  logs/error.log  info;

pid        logs/nginx.pid;              #nginx进程id存放路径,相对与nginx安装目录的路径

#events块
events {
    use                 epoll;          #采用epoll事件驱动模型
    worker_connections  10240;          #设置每个工作进程同时连接的最大数量
}

#http块
http {
    #http全局块
    include       mime.types;                  #引入mime.types配置,表示nginx能识别的各种文件的类型,如mp4、jpg等,未识别的文件默认会进行下载
    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;                        #和sendfile搭配使用数据包累计一定大小后发送
    keepalive_timeout  65;                     #tcp超时时间

    #server块
    server {
        #server全局块
        listen       80;                       #监听的主机端口
        server_name  localhost;                #监听的域名
        
        access_log  logs/host.access.log  main;    #访问日志存放路径及格式
        error_log   logs/host.error.log;           #错误日志存放路径

        #location块
        location / {                               #location匹配规则
            root   html;                           #站点路径,html为默认nginx站点
            index  index.html index.htm;           #站点默认主页文件
        }

        error_page  404              /404.html;    #404错误页面
        error_page   500 502 503 504  /50x.html;   #50x错误页面
        location = /50x.html {                     #50x页面location配置
            root   html;
        }

        #location块
        location ~ \.php$ {                        #localtion匹配规则正则匹配
            root           html;
            fastcgi_pass   127.0.0.1:9000;         #动态服务地址,动态请求转发至后端动态服务
            fastcgi_index  index.php;              #动态站点默认主页文件
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;    #传递至后端的环境变量
            include        fastcgi_params;         #引入默认环境变量
        }

        #location块
        location ~ /\.ht {                         #localtion匹配规则正则匹配
            deny  all;                             #拒绝所有符合该匹配的请求
        }
    }

    #server块
    server {
        #server全局块
        listen       443 ssl;                  #监听的主机端口,采用ssl加密
        server_name  localhost;

        ssl_certificate      cert.pem;         #证书路径
        ssl_certificate_key  cert.key;         #私钥路径
        ssl_session_cache    shared:SSL:1m;    #缓存配置
        ssl_session_timeout  5m;
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        #location块
        location / {
            root   html;
            index  index.html index.htm;
        }
    }
    
    include  ../sites-enabled/*.conf;          #加载其他配置文件,在http块中使用可以将不同的server写入不同配置文件统一加载,避免配置文件过于繁琐
}

6.3 站点配置示例

#编辑主配置文件
user  nginx;
worker_processes  auto;

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

pid        logs/nginx.pid;

events {
    use                 epoll;
    worker_connections  10240;
}

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  65;
    gzip  on;

    server {
        listen       80;
        server_name  localhost;
        
        access_log  logs/host.access.log  main;
        error_log   logs/host.error.log;

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

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

#进入站点目录添加主页文件
cd /data/nginx/html
cat > index.html << 'EOF'
hello world
EOF

#启动服务
systemctl start nginx

#重载配置,nginx不需要重启加载配置,一般先检查配置,然后热重载配置
nginx -t
nginx -s reload

#测试,命令行使用curl请求web服务,返回hello world主页内容
curl http://127.0.0.1:80
hello world

7、多站点配置

nginx和httpd一样也可以用虚拟主机的方式配置不同站点。

多站点配置方式:

  • 相同IP不同端口
  • 不同IP相同端口
  • 相同IP相同端口不同域名

相同IP相同端口不同域名

#单独编辑新的配置文件,配置多站点
mkdir /data/nginx/sites-enabled/
vim /data/nginx/sites-enabled/test.conf
server {
    listen       192.168.1.1:80;
    server_name  www.hzz.com;

    location / {
        root   /data/nginx/html/hzz;
        index  index.html index.htm;
    }
}

server {
    listen       192.168.1.1:80;
    server_name  www.zzh.com;

    location / {
        root   /data/nginx/html/zzh;
        index  index.html index.htm;
    }
}

#配置站点
mkdir /data/nginx/html/hzz
cat > /data/nginx/html/hzz/index.html << 'EOF'
hzz
EOF

mkdir /data/nginx/html/zzh
cat > /data/nginx/html/zzh/index.html << 'EOF'
zzh
EOF

#重载配置
nginx -t
nginx -s reload

#测试,注意配置域名解析
curl http://www.hzz.com
hzz

curl http://www.zzh.com
zzh

8、https站点配置

nginx配置https需要安装时添加https模块,yum/dnf安装默认支持https,编译安装在编译时需要加入–with-http_ssl_module。

配置示例

#生成自签证书文件
#生成完成后包括server.key,server.csr,server.crt文件,实际仅需要server.key,server.crt即可
mkdir /data/nginx/cert
cd /data/nginx/cert
openssl genrsa -out server.key 2048
#信息填写回车即可
openssl req -new -key server.key -out server.csr
openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt

vim /data/nginx/sites-enabled/test-https.conf
server {
    listen       443 ssl;
    server_name  localhost;

    ssl_certificate      /data/nginx/cert/server.crt;    #配置证书路径
    ssl_certificate_key  /data/nginx/cert/server.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;
    }
}

#测试,此时请求web服务应使用https协议
curl https://127.0.0.1:443
hello world
License: