Centos9 安装 nginx 及配置

1. 安装nginx

  1. 安装依赖软件,安装之前可以看一下是否已经安装过以下软件,dnf list installed | grep zlib
bash 复制代码
dnf install gcc-c++
dnf install zlib
dnf install pcre pcre-devel
dnf install openssl openssl-devel
  1. 下载nginx,这里是下载到opt文件夹
    nginx官网下载页面
bash 复制代码
[root@centoshost opt]# wget https://nginx.org/download/nginx-1.26.3.tar.gz
  1. 解压nginx,新建一个nginx目录
bash 复制代码
[root@centoshost opt]# tar -vxf nginx-1.26.3.tar.gz 
[root@centoshost opt]# mkdir nginx
  1. 编译nginx到/opt/nginx
bash 复制代码
[root@centoshost opt]# cd nginx-1.26.3
[root@centoshost nginx-1.26.3]# ./configure --prefix=/opt/nginx
[root@centoshost nginx-1.26.3]# make
[root@centoshost nginx-1.26.3]# make install
[root@centoshost nginx-1.26.3]# cd ..
[root@centoshost opt]# cd nginx
[root@centoshost nginx]# ll
总用量 4
drwxr-xr-x. 2 root root 4096  4月 20 11:29 conf
drwxr-xr-x. 2 root root   40  4月 20 11:29 html
drwxr-xr-x. 2 root root    6  4月 20 11:29 logs
drwxr-xr-x. 2 root root   19  4月 20 11:29 sbin
  1. 启动nginx
bash 复制代码
[root@centoshost nginx]# cd sbin
[root@centoshost sbin]# ll
总用量 3796
-rwxr-xr-x. 1 root root 3914936  4月 20 11:29 nginx
[root@centoshost sbin]# ./nginx
[root@centoshost sbin]# ps -aux|grep nginx
root     1861753  0.0  0.0   4344  1256 ?        Ss   11:33   0:00 nginx: master process ./nginx
nobody   1861754  0.0  0.2  13144  4840 ?        S    11:33   0:00 nginx: worker process
root     1863247  0.0  0.1   6344  1792 pts/0    R+   11:34   0:00 grep --color=auto nginx
  1. 通过浏览器访问服务器的80端口
  2. 停止nginx
bash 复制代码
[root@centoshost sbin]# ./nginx -s stop
[root@centoshost sbin]# ps -aux|grep nginx
root     1874737  0.0  0.1   6344  1920 pts/0    S+   11:38   0:00 grep --color=auto nginx
  1. 修改配置文件并刷新
bash 复制代码
[root@centoshost nginx]# pwd
/opt/nginx
[root@centoshost nginx]# ll
总用量 4
drwxr-xr-x. 2 root   root 4096  4月 20 11:29 conf
drwxr-xr-x. 2 root   root   40  4月 20 11:29 html
drwxr-xr-x. 2 root   root   41  4月 20 11:38 logs
drwxr-xr-x. 2 root   root   19  4月 20 11:29 sbin
[root@centoshost nginx]# vim ./conf/nginx.conf
[root@centoshost nginx]# ./sbin/nginx -s reload

nginx 常用命令

  • nginx 文件,后缀是temp的文件是后来自动生成的,可以删除
bash 复制代码
[root@centoshost nginx]# ll
总用量 4
drwx------. 2 nobody root    6  4月 20 11:33 client_body_temp
drwxr-xr-x. 2 root   root 4096  4月 20 11:41 conf
drwx------. 2 nobody root    6  4月 20 11:33 fastcgi_temp
drwxr-xr-x. 2 root   root   40  4月 20 11:29 html
drwxr-xr-x. 2 root   root   58  4月 20 14:26 logs
drwx------. 2 nobody root    6  4月 20 11:33 proxy_temp
drwxr-xr-x. 2 root   root   19  4月 20 11:29 sbin
drwx------. 2 nobody root    6  4月 20 11:33 scgi_temp
drwx------. 2 nobody root    6  4月 20 11:33 uwsgi_temp
  • 启动nginx
bash 复制代码
[root@centoshost nginx]# ./sbin/nginx
  • 刷新配置
bash 复制代码
[root@centoshost nginx]# ./sbin/nginx -s reload
  • 停止nginx
bash 复制代码
[root@centoshost nginx]# ./sbin/nginx -s stop
  • 查看nginx进程
