☀️全网唯一万字长文讲解Nginx安装运营维护☀️《❤️记得收藏❤️》

Posted 苏州程序大白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了☀️全网唯一万字长文讲解Nginx安装运营维护☀️《❤️记得收藏❤️》相关的知识,希望对你有一定的参考价值。

☀️全网唯一万字长文讲解nginx安装运营维护☀️《❤️记得收藏❤️》

目录

😊开讲啦!!!!🏳️‍🌈

🏳️‍🌈1、前言


Nginx 是一款面向性能设计的 HTTP 服务器,能反向代理 HTTP,HTTPS 和邮件相关(SMTP,POP3,IMAP)的协议链接。并且提供了负载均衡以及 HTTP 缓存。它的设计充分使用异步事件模型,削减上下文调度的开销,提高服务器并发能力。采用了模块化设计,提供了丰富模块的第三方模块。

所以关于 Nginx,有这些标签:「异步」「事件」「模块化」「高性能」「高并发」「反向代理」「负载均衡」

Linux 系统:Centos 7 x64 Nginx 版本:1.11.5

🚣2、安装

🗾2.1、安装依赖

prce(重定向支持)和 openssl(https 支持,如果不需要 https 可以不安装。)

yum install -y pcre-devel 

yum -y install gcc make gcc-c++ wget

yum -y install openssl openssl-devel

CentOS 6.5 我安装的时候是选择的 基本服务器,默认这两个包都没安装全,所以这两个都运行安装即可。

🏔️2.2、下载

下载地址1

下载地址2

(注意:下载用稳定版本。)

wget http://nginx.org/download/nginx-1.13.3.tar.gz
wget http://nginx.org/download/nginx-1.13.7.tar.gz

# 如果没有安装wget
# 下载已编译版本
$ yum install wget

# 解压压缩包
tar zxf nginx-1.13.3.tar.gz

⛰️2.3、编程安装

进入目录编译安装,configure 参数说明

cd nginx-1.11.5
./configure

....
Configuration summary
  + using system PCRE library
  + OpenSSL library is not used
  + using system zlib library

  nginx path prefix: "/usr/local/nginx"
  nginx binary file: "/usr/local/nginx/sbin/nginx"
  nginx modules path: "/usr/local/nginx/modules"
  nginx configuration prefix: "/usr/local/nginx/conf"
  nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
  nginx pid file: "/usr/local/nginx/logs/nginx.pid"
  nginx error log file: "/usr/local/nginx/logs/error.log"
  nginx http access log file: "/usr/local/nginx/logs/access.log"
  nginx http client request body temporary files: "client_body_temp"
  nginx http proxy temporary files: "proxy_temp"
  nginx http fastcgi temporary files: "fastcgi_temp"
  nginx http uwsgi temporary files: "uwsgi_temp"
  nginx http scgi temporary files: "scgi_temp"

安装报错误的话比如:C compiler cc is not found,这个就是缺少编译环境,安装一下就可以了 yum -y install gcc make gcc-c++ openssl-devel

如果没有 error 信息,就可以执行下边的安装了:

make
make install

🌋2.4、nginx 测试

运行下面命令会出现两个结果,一般情况 nginx 会安装在 /usr/local/nginx 目录中:

cd /usr/local/nginx/sbin/
./nginx -t

# nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
# nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

🗻2.5、设置全局 nginx 命令

vi ~/.bash_profile

将下面内容添加到 ~/.bash_profile 文件中

PATH=$PATH:$HOME/bin:/usr/local/nginx/sbin/
export PATH

运行命令 source ~/.bash_profile 让配置立即生效。你就可以全局运行 nginx 命令了。

🏕️3、Mac 安装

Mac OSX 安装特别简单,首先你需要安装 Brew, 通过 brew 快速安装 nginx

🏖️3.1、安装 nginx

