Nginx环境搭建与系统参数配置

简介: Nginx环境搭建与系统参数配置

@TOC

1 nginx 安装编译,演示

在这里插入图片描述
解压出来后,cd到nginx-1.22.1,执行下面的configure命令

./configure --prefix=/usr/local/nginx --with-http_realip_module --with-http_addition_module --with-http_gzip_static_module --with-http_secure_link_module --with-http_stub_status_module --with-stream --with-pcre="实际路径"/nginx-main/pcre-8.45 --with-zlib="实际路径"/nginx-main/zlib-1.2.13 --with-openssl="实际路径"/nginx-main/openssl-1.1.1s

然后 make -j4 完成编译(pcre-8.45/missing: line 81: aclocal-1.16: command not found ⇒ sudo apt-get install autoconf)
最后安装 sudo make install

启动:
cd /usr/local/nginx
/usr/local/nginx$ sudo ==./sbin/nginx -c== conf/nginx.conf
ifconfig 看一下,当前机器的ip,然后浏览器输入IP:80,看以看到nginx的初始页面:/usr/local/nginx/html/index.html
在这里插入图片描述

2 nginx基础概念

它可以是工作在应用层的一个网关,网关相当于是一个IP,外界需要需要访问内网,须通过这个软网关来访问。
基于此,可以在nginx定义诸多的规则。
怎么配置这些规则呢?在\nginx-1.22.1\conf\目录下的.conf文件中。
安装后的目录在 /usr/local/nginx/conf
nginx 进程不用重启
html的内容改动,只需要浏览器,重新刷新一次就好。(这样是不是大大提高了前端开发的效率?)

3 nginx 常用命令

常用命令
$ nginx -s signal
信号signal 的值可能是以下之一:
 stop 快速关闭服务
 quit 正常关闭服务
 reload 重新加载配置文件
 reopen 重新打开日志文件

4 nginx的配置文件conf初探

4.1 测试自定义的conf

root@xx:/usr/local/nginx# touch conf/test.conf // 先创建一个空的conf文件
root@xx:/usr/local/nginx# ./sbin/nginx -c conf/test.conf // 直接执行空的conf文件试试看
nginx: [emerg] no "events" section in configuration // 报错

4.2 加入events

在conf/test.conf 填入下面的内容:
events {
worker_connections 1024;
}
再次 ./sbin/nginx -c conf/test.conf
看一下有没有启动:

ps -aux |grep nginx
root      969625  0.0  0.0   4136   272 ?        Ss   14:15   0:00 nginx: master process ./sbin/nginx -c conf/test.conf
nobody    969626  0.0  0.0   4748  2588 ?        S    14:15   0:00 nginx: worker process

但是它并没有监听端口:

:/usr/local/nginx# netstat -anop |grep nginx
unix  3      [ ]         流        已连接     7194380  969625/nginx: maste  
unix  3      [ ]         流        已连接     7194381  969625/nginx: maste

4.3 加入server

再往 conf/test.conf 追加如下内容:

http {
   
   
    server {
   
   
        listen 8000;
    }
}

重启 ./sbin/nginx -s stop, ./sbin/nginx -c conf/test.conf, 再次查看端口 (这次可以看到端口了)

:/usr/local/nginx# netstat -anop |grep nginx
tcp        0      0 0.0.0.0:8000            0.0.0.0:*               LISTEN      969807/nginx: maste  关闭 (0.00/0/0)
unix  3      [ ]         流        已连接     7199479  969807/nginx: maste  
unix  3      [ ]         流        已连接     7199480  969807/nginx: maste

浏览器中输入 http://192.168.1.80:8000/,又能访问 /usr/local/nginx/html/index.html 了
在这里插入图片描述

4.4 加入多个server

修改 conf/test.conf

http {
   
   
    server {
   
   
        listen 8000;
    }
    server {
   
   
        listen 8001;
    }
    server {
   
   
        listen 8002;
    }
    server {
   
   
        listen 8003;
    }
}

再查看一下进程:

# netstat -anop |grep nginx
tcp        0      0 0.0.0.0:8000            0.0.0.0:*               LISTEN      969920/nginx: maste  关闭 (0.00/0/0)
tcp        0      0 0.0.0.0:8001            0.0.0.0:*               LISTEN      969920/nginx: maste  关闭 (0.00/0/0)
tcp        0      0 0.0.0.0:8002            0.0.0.0:*               LISTEN      969920/nginx: maste  关闭 (0.00/0/0)
tcp        0      0 0.0.0.0:8003            0.0.0.0:*               LISTEN      969920/nginx: maste  关闭 (0.00/0/0)
unix  3      [ ]         流        已连接     7210410  969920/nginx: maste  
unix  3      [ ]         流        已连接     7210409  969920/nginx: maste