bash 复制代码
[root@centoshost ~]# ps -aux|grep nginx

2. 配置nginx

超详细配置解释参考文章链接

1. 全局块

全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。

  • nginx 用户和组的配置,window 下不指定,但是在 linux 里面推荐使用 root
bash 复制代码
user root;
  • 绑定 cup 的核心,默认为 1 一般配置可以 Auto [自动适配操作系统]
bash 复制代码
worker_processes auto;
  • 绑定 nginx 到某一个 cpu 的核心 把 nginx 绑定到所在机器的 1 号和 2 号 CPU 上,01代表1号,10代表2号,这里是2进制
bash 复制代码
worker_cpu_affinity 01 10
  • 添加优先级(-20-20)数字越小优先级越高
bash 复制代码
worker_priority -20
  • 错误日志的存放
bash 复制代码
error_log  logs/error.log;
error_log  logs/error.log  notice;
error_log  logs/error.log  info;
  • 指定pid文件的存放路径
bash 复制代码
pid        logs/nginx.pid;

2. events块

配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。

  • 指这一每个工作进程可以同时处理的最大连接数,理论上每台 nginx 服务器的最大连接数为 worker_processes * worker_connections
bash 复制代码
worker_connections 1024;
  • ON 时 Nginx 服务器的每个工作进程可以同时接受多个新的网络连接,此指令默认为 off,即默认为一个工作进程只能一次接受一个连接
bash 复制代码
 multi_accept on;

3. http块

可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。

  • 加载mime类型,类型由mime.type文件提供
bash 复制代码
include       mime.types;
  • 设置mime类型,当文件没有明确定义类型时,使用默认类型
bash 复制代码
default_type  application/octet-stream;
  • 设定日志输出格式
bash 复制代码
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';
  • 日志存放位置
bash 复制代码
access_log  logs/access.log  main;
  • 为了平衡硬盘和IO的处理速度,降低系统的响应时间
bash 复制代码
sendfile        on;
  • 在sendfile为on的状态下,避免网络阻塞
bash 复制代码
tcp_nopush     on;
  • 设置服务器和客户端回话的保持时间
bash 复制代码
#keepalive_timeout  0;
keepalive_timeout  65;
  • 开启/关闭gzip压缩
bash 复制代码
gzip  on;

4. server块

每个server块就相当于一台虚拟主机,它内部可有多台主机联合提供服务,一起对外提供在逻辑上关系密切的一组服务(或网站)。在使用Nginx服务器提供Web服务时,利用虚拟主机的技术就可以避免为每一个要运行的网站提供单独的Nginx服务器,也无需为每个网站对应运行一组Nginx进程。虚拟主机技术使得Nginx服务器可以在同一台服务器上只运行一组Nginx进程,就可以运行多个网站。

  • 多个server中,主机名与域名不能完全相同
    主机名相同,端口要不同;端口相同,主机名要不同
    如果两个server的端口和主机名都相同,下面的server将会被忽略
bash 复制代码
 # 该主机的监听端口
 listen       80;
 # 设置主机名称或者域名
 server_name  localhost;

5. localtion块

location块的主要作用是,基于Nginx服务器接收到的请求字符串,对除虚拟主机名称之外的字符串进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能都是在这部分实现。许多第三方模块的配置也是在location块中提供功能。

bash 复制代码
location / {
    # 设置网站根目录,可指向任何目录,例如:/home/wwwroot/
    root   html;
    # 设置默认首页,例如:index.html
    index  index.html index.htm;
}

1. location的匹配规则

符号 规则 优先级
= 精确匹配 1
^~ 以某个字符串开头 2
~ 区分大小写的正则匹配 3
~* 不区分大小写的正则匹配 4
!~ 区分大小写的不匹配正则 5
!~* 不区分大小写的不匹配正则 6
/ 通用匹配,任何请求都会匹配到 7
  1. 示例
bash 复制代码
        # 通用匹配
        location / {
            return 200 "通用匹配 location / \n";
        }
        # 正则匹配,区分大小写
        location ~ /hello {
            return 200 "正则匹配,区分大小写 location ~ /hello/ \n";
        }
        # 正则匹配,不区分大小写
        location ~* /hello {
            return 200 "正则匹配,不区分大小写 location ~* /hello \n";
        }
        # 以...开头的匹配
        location ^~ /hello {
            return 200 "以...开头的匹配 location ^~ /hello \n";
        }
        # 精确匹配
        location = /hello {
            return 200 "精确匹配 location = /hello \n";
        }