brew install nginx
# Updating Homebrew...
# ==> Auto-updated Homebrew!
# Updated 2 taps (homebrew/core, homebrew/cask).
# ==> Updated Formulae
# ==> Installing dependencies for nginx: openssl, pcre
# ==> Installing nginx dependency: openssl
# ==> Downloading https://homebrew.bintray.com/bottles/openssl-1.0.2o_1.high_sierra.bottle.tar.gz
# ######################################################################## 100.0%
# ==> Pouring openssl-1.0.2o_1.high_sierra.bottle.tar.gz
# ==> Caveats
# A CA file has been bootstrapped using certificates from the SystemRoots
# keychain. To add additional certificates (e.g. the certificates added in
# the System keychain), place .pem files in
#   /usr/local/etc/openssl/certs
# 
# and run
#   /usr/local/opt/openssl/bin/c_rehash
# 
# This formula is keg-only, which means it was not symlinked into /usr/local,
# because Apple has deprecated use of OpenSSL in favor of its own TLS and crypto libraries.
# 
# If you need to have this software first in your PATH run:
#   echo 'export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.zshrc
# 
# For compilers to find this software you may need to set:
#     LDFLAGS:  -L/usr/local/opt/openssl/lib
#     CPPFLAGS: -I/usr/local/opt/openssl/include
# For pkg-config to find this software you may need to set:
#     PKG_CONFIG_PATH: /usr/local/opt/openssl/lib/pkgconfig
# 
# ==> Summary
#   /usr/local/Cellar/openssl/1.0.2o_1: 1,791 files, 12.3MB
# ==> Installing nginx dependency: pcre
# ==> Downloading https://homebrew.bintray.com/bottles/pcre-8.42.high_sierra.bottle.tar.gz
# ######################################################################## 100.0%
# ==> Pouring pcre-8.42.high_sierra.bottle.tar.gz
#   /usr/local/Cellar/pcre/8.42: 204 files, 5.3MB
# ==> Installing nginx
# ==> Downloading https://homebrew.bintray.com/bottles/nginx-1.13.12.high_sierra.bottle.tar.gz
# ######################################################################## 100.0%
# ==> Pouring nginx-1.13.12.high_sierra.bottle.tar.gz
# ==> Caveats
# Docroot is: /usr/local/var/www
# 
# The default port has been set in /usr/local/etc/nginx/nginx.conf to 8080 so that
# nginx can run without sudo.
# 
# nginx will load all files in /usr/local/etc/nginx/servers/.
# 
# To have launchd start nginx now and restart at login:
#   brew services start nginx
# Or, if you don't wacd /usr/local/Cellar/nginx/1.13.12/n just run:
# cd /usr/local/Cellar/nginx/1.13.12/

🏜️3.2、启动服务

注意默认端口不是 8080 查看确认端口是否被占用。

brew services start nginx
# http://localhost:8080/

🏝️3.3、开机自启动

开机自启动方法一:

编辑 vi /lib/systemd/system/nginx.service 文件,没有创建一个 touch nginx.service 然后将如下内容根据具体情况进行修改后,添加到nginx.service文件中:

[Unit]
Description=nginx
After=network.target remote-fs.target nss-lookup.target

[Service]

Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target
  • [Unit]:服务的说明
  • Description:描述服务
  • After:描述服务类别
  • [Service]:服务运行参数的设置
  • Type=forking:是后台运行的形式
  • ExecStart:为服务的具体运行命令
  • ExecReload:为重启命令
  • ExecStop:为停止命令
  • PrivateTmp=True:表示给服务分配独立的临时空间

注意:[Service] 的启动、重启、停止命令全部要求使用绝对路径。[Install] 运行级别下服务安装的相关设置,可设置为多用户,即系统运行级别为3。保存退出。

设置开机启动,使配置生效:

# 启动nginx服务
systemctl start nginx.service
# 停止开机自启动
systemctl disable nginx.service
# 查看服务当前状态
systemctl status nginx.service
# 查看所有已启动的服务
systemctl list-units --type=service
# 重新启动服务
systemctl restart nginx.service
# 设置开机自启动
systemctl enable nginx.service
# 输出下面内容表示成功了
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
systemctl is-enabled servicename.service # 查询服务是否开机启动
systemctl enable *.service # 开机运行服务
systemctl disable *.service # 取消开机运行
systemctl start *.service # 启动服务
systemctl stop *.service # 停止服务
systemctl restart *.service # 重启服务
systemctl reload *.service # 重新加载服务配置文件
systemctl status *.service # 查询服务运行状态
systemctl --failed # 显示启动失败的服务

注:* 代表某个服务的名字,如 http 的服务名为 httpd

开机自启动方法二:

vi /etc/rc.local

