• 架构师系列-Nginx、OpenResty(一)- 基本使用配置


    Nginx 模块

    高度模块化的设计是 Nginx 的架构基础,Nginx 服务器被分解为多个模块,每个模块就是一个功能模块,只负责自身的功能,模块之间严格遵循“高内聚,低耦合”的原则。

    核心模块

    核心模块是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录、配置文件解析、事件驱动机制、进程管理等核心功能。

    标准 HTTP 模块

    标准 HTTP 模块提供 HTTP 协议解析相关的功能,如:端口配置、网页编码设置、HTTP 响应头设置等。

    可选 HTTP 模块

    可选 HTTP 模块主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,如:Flash 多媒体传输、解析 GeoIP 请求、SSL 支持等。

    邮件服务模块

    邮件服务模块主要用于支持 Nginx 的邮件服务,包括对 POP3 协议、IMAP 协议和 SMTP 协议的支持。

    第三方模块

    第三方模块是为了扩展 Nginx 服务器应用,完成开发者自定义功能,如:Json 支持、Lua 支持等。

     nginx应用场景

    Nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器;同时也是一个IMAP、POP3、SMTP代理服务器;Nginx可以作为一个HTTP服务器进行网站的发布处理,另外Nginx可以作为反向代理进行负载均衡的实现。

    正向代理与反向代理的区别,nginx主要是反向代理实现负载均衡。

    Nginx的安装 

    编译安装nginx

    1. # 安装make
    2. yum -y install autoconf automake make
    3. # 安装g++
    4. yum -y install gcc gcc-c++
    5. # 安装nginx依赖的库
    6. yum -y install wget pcre pcre-devel zlib zlib-devel openssl openssl-devel
    7. # 下载nginx
    8. wget http://nginx.org/download/nginx-1.23.0.tar.gz
    9. # 解压nginx
    10. tar -zxvf nginx-1.21.1.tar.gz
    11. # 编译安装
    12. ./configure --prefix=/usr/local/nginx
    13. make && make install

    编译配置

    • –prefix指定安装目录
    • –with-http_ssl_module安装https模块
    • creating objs/Makefile 代表编译成功
    • make编译
    • make install安装

    配置环境变量 

    1. vi /etc/profile
    2. # 在最后一行加入
    3. export PATH=$PATH:/usr/local/nginx/sbin
    4. # 生效环境变量
    5. source /etc/profile

     关闭防火墙

    1. systemctl status firewalld
    2. systemctl stop firewalld
    3. systemctl disable firewalld

    配置Hosts

    因为需要通过虚拟主机配置我们需要配置hosts文件

    1. 192.168.245.198 www.abc.com
    2. 192.168.245.198 www.abc.cn
    3. 192.168.245.198 www.bbs.com
    4. 192.168.245.198 www.resources.com
    5. 192.168.245.198 www.ab.com
    6. 192.168.245.198 www.yyy.com

    yum方式

    添加源

    默认情况Centos7中无Nginx的源,最近发现Nginx官网提供了Centos的源地址,因此可以如下执行命令添加源。

    sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

    安装Nginx

    1. sudo yum install -y nginx
    2. # 启动
    3. sudo systemctl start nginx.service
    4. # 设置开机自动运行
    5. sudo systemctl enable nginx.service

     Nginx常用命令

    1. # 启动
    2. nginx
    3. # 如果执行配置文件
    4. nginx -c nginx.conf #如果不指定,默认为NGINX_HOME/conf/nginx.conf
    5. #停止
    6. nginx -s stop
    7. #退出
    8. nginx -s quit
    9. #关闭
    10. # 查看nginx进程号
    11. ps -aux | grep nginx
    12. # 杀掉进程
    13. kill -9 nginx
    14. # 重新加载配置文件
    15. nginx -s reload
    16. #检查配置文件是否正确
    17. nginx -t -c /路径/nginx.conf
    18. #查看nginx的版本信息
    19. nginx -v

    配置文件结构

    Nginx配置文件一般位于Nginx安装目录下的conf目录下,整个文件以block形式组合而成,每一个block都使用"{}"大括号来表示,block中可以嵌套其他block层级,其中main层是最高层次。

    Nginx配置文件主要有4部分,main(全局设置)、server(主机设置)、upstream(上游服务器设置,主要为反向代理,负载均衡相关配置)和location(url匹配特定位置的设置),每部分包含若干指令。

    • Main部分的设置影响其他所有部分的设置;
    • Server部分主要用于指定虚拟机主机域名,ip和端口;
    • Upstream的指令用于设置一系列的后端服务器,设置反向代理及后端服务器的负载均衡;
    • Location部分用于匹配网页位置(如,跟目录“/”,”/images”等)。

    它们之间的关系是,server继承main,location继承server,upstream既不会继承指令也不会被继承。

    在这四个部分当中,每个部分都包含若干指令,这些指令主要包含Nginx的主模块指令、事件模块指令、HTTP核心模块指令,同时每个部分还可以使用其他HTTP模块指令,例如Http SSL模块、HttpGzip Static模块和Http Addition模块等。

    真实的nginx配置文件可能如下 

    1. ########### 每个指令必须有分号结束。#################
    2. #user administrator administrators; #配置用户或者组,默认为nobody nobody。
    3. #worker_processes 2; #允许生成的进程数,默认为1
    4. #pid /nginx/pid/nginx.pid; #指定nginx进程运行文件存放地址
    5. error_log log/error.log debug; #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
    6. events {
    7. accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on
    8. multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off
    9. #use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    10. worker_connections 1024; #最大连接数,默认为512
    11. }
    12. http {
    13. include mime.types; #文件扩展名与文件类型映射表
    14. default_type application/octet-stream; #默认文件类型,默认为text/plain
    15. #access_log off; #取消服务日志
    16. log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
    17. access_log log/access.log myFormat; #combined为日志格式的默认值
    18. sendfile on; #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
    19. sendfile_max_chunk 100k; #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
    20. keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。
    21. upstream mysvr {
    22. server 127.0.0.1:7878;
    23. server 192.168.10.121:3333 backup; #热备
    24. }
    25. error_page 404 https://www.baidu.com; #错误页
    26. server {
    27. keepalive_requests 120; #单连接请求上限次数。
    28. listen 4545; #监听端口
    29. server_name 127.0.0.1; #监听地址
    30. location ~*^.+$ { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
    31. #root path; #根目录
    32. #index vv.txt; #设置默认页
    33. proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
    34. deny 127.0.0.1; #拒绝的ip
    35. allow 172.18.5.54; #允许的ip
    36. }
    37. }
    38. }

    配置文件位置

    nginx配置为简化日常维护而设计,并且提供了简单的手段用于web服务器将来的扩展。

    配置文件是一些文本文件,通常位于nginx安装路径/etc/nginx/etc/nginx,主配置文件通常命名为nginx.conf为了保持整洁,部分配置可以放到单独的文件中,再自动地被包含到主配置文件,但应该注意的是,nginx目前不支持Apache风格的分布式配置文件(如.htaccess文件),所有和nginx行为相关的配置都应该位于一个集中的配置文件目录中。

    Nginx的全局配置

    1. user nobody nobody;
    2. worker_processes 2;
    3. error_log logs/error.log notice;
    4. pid logs/nginx.pid;
    5. events{
    6. use epoll;
    7. worker_connections 65536;
    8. }

    user

    user是个主模块指令,指定Nginx Worker进程运行用户以及用户组,默认由nobody账号运行。

    这个地方如果写错了就会出现获取不到用户的错误

    worker_processes 

    是个主模块指令,指定了Nginx要开启的进程数,每个Nginx进程平均耗费10M~12M内存,建议指定和CPU的数量一致即可。

    这个地方如果配置了worker_processes 2;那么他的工作进程就有两个

    error_log 

    是个主模块指令,用来定义全局错误日志文件,日志输出级别有debug、info、notice、warn、error、crit可供选择,其中,debug输出日志最为最详细,而crit输出日志最少。

    日志文件路径一般在nginx安装目录的logs目录中

    pid 

    是个主模块指令,用来指定进程pid的存储文件位置。

    进行成和nginx的master的进程号是一致的,只有nginx运行时才存在,如果nginx停止了 pid也会被删除掉

     events事件指令

    events事件指令是设定Nginx的工作模式及连接数上限:

    use

    use是个事件模块指令,用来指定Nginx的工作模式

    Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll,其中select和poll都是标准的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平台上,而kqueue用在BSD系统中,对于Linux系统,epoll工作模式是首选。

    worker_connections

    也是个事件模块指令,用于定义Nginx每个进程的最大连接数,默认是1024。

    最大客户端连接数由worker_processes和worker_connections决定,即Max_client=worker_processes*worker_connections ​ 在作为反向代理时,max_clients变为:max_clients = worker_processes * worker_connections/4。 进程的最大连接数受Linux系统进程的最大打开文件数限制,在执行操作系统命令“ulimit -n 65536”后worker_connections的设置才能生效

    HTTP服务器配置 

    Nginx对HTTP服务器相关属性的配置代码如下:

    1. http {
    2. # 引入文件类型映射文件
    3. include mime.types;
    4. # 如果没有找到指定的文件类型映射 使用默认配置
    5. default_type application/octet-stream;
    6. # 日志打印格式
    7. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
    8. '$status $body_bytes_sent "$http_referer" '
    9. '"$http_user_agent" "$http_x_forwarded_for"';
    10. # 启动零拷贝提高性能
    11. sendfile on;
    12. # 设置keepalive长连接超时时间
    13. keepalive_timeout 65;
    14. # 引入子配置文件
    15. include /usr/local/openresty/nginx/conf/conf.d/*.conf;
    16. }

     下面的代码实现对日志格式的设定:下面详细介绍下这段代码中每个配置选项的含义。

    include

    include是个主模块指令,实现对配置文件所包含的文件的设定,可以减少主配置文件的复杂度,可以将其他各个模块的具体配置分散在不同的文件夹中。

    default_type 

    default_type属于HTTP核心模块指令,这里设定默认类型为二进制流,也就是当文件类型未定义时使用这种方式,例如在没有配置PHP环境时,Nginx是不予解析的,此时,用浏览器访问PHP文件就会出现下载窗口。

    log_format 

    log_format是Nginx的HttpLog模块指令,用于指定Nginx日志的输出格式。main为此日志输出格式的名称,可以在下面的access_log指令中引用。

    1. log_format main '$remote_addr - $remote_user [$time_local] '
    2. '"$request" $status $bytes_sent '
    3. '"$http_referer" "$http_user_agent" '
    4. '"$gzip_ratio"';
    5. log_format download '$remote_addr - $remote_user [$time_local] '
    6. '"$request" $status $bytes_sent '
    7. '"$http_referer" "$http_user_agent" '
    8. '"$http_range" "$sent_http_content_range"';

  • 相关阅读:
    俄罗斯塔斯社TASS 媒体投放报道:海外媒体发稿扭转战局
    Linux 学习笔记(5-6)
    生成树协议STP(Spanning Tree Protocol)
    Bias and Debias in Recommender System: A Survey and Future Directions学习笔记
    数据结构 | 二叉树
    【Linux】虚拟机部署与发布J2EE项目(Windows版本)
    波函数:描述量子世界的数学工具
    轻量级的项目管理看板工具-Leangoo领歌
    (免费分享)基于springboot医院管理系统
    Hiding Images within Images[精读]
  • 原文地址:https://blog.csdn.net/dengwei_dw/article/details/138141149