bash 复制代码
# /hello
精确匹配 location = /hello 
# /nginx/hello
正则匹配,区分大小写 location ~ /hello/ 
# /hellonginx
以...开头的匹配 location ^~ /hello 
# /hEllo
正则匹配,不区分大小写 location ~* /hello 
# /hello/world
以...开头的匹配 location ^~ /hello 
# /world
通用匹配 location / 

2. 获取路径参数

bash 复制代码
location /error {
    error_page 418 = @error418;
    error_page 419 = @error419;
    
    if ($args ~ "418"){return 418;}
    if ($args ~ "419"){return 419;}


}
location @error418 {
    return 200 "418 \n";
}
location @error419 {
    return 200 "419 \n";
}
bash 复制代码
[root@centoshost nginx]# curl localhost/error?418
418 
  1. 获取完整的请求参数
bash 复制代码
location /test {
    return 200 "请求参数为:$args";
}

当访问 http://yourserver.com/test?name=John\&age=30 时,Nginx 会返回 请求参数为:name=John&age=30。

  1. 使用 $arg_参数名 获取指定参数的值
bash 复制代码
location /test {
    if ($arg_name) {
        return 200 "您的名字是:$arg_name";
    } else {
        return 400 "未提供名字参数";
    }
}

当访问 http://yourserver.com/test?name=Alice 时,Nginx 会返回 您的名字是:Alice;如果访问 http://yourserver.com/test,则会返回 未提供名字参数。

  1. 使用正则表达式匹配路径中的参数
bash 复制代码
location ~ ^/user/(\w+)$ {
    set $username $1;
    return 200 "欢迎,$username!";
}

~ ^/user/(\w+) 是一个正则表达式,它匹配以 /user/ 开头,后面跟着一个或多个单词字符的路径。(\\w+) 是一个捕获组,捕获到的内容会赋值给 1 变量,这里通过 set username 1; 将其赋值给自定义变量 $username。当访问 http://yourserver.com/user/Bob 时,Nginx 会返回 欢迎,Bob!

3. 重定向

浏览器访问a.html

bash 复制代码
location /a.html {
    return 301 https://www.baidu.com; # 重定向到百度
}

4. 反向代理

浏览器访问a.html

bash 复制代码
location /a.html {
    proxy_pass http://www.baidu.com; # 如果是https需要ssl证书
}
  • 使用全局变量设置请求头
bash 复制代码
location /a.html {
    porxy_set_header X_Real_IP $remote_addr;
    proxy_set_header X-Forwarded-Host $http_host;
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_set_header X-Forwarded-Server $server_name;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Url $scheme://$http_host$request_uri;
    proxy_pass http://www.baidu.com; # 如果是https需要ssl证书
}

5. 开启目录浏览

  • /menu/download/URI要与目录路径相匹配
bash 复制代码
location /menu/download/  {

    autoindex on;   # 开启目录浏览
    autoindex_exact_size off;   # 关闭计算目录文件大小
    autoindex_localtime on;   # 显示本地时间格式
}
  • 真实路径

  • 效果

6. 全局变量

分类 变量名 说明
与服务器相关 $server_name 当前请求的服务器名称,根据请求的域名确定
与服务器相关 $server_port 服务器监听的端口号
与服务器相关 $document_root 当前请求的文档根目录,通常在 server 块中通过 root 指令设置
与客户端请求相关 $remote_addr 客户端的 IP 地址
与客户端请求相关 $remote_port 客户端的端口号
与客户端请求相关 $http_user_agent 客户端发送请求时附带的 User - Agent 字段的值,包含浏览器类型、版本、操作系统等信息
与客户端请求相关 $http_cookie 客户端发送的 Cookie 信息
与客户端请求相关 $request_method 客户端的请求方法,如 GETPOSTPUTDELETE
与客户端请求相关 $request_uri 客户端请求的完整 URI,包括查询字符串。例如,对于请求 http://example.com/index.html?param=value$request_uri 的值为 /index.html?param=value
与客户端请求相关 $uri 客户端请求的 URI,不包含查询字符串。对于上述例子,$uri 的值为 /index.html
与请求处理相关 $args 请求中的查询字符串。例如,对于请求 http://example.com/index.html?param=value$args 的值为 param=value
与请求处理相关 $scheme 请求使用的协议,通常是 httphttps
与请求处理相关 $server_protocol 服务器使用的协议版本,如 HTTP/1.1HTTP/2
与时间相关 $time_iso8601 当前时间的 ISO 8601 格式表示,例如 2025-04-21T12:00:00+08:00
与时间相关 $time_local 当前时间的本地格式表示,例如 21/Apr/2025:12:00:00 +0800