# 在 rc.local 文件中,添加下面这条命令
/usr/local/nginx/sbin/nginx start

如果开机后发现自启动脚本没有执行,你要去确认一下 rc.local 这个文件的访问权限是否是可执行的,因为 rc.local 默认是不可执行的。修改 rc.local 访问权限,增加可执行权限:

# /etc/rc.local是/etc/rc.d/rc.local的软连接,
chmod +x /etc/rc.d/rc.local

官方脚本 ed Hat NGINX Init Script

🏞️4、运维

🏟️4.1、服务管理

# 启动
/usr/local/nginx/sbin/nginx

# 重启
/usr/local/nginx/sbin/nginx -s reload

# 关闭进程
/usr/local/nginx/sbin/nginx -s stop

# 平滑关闭nginx
/usr/local/nginx/sbin/nginx -s quit

# 查看nginx的安装状态,
/usr/local/nginx/sbin/nginx -V

关闭防火墙,或者添加防火墙规则就可以测试了

service iptables stop

或者编辑配置文件:

vi /etc/sysconfig/iptables

添加这样一条开放 80 端口的规则后保存:

-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

重启服务即可:

service iptables restart
# 命令进行查看目前nat
iptables -t nat -L

重启服务防火墙报错解决

service iptables restart
# Redirecting to /bin/systemctl restart  iptables.service
# Failed to restart iptables.service: Unit iptables.service failed to load: No such file or directory.

在 CentOS 7 或 RHEL 7 或 Fedora 中防火墙由 firewalld 来管理,当然你可以还原传统的管理方式。或则使用新的命令进行管理。 假如采用传统请执行一下命令:

# 传统命令
systemctl stop firewalld
systemctl mask firewalld
# 安装命令
yum install iptables-services

systemctl enable iptables 
service iptables restart

🏛️4.1、nginx卸载

如果通过 yum 安装,使用下面命令安装。

yum remove nginx

编译安装,删除 /usr/local/nginx 目录即可 如果配置了自启动脚本,也需要删除。。

🏗️4.2、参数说明