上面的进程ID都是 969920,4个server在一个进程里面
也可以是放在多个进程里面,需要“ 往 conf/test.conf 追加worker_processes 4; ”,效果如下:

# ps -aux |grep nginx
root      970186  0.0  0.0   4276   392 ?        Ss   15:21   0:00 nginx: master process ./sbin/nginx -c conf/test.conf
nobody    970187  0.0  0.0   4960  2756 ?        S    15:21   0:00 nginx: worker process
nobody    970188  0.0  0.0   4960  2756 ?        S    15:21   0:00 nginx: worker process
nobody    970189  0.0  0.0   4960  2756 ?        S    15:21   0:00 nginx: worker process
nobody    970190  0.0  0.0   4960  2756 ?        S    15:21   0:00 nginx: worker process

4.5 进程 与 server 之间的关系

nginx ---> n进程---> nsever (TCP)
一个TCP server只监听一个端口
用netstat -anop |grep 8000查看 ,现在都是监听在master 970186 上
在这里插入图片描述
而当客户端来连接时,处理连接的进程在worker进程上:(work进程fork了master进程)
当连接来了,交给worker进程去处理(epoll监听在worker中进行),此时这里有4个worker进程去竞争来的连接(惊群)。

用telnet连接测试一下telnet 192.168.1.80 8001 woker进程有反应了:
在这里插入图片描述
当worker进程较多的时候,惊群的问题,可以通过给worker进程分配锁来解决,哪个worker持有锁,则由它来连接。

5 nginx 配置文件简介

5.1 根据不同的端口号配置不同的网页(服务器)

http {
   
   
    server {
   
   
        listen 8000;
        location / {
   
   
            root /home/test/nginx/html8000/;
        }
    }
    server {
   
   
        listen 8001;
        location / {
   
   
            root /home/test/nginx/html8001/;
        }
    }
    server {
   
   
        listen 8002;
        location / {
   
   
            root /home/test/nginx/html8002/;
        }
    }
    server {
   
   
        listen 8003;
        location / {
   
   
            root /home/test/nginx/html8003/;
        }
    }
}

在html8000到html8003 四个文件夹中分别放入index.html ,最后的端口号根据目录名修改一下
在这里插入图片描述

5.2 负载均衡,反向代理

将访问8000代理到 backend(名字可以自定义) ,也就是 8002,8003

http {
   
   
    upstream backend {
   
   
        server 192.168.1.80:8002;
        server 192.168.1.80:8003;
    }

    server {
   
   
        listen 8000;
        location / {
   
   
            root /home/test/nginx/html8000/;
            proxy_pass http://backend;
        }
    }
    server {
   
   
        listen 8001;
        location / {
   
   
            root /home/test/nginx/html8001/;
        }
    }
    server {
   
   
        listen 8002;
        location / {
   
   
            root /home/test/nginx/html8002/;
        }
    }
    server {
   
   
        listen 8003;
        location / {
   
   
            root /home/test/nginx/html8003/;
        }
    }
}

这样访问8000时,会出现两种情况:
在这里插入图片描述
在这里插入图片描述
此时,8002与8003是交替执行的
增加权重
upstream backend {
server 192.168.1.80:8002 weight=2;
server 192.168.1.80:8003 weight=1;
}
重新加载 /sbin/nginx -s reload 后
发现8002 与 8003出现次数比值是2:1,这里就是负载的比值,当有很有端口要处理时,为不同的端口配置不同的weight,可以定制负载,也可以做到负载均衡(根据服务器的强弱与访问频次的强弱进行配对)。
这里客户端访问的是服务器8000,却被代理到8002,8003,服务器被代理了,===> 反向代理(相对的正向代码是客户端被代理了)
这时负载均衡是建立在反向代理的基础上。

6 nginx代码试读

以.conf文件中的 “worker_processes”为例,通过搜索找到

   {
   
    ngx_string("worker_processes"),
      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,
      ngx_set_worker_processes,
      0,
      0,
      NULL },

NGX_MAIN_CONF 表示该指令可以在全局配置块中使用,通常位于配置文件的顶部
NGX_DIRECT_CONF 表示该指令可以在任何配置块中使用,包括全局配置块和其他块
NGX_CONF_TAKE1 带一个参数