6. 负载均衡

假设有3个服务器同时给我们提供服务,3个服务器的地址分别是:

bash 复制代码
localhost:8001;
localhost:8002;
localhost:8003;
  1. 配置nginx反向代理
bash 复制代码
http {
	# ... 其他配置
    # 配置服务组,名字是group
    upstream group{
        server localhost:8001;
        server localhost:8002;
        server localhost:8003;
    }
    server {
    listen       80;
    server_name  localhost;
    charset utf-8;
    # 配置反向代理,指向服务组
    location / {
        proxy_pass http://group;
    }
}
  • 效果:会在3个服务之间轮着使用
  1. ip_hash
bash 复制代码
    # 配置服务组
    upstream group{
        server localhost:8001;
        server localhost:8002;
        server localhost:8003;
        ip_hash;
    }

效果:用户固定访问一个服务器

ip_hash:Nginx 会根据客户端的 IP 地址进行哈希计算,然后将请求固定地转发到某个上游服务器。这样可以确保来自同一个客户端的请求始终被转发到同一台服务器,对于一些需要保持会话状态的应用(如用户登录后需要在同一台服务器上处理后续请求)非常有用。

  1. 配置权重
bash 复制代码
    # 配置服务组
    upstream group{
        server localhost:8001 weight=1;
        server localhost:8002 weight=1;
        server localhost:8003 weight=2;
        # ip_hash;
    }
  • 效果:服务器的使用会按照权重的比例出现
  1. 配置最大失败次数和不可用时间
bash 复制代码
    # 配置服务组
    upstream group{
        server localhost:8001 weight=1 max_fails=2 fail_timeout=30s;
        server localhost:8002 weight=1 max_fails=2 fail_timeout=30s;
        server localhost:8003 weight=2 max_fails=2 fail_timeout=30s;
        # ip_hash;
    }
  • fail_timeout:定义了服务器失败后的不可用时间
  • max_fails:最大失败次数
  • 表示在 fail_timeout 时间段内,允许该服务器失败(例如返回错误状态码等情况)的最大失败次数是max_fails。如果在 fail_timeout 内失败次数达到 max_fails 次,Nginx 将认为该服务器暂时不可用,在 fail_timeout 时间段内不会再将请求转发到该服务器。
相关推荐
Jackilina_Stone25 分钟前
一个高性能的HTTP和反向代理服务器:Nginx
nginx·http·ai 推理·nv
IT成长日记5 小时前
【Nginx开荒攻略】静态文件服务深度解析:MIME类型映射与优化实战
linux·运维·服务器·nginx·mime
zz-zjx8 小时前
Web接入层的“铁三角”---防盗链、反向代理,负载均衡(nginx)
前端·nginx·负载均衡
珊瑚礁的猪猪侠8 小时前
Nginx从入门到精通:小白实战教程
运维·nginx
邂逅星河浪漫9 小时前
【DockerFile+Nginx+DockerCompose】前后端分离式项目部署(docker容器化方式)
nginx·docker·centos·部署·docker-compose·dockerfile·容器化部署
野熊佩骑9 小时前
CentOS二进制安装包方式部署K8S集群之系统初始化
运维·docker·微服务·云原生·容器·kubernetes·centos
天空之外13610 小时前
nginx xxs漏铜修复、nginx 域名配置、nginx https证书配置、Http不安全处理方法
运维·nginx
神秘人X70711 小时前
Nginx 访问控制、用户认证与 HTTPS 配置指南
nginx·https
失因13 小时前
Nginx 反向代理、负载均衡与 Keepalived 高可用
运维·nginx·负载均衡
码界奇点14 小时前
Nginx 502 Bad Gateway从 upstream 日志到 FastCGI 超时深度复盘
运维·nginx·阿里云·性能优化·gateway