参数说明
–prefix=<path>Nginx 安装路径。如果没有指定,默认为 /usr/local/nginx
–sbin-path=<path>Nginx 可执行文件安装路径。只能安装时指定,如果没有指定,默认为<prefix>/sbin/nginx
–conf-path=<path>在没有给定 -c 选项下默认的nginx.conf的路径。如果没有指定,默认为<prefix>/conf/nginx.conf
–pid-path=<path>在 nginx.conf 中没有指定pid指令的情况下,默认的nginx.pid的路径。如果没有指定,默认为 /logs/nginx.pid。
–lock-path=<path>nginx.lock 文件的路径。
–error-log-path=<path>在 nginx.conf 中没有指定error_log指令的情况下,默认的错误日志的路径。如果没有指定,默认为 <prefix>/- logs/error.log
–http-log-path=<path>在 nginx.conf 中没有指定access_log指令的情况下,默认的访问日志的路径。如果没有指定,默认为 <prefix>/- logs/access.log
–user=<user>在 nginx.conf 中没有指定user指令的情况下,默认的nginx使用的用户。如果没有指定,默认为 nobody
–group=<group>nginx.conf 中没有指定user指令的情况下,默认的nginx使用的组。如果没有指定,默认为 nobody
–builddir=DIR指定编译的目录
–with-rtsig_module启用 rtsig 模块
–with-select_module –without-select_module允许或不允许开启SELECT模式,如果 configure 没有找到更合适的模式,比如:kqueue(sun os),epoll (linux kenel 2.6+), rtsig(- 实时信号)或者/dev/poll(一种类似select的模式,底层实现与SELECT基本相 同,都是采用轮训方法) SELECT模式将是默认安装模式
–with-poll_module –without-poll_moduleWhether or not to enable the poll module. This module is enabled by, default if a more suitable method such as kqueue, epoll, rtsig or /dev/poll is not discovered by configure.
–with-http_ssl_moduleEnable ngx_http_ssl_module. Enables SSL support and the ability to handle HTTPS requests. Requires OpenSSL. On Debian, this is libssl-dev. 开启HTTP SSL模块,使NGINX可以支持HTTPS请求。这个模块需要已经安装了OPENSSL,在DEBIAN上是libssl
–with-http_realip_module启用 ngx_http_realip_module
–with-http_addition_module启用 ngx_http_addition_module
–with-http_sub_module启用 ngx_http_sub_module
–with-http_dav_module启用 ngx_http_dav_module
–with-http_flv_module启用 ngx_http_flv_module
–with-http_stub_status_module启用 “server status” 页
–without-http_charset_module禁用 ngx_http_charset_module
–without-http_gzip_module禁用 ngx_http_gzip_module. 如果启用,需要 zlib 。
–without-http_ssi_module禁用 ngx_http_ssi_module
–without-http_userid_module禁用 ngx_http_userid_module
–without-http_access_module禁用 ngx_http_access_module
–without-http_auth_basic_module禁用 ngx_http_auth_basic_module
–without-http_autoindex_module禁用 ngx_http_autoindex_module
–without-http_geo_module禁用 ngx_http_geo_module
–without-http_map_module禁用 ngx_http_map_module
–without-http_referer_module禁用 ngx_http_referer_module
–without-http_rewrite_module禁用 ngx_http_rewrite_module. 如果启用需要 PCRE 。
–without-http_proxy_module禁用 ngx_http_proxy_module
–without-http_fastcgi_module禁用 ngx_http_fastcgi_module
–without-http_memcached_module禁用 ngx_http_memcached_module
–without-http_limit_zone_module禁用 ngx_http_limit_zone_module
–without-http_empty_gif_module禁用 ngx_http_empty_gif_module
–without-http_browser_module禁用 ngx_http_browser_module
–without-http_upstream_ip_hash_module禁用 ngx_http_upstream_ip_hash_module
–with-http_perl_module启用 ngx_http_perl_module
–with-perl_modules_path=PATH指定 perl 模块的路径
–with-perl=PATH指定 perl 执行文件的路径
–http-log-path=PATHSet path to the http access log
–http-client-body-temp-path=PATHSet path to the http client request body temporary files
–http-proxy-temp-path=PATHSet path to the http proxy temporary files
–http-fastcgi-temp-path=PATHSet path to the http fastcgi temporary files
–without-http禁用 HTTP server
–with-mail启用 IMAP4/POP3/SMTP 代理模块
–with-mail_ssl_module启用 ngx_mail_ssl_module
–with-cc=PATH指定 C 编译器的路径
–with-cpp=PATH指定 C 预处理器的路径
–with-cc-opt=OPTIONSAdditional parameters which will be added to the variable CFLAGS. With the use of the system library PCRE in FreeBSD, it is necessary to indicate –with-cc-opt=”-I /usr/local/include”. If we are using select() and it is necessary to increase the number of file descriptors, then this also can be assigned here: –with-cc-opt=”-D FD_SETSIZE=2048″.
–with-ld-opt=OPTIONSAdditional parameters passed to the linker. With the use of the system library PCRE in – FreeBSD, it is necessary to indicate –with-ld-opt=”-L /usr/local/lib”.
–with-cpu-opt=CPU为特定的 CPU 编译,有效的值包括:pentium, pentiumpro, pentium3, pentium4, athlon, opteron, amd64, sparc32, sparc64, ppc64
–without-pcre禁止 PCRE 库的使用。同时也会禁止 HTTP rewrite 模块。在 “location” 配置指令中的正则表达式也需要 PCRE 。
–with-pcre=DIR指定 PCRE 库的源代码的路径。
–with-pcre-opt=OPTIONSSet additional options for PCRE building.
–with-md5=DIRSet path to md5 library sources.
–with-md5-opt=OPTIONSSet additional options for md5 building.
–with-md5-asmUse md5 assembler sources.
–with-sha1=DIRSet path to sha1 library sources.
–with-sha1-opt=OPTIONSSet additional options for sha1 building.
–with-sha1-asmUse sha1 assembler sources.
–with-zlib=DIRSet path to zlib library sources.
–with-zlib-opt=OPTIONSSet additional options for zlib building.
–with-zlib-asm=CPUUse zlib assembler sources optimized for specified CPU, valid values are: pentium, pentiumpro
–with-openssl=DIRSet path to OpenSSL library sources
–with-openssl-opt=OPTIONSSet additional options for OpenSSL building
–with-debug启用调试日志
–add-module=PATHAdd in a third-party module found in directory PATH


不管做什么,气质不可以输