然后找到ngx_set_worker_processes,如下:

static char *
ngx_set_worker_processes(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
   
   
    ngx_str_t        *value;
    ngx_core_conf_t  *ccf;  // 可以联想一下启动命令: ./sbin/nginx -c conf/test.conf   

    ccf = (ngx_core_conf_t *) conf;  // ccf 可以理解为解析出的conf文件的数据结构

    if (ccf->worker_processes != NGX_CONF_UNSET) {
   
   
        return "is duplicate";
    }

    value = cf->args->elts;  // 从conf文件解析出来的参数数组

    if (ngx_strcmp(value[1].data, "auto") == 0) {
   
   
        ccf->worker_processes = ngx_ncpu;
        return NGX_CONF_OK;
    }

    ccf->worker_processes = ngx_atoi(value[1].data, value[1].len);

    if (ccf->worker_processes == NGX_ERROR) {
   
   
        return "invalid value";
    }

    return NGX_CONF_OK;
}

可以从代码找到“worker_processes”的值还可以是 "auto"。
通过搜索 worker_processes 找到
ngx_start_worker_processes(cycle, ccf->worker_processes,
NGX_PROCESS_RESPAWN);
ngx_spawn_process(cycle, ngx_worker_process_cycle,
(void *) (intptr_t) i, "worker process", type);
再到fork进程

pid = fork();

switch (pid) {
   
   

case -1:
    ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
                  "fork() failed while spawning \"%s\"", name);
    ngx_close_channel(ngx_processes[s].channel, cycle->log);
    return NGX_INVALID_PID;

case 0:
    ngx_parent = ngx_pid;
    ngx_pid = ngx_getpid();
    proc(cycle, data);
    break;

可以逐步与理论相印证。

相关文章
|
6天前
|
移动开发 前端开发 JavaScript
前端vue2、vue3去掉url路由“ # ”号——nginx配置(一)
前端vue2、vue3去掉url路由“ # ”号——nginx配置
63 0
|
6天前
|
JavaScript 前端开发 应用服务中间件
angular引入包、路由权限配置、打包问题与nginx配置问题(简单部署)
angular引入包、路由权限配置、打包问题与nginx配置问题(简单部署)
26 0
|
6天前
|
前端开发 JavaScript 应用服务中间件
前端vue2、vue3去掉url路由“ # ”号——nginx配置(二)
前端vue2、vue3去掉url路由“ # ”号——nginx配置
69 0
|
1天前
|
负载均衡 安全 应用服务中间件
nginx配置ssl和反向代理的配置代码
【5月更文挑战第2天】nginx配置ssl和反向代理的配置代码
17 3
|
4天前
|
负载均衡 应用服务中间件 nginx
解决nginx配置负载均衡时invalid host in upstream报错
在Windows环境下,配置Nginx 1.11.5进行负载均衡时遇到问题,服务无法启动。错误日志显示“invalid host in upstream”。检查发现上游服务器列表中,192.168.29.128的主机地址无效。负载均衡配置中,两个服务器地址前误加了"http://"。修正方法是删除上游服务器列表和proxy_pass中的"http://"。问题解决后,Nginx服务应能正常启动。
38 4
解决nginx配置负载均衡时invalid host in upstream报错
|
6天前
|
应用服务中间件 nginx
nginx配置集群轮训策略
nginx配置集群轮训策略
421 0
|
6天前
|
安全 网络协议 应用服务中间件
一文读懂HTTPS⭐揭秘加密传输背后的原理与Nginx配置攻略
一文读懂HTTPS⭐揭秘加密传输背后的原理与Nginx配置攻略
|
6天前
|
应用服务中间件 PHP nginx
php如何实现检测nginx配置的正确性
请确保在执行此操作时,PHP有足够的权限来执行Nginx命令和访问Nginx配置文件。另外,将上述代码嵌入到您的应用程序中时,要注意安全性,以防止潜在的命令注入攻击。
55 3
|
6天前
|
安全 应用服务中间件 网络安全
linux_nginx中添加ssl配置(open ssl)
linux_nginx中添加ssl配置(open ssl)
27 1
|
6天前
|
JSON JavaScript 前端开发
vue2_vite.config.js的proxy跨域配置和nginx配置代理有啥区别?
vue2_vite.config.js的proxy跨域配置和nginx配置代理有啥区别?
35 1