🏘️5、配置

在Centos 默认配置文件在 /usr/local/nginx-1.5.1/conf/nginx.conf 我们要在这里配置一些文件。nginx.conf是主配置文件,由若干个部分组成,每个大括号{}表示一个部分。每一行指令都由分号结束,标志着一行的结束。

🏚️5.1、常用正则

正则说明正则说明
.匹配除换行符以外的任意字符$匹配字符串的结束
?重复0次或1次{n}重复n次
+重复1次或更多次{n,}重复n次或更多次
*重复0次或更多次[c]匹配单个字符c
\\d匹配数字[a-z]匹配a-z小写字母的任意一个
^匹配字符串的开始

🏠5.2、全局变量

变量说明变量说明
$args这个变量等于请求行中的参数,同$query_string$remote_port客户端的端口。
$content_length请求头中的Content-length字段。$remote_user已经经过Auth Basic Module验证的用户名。
$content_type请求头中的Content-Type字段。$request_filename当前请求的文件路径,由root或alias指令与URI请求生成。
$document_root当前请求在root指令中指定的值。$schemeTTP方法(如http,https)。
$host请求主机头字段,否则为服务器名称。$server_protocol请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$http_user_agent客户端agent信息$server_addr服务器地址,在完成一次系统调用后可以确定这个值。
$http_cookie客户端cookie信息$server_name服务器名称。
$limit_rate这个变量可以限制连接速率。$server_port请求到达服务器的端口号。
$request_method客户端请求的动作,通常为GET或POST。$request_uri包含请求参数的原始URI,不包含主机名,如:/foo/bar.php?arg=baz。
$remote_addr 客户端的IP地址。$uri不带请求参数的当前URI,$uri
$document_uri与$uri相同。

例如请求:http://localhost:3000/test1/test2/test.php

  • $host:localhost

  • $server_port:3000

  • $request_uri:/test1/test2/test.php

  • $document_uri:/test1/test2/test.php

  • $document_root:/var/www/html

  • $request_filename:/var/www/html/test1/test2/test.php

🏡5.3、符号参考

符号说明符号说明符号说明
k,K千字节m,M兆字节ms毫秒
sm分钟h小时
dwM一个月, 30天

例如,”8k”,”1m” 代表字节数计量。

例如,”1h 30m”,”1y 6M”。代表 “1小时 30分”,”1年零6个月”。

🏢5.4、配置文件

nginx 的配置系统由一个主配置文件和其他一些辅助的配置文件构成。这些配置文件均是纯文本文件,全部位于 nginx 安装目录下的 conf 目录下。

指令由 nginx 的各个模块提供,不同的模块会提供不同的指令来实现配置。 指令除了 Key-Value 的形式,还有作用域指令。

nginx.conf 中的配置信息,根据其逻辑上的意义,对它们进行了分类,也就是分成了多个作用域,或者称之为配置指令上下文。不同的作用域含有一个或者多个配置项。

下面的这些上下文指令是用的比较多:

DirectiveDescriptionContains Directive
mainnginx 在运行时与具体业务功能(比如 http 服务或者 email 服务代理)无关的一些参数,比如工作进程数,运行的身份等。user, worker_processes, error_log, events, http, mail
-比如工作进程数,运行的身份等。-
http与提供 http 服务相关的一些配置参数。例如:是否使用 keepalive 啊,是否使用 gzip 进行压缩等。server
serverhttp 服务上支持若干虚拟主机。每个虚拟主机一个对应的 server 配置项,配置项里面包含该虚拟主机相关的配置。在提供 mail 服务的代理时,也可以建立若干 server. 每个 server 通过监听的地址来区分。listen, server_name, access_log, location, protocol, proxy, smtp_auth, xclient
locationhttp 服务中,某些特定的 URL 对应的一系列配置项。index, root
mail实现 email 相关的 SMTP/IMAP/POP3 代理时,共享的一些配置项(因为可能实现多个代理,工作在多个监听地址上)。server, http, imap_capabilities
include以便增强配置文件的可读性,使得部分配置文件可以重新使用。-
valid_referers用来校验Http请求头Referer是否有效。-
try_files用在server部分,不过最常见的还是用在location部分,它会按照给定的参数顺序进行尝试,第一个被匹配到的将会被使用。-
if当在location块中使用if指令,在某些情况下它并不按照预期运行,一般来说避免使用if指令。-

例如我们再 nginx.conf 里面引用两个配置 vhost/example.com.conf 和 vhost/gitlab.com.conf 它们都被放在一个我自己新建的目录 vhost 下面。nginx.conf 配置如下:

worker_processes  1;
events {
    worker_connections  1024;
}

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  0;
    keepalive_timeout  65;

    #gzip  on;
    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;
        }
    }
    include  vhost/example.com.conf;
    include  vhost/gitlab.com.conf;
}

简单的配置: example.com.conf

server {
    #侦听的80端口
    listen       80;
    server_name  baidu.com app.baidu.com; # 这里指定域名
    index        index.html index.htm;    # 这里指定默认入口页面
    root /home/www/app.baidu.com;         # 这里指定目录
}

🏣5.5、内置预定义变量

Nginx提供了许多预定义的变量,也可以通过使用set来设置变量。你可以在if中使用预定义变量,也可以将它们传递给代理服务器。以下是一些常见的预定义变量,更多详见

变量名称
$args_name在请求中的name参数
$args所有请求参数
$query_string$args的别名
$content_length请求头Content-Length的值
$content_type请求头Content-Type的值
$host如果当前有Host,则为请求头Host的值;如果没有这个头,那么该值等于匹配该请求的server_name的值
$remote_addr客户端的IP地址
$request完整的请求,从客户端收到,包括Http请求方法、URI、Http协议、头、请求体
$request_uri完整请求的URI,从客户端来的请求,包括参数
$scheme当前请求的协议
$uri当前请求的标准化URI

🏤5.6、反向代理

反向代理是一个Web服务器,它接受客户端的连接请求,然后将请求转发给上游服务器,并将从服务器得到的结果返回给连接的客户端。下面简单的反向代理的例子:

server {  
  listen       80;                                                        
  server_name  localhost;                                              
  client_max_body_size 1024M;  # 允许客户端请求的最大单文件字节数

  location / {
    proxy_pass                         http://localhost:8080;
    proxy_set_header Host              $host:$server_port;
    proxy_set_header X-Forwarded-For   $remote_addr; # HTTP的请求端真实的IP
    proxy_set_header X-Forwarded-Proto $scheme;      # 为了正确地识别实际用户发出的协议是 http 还是 https
  }
}

复杂的配置: gitlab.com.conf。

server {
    #侦听的80端口
    listen       80;
    server_name  git.example.cn;
    location / {
        proxy_pass   http://localhost:3000;
        #以下是一些反向代理的配置可删除
        proxy_redirect             off;
        #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
        proxy_set_header           Host $host;
        client_max_body_size       10m; #允许客户端请求的最大单文件字节数
        client_body_buffer_size    128k; #缓冲区代理缓冲用户端请求的最大字节数
        proxy_connect_timeout      300; #nginx跟后端服务器连接超时时间(代理连接超时)
        proxy_send_timeout         300; #后端服务器数据回传时间(代理发送超时)
        proxy_read_timeout         300; #连接成功后,后端服务器响应时间(代理接收超时)
        proxy_buffer_size          4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
        proxy_buffers              4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
        proxy_busy_buffers_size    64k; #高负荷下缓冲大小(proxy_buffers*2)
    }
}

代理到上游服务器的配置中,最重要的是proxy_pass指令。以下是代理模块中的一些常用指令:

指令说明
proxy_connect_timeoutNginx从接受请求至连接到上游服务器的最长等待时间
proxy_send_timeout后端服务器数据回传时间(代理发送超时)
proxy_read_timeout连接成功后,后端服务器响应时间(代理接收超时)
proxy_cookie_domain替代从上游服务器来的Set-Cookie头的domain属性
proxy_cookie_path替代从上游服务器来的Set-Cookie头的path属性
proxy_buffer_size设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffersproxy_buffers缓冲区,网页平均在多少k以下
proxy_set_header重写发送到上游服务器头的内容,也可以通过将某个头部的值设置为空字符串,而不发送某个头部的方法实现
proxy_ignore_headers这个指令禁止处理来自代理服务器的应答。
proxy_intercept_errors使nginx阻止HTTP应答代码为400或者更高的应答。

🏥6、负载均衡

upstream指令启用一个新的配置区段,在该区段定义一组上游服务器。这些服务器可能被设置不同的权重,也可能出于对服务器进行维护,标记为down。

upstream gitlab 
{
ip_hash;
    # upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。
    server 192.168.122.11:8081 ;
    server 127.0.0.1:82 weight=3;
    server 127.0.0.1:83 weight=3 down;
    server 127.0.0.1:84 weight=3; max_fails=3  fail_timeout=20s;
    server 127.0.0.1:85 weight=4;;
    keepalive 32;
}
server 
{
    #侦听的80端口
    listen       80;
    server_name  git.example.cn;
    location / 
    
        proxy_pass   http://gitlab;    #在这里设置一个代理,和upstream的名字一样
        #以下是一些反向代理的配置可删除
        proxy_redirect             off;
        #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
        proxy_set_header           Host $host;
        proxy_set_header           X-Real-IP $remote_addr;
        proxy_set_header           X-Forwarded-For $proxy_add_x_forwarded_for;
        client_max_body_size       10m;  #允许客户端请求的最大单文件字节数
        client_body_buffer_size    128k; #缓冲区代理缓冲用户端请求的最大字节数
        proxy_connect_timeout      300;  #nginx跟后端服务器连接超时时间(代理连接超时)
        proxy_send_timeout         300;  #后端服务器数据回传时间(代理发送超时)
        proxy_read_timeout         300;  #连接成功后,后端服务器响应时间(代理接收超时)
        proxy_buffer_size          4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
        proxy_buffers              4 32k;# 缓冲区,网页平均在32k以下的话,这样设置
        proxy_busy_buffers_size    64k; #高负荷下缓冲大小(proxy_buffers*2)
        proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传
    }
}

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除

负载均衡:

upstream模块能够使用3种负载均衡算法:轮询、IP哈希、最少连接数。

轮询: 默认情况下使用轮询算法,不需要配置指令来激活它,它是基于在队列中谁是下一个的原理确保访问均匀地分布到每个上游服务器;

IP哈希: 通过ip_hash指令来激活,Nginx通过IPv4地址的前3个字节或者整个IPv6地址作为哈希键来实现,同一个IP地址总是能被映射到同一个上游服务器;

最少连接数: 通过least_conn指令来激活,该算法通过选择一个活跃数最少的上游服务器进行连接。如果上游服务器处理能力不同,可以通过给server配置weight权重来说明,该算法将考虑到不同服务器的加权最少连接数。

🏦6.1、RR

简单配置 这里我配置了2台服务器,当然实际上是一台,只是端口不一样而已,而8081的服务器是不存在的,也就是说访问不到,但是我们访问 http://localhost 的时候,也不会有问题,会默认跳转到http://localhost:8080具体是因为Nginx会自动判断服务器的状态,如果服务器处于不能访问(服务器挂了),就不会跳转到这台服务器,所以也避免了一台服务器挂了影响使用的情况,由于Nginx默认是RR策略,所以我们不需要其他更多的设置

pstream test 
{
    server localhost:8080;
    server localhost:8081;
}
server 
{
    listen       81;
    server_name  localhost;
    client_max_body_size 1024M;
 
    location / {
        proxy_pass http://test;
        proxy_set_header Host $host:$server_port;
    }
}

负载均衡的核心代码为

upstream test
{
    server localhost:8080;
    server localhost:8081;
}

权重

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 例如:

upstream test 
{
    server localhost:8080 weight=9;
    server localhost:8081 weight=1;
}

那么10次一般只会有1次会访问到8081,而有9次

以上是关于☀️全网唯一万字长文讲解Nginx安装运营维护☀️《❤️记得收藏❤️》的主要内容,如果未能解决你的问题,请参考以下文章

❤万字长文JS全网最细笔记2️⃣(全网最强,建议收藏)❤

❤️BitmapsHyperLogLogGeospatial❤️——Redis三大特殊数据类型详述(万字长文原理讲解,大厂面试高频知识点,一文尽收囊中)

告诉你。

Golang✔️实战✔️ 10 种加密方法实现 ☢️万字长文 建议手收藏☢️

Golang✔️实战✔️ 10 种加密方法实现 ☢️万字长文 建议手收藏☢️

OpenCV-Python实战——OpenCV图像运算(❤️万字长文,含大量示例❤️)