- Nginx
- 运维

安装

安装 pcre

下载
解压
./configure
make && make install

更新依赖

sudo yum install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel

安装 nginx

下载
解压
./configure
make && make install

CentOS7 的默认防火墙改成了 firewall,不再使用 iptables 为默认防火墙了

安装好 nginx 后需要打开 80 端口

firewall-cmd --list-all #查看开发的端口号
firewall-cmd --zone=public --add-port=80/tcp --permanent # 开发 80 端口 tcp 协议
# --zone #作用域
# --add-port=80/tcp #添加端口,格式:端口/通讯协议
# --permanent #永久生效,没有此参数重启后失效

firewall 相关命令

systemctl stop firewalld.service # 停止
systemctl start firewalld.service # 启动
systemctl status Firewalld.service # 状态
systemctl restart firewalld.service # 重启

相关命令

查看版本号:

[root@centos-7 sbin]# ./nginx -v
nginx version: nginx/1.19.1

停止:

[root@centos-7 sbin]# ./nginx -s stop
[root@centos-7 sbin]# ps aux | grep nginx
root     16465  0.0  0.0 112824   980 pts/0    S+   21:31   0:00 grep --color=auto nginx

启动:

[root@centos-7 sbin]# ./nginx
[root@centos-7 sbin]# ps aux | grep nginx
root     16475  0.0  0.0  20568   620 ?        Ss   21:32   0:00 nginx: master process ./nginx
nobody   16476  0.0  0.0  23092  1380 ?        S    21:32   0:00 nginx: worker process
root     16478  0.0  0.0 112824   976 pts/0    S+   21:32   0:00 grep --color=auto nginx

重加载:

[root@centos-7 sbin]# ./nginx -s reload
[root@centos-7 sbin]# ps aux | grep nginx
root     16475  0.0  0.0  20708  1344 ?        Ss   21:32   0:00 nginx: master process ./nginx
nobody   16480  0.0  0.0  23208  1492 ?        S    21:33   0:00 nginx: worker process

配置文件

一般在/usr/local/nginx/conf下。

注意:如果在 nginx 安装过程中指定了--prefix=/path/的情况下,这个目录就在指定的 path 下。

注意:yum 安装的可能不在这个目录下。

配置文件分为 3 个部分:

  • 全局块(对应下文中配置文件的 1-10 行)
    从配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令。
    主要包括配置运行 nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型、配置文件的引入等。
    比如:worker_processes 1;是 nginx 服务器并发处理服务的关键配置,值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约。(和 CPU 核心数量一致比较合理?)
  • events 块
    主要影响 nginx 服务器与用户的网络连接。
    比如:worker_connections 1024; 支持的最大连接数。
  • http 块
    配置中最频繁的步伐,代理、缓存、日志定义绝大多数功能和第三方模块的配置都在这里
    注意:http 块也可以包括 http 全局块、server 块。
  • http 全局块(下文中 17-33 行)
  • 包括文件引入、mime-type 定义、日志自定义、连接超时时间、单链接请求数上限等。
  • server 块
  • 和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。
  • 每个 http 块可以包括多个 server 块,每个 server 块就相当于一个虚拟主机。
  • 每个 server 块也分为全局 server 块以及可以同时包含多个 location 块。
  • 全局 server 块(下文 35-41 行)最常见的就是配置本虚拟主机的监听配置和本虚拟主机的名称或 IP 配置。
  • location 块,一个 server 块可以包含多个 location 块,主要是基于 nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是IP别名)之外的字符串(例如前面的/uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
#user  nobody;
worker_processes  1;

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

#pid        logs/nginx.pid;


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;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

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

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

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


    # HTTPS 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_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

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

}

NGINX 原理

master & worker

nginx 防火墙 开源 nginx防火墙在哪_html

[root@centos-7 keepalived]# ps aux | grep nginx
root     11262  0.0  0.0  20612  1424 ?        Ss   14:14   0:00 nginx: master process ./nginx
nobody   18694  0.0  0.0  23124  1664 ?        S    16:27   0:00 nginx: worker process

worker 是如何工作的?

争抢。

nginx 防火墙 开源 nginx防火墙在哪_nginx 防火墙 开源_02

一个 master 和多个 worker 的好处?

1、可以使用 nginx -s reload 热部署

当使用了热部署后,之前有 client 请求的 worker 还是按照之前的规则进行处理请求,空闲的 worker 就可以根据新的配置来进行处理 client 的请求。

2、对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。

3、采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快启动新的worker进程。

当然,worker进程的异常退出,肯定是程序有bug了,异常退出,会导致当前worker上的所有请求失败,不过不会影响到所有请求,所以降低了风险。

设置多少个 worker 合适?

Nginx同redis类似都采用了io多路复用机制,每个worker都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求,即使是 千上万个请求也不在话下。

每个worker的线程可以把一个cpu的性能发挥到极致。所以worker数和服务器的cpu数相等是最为适宜的。设少了会浪费cpu,设多了会造成cpu频繁切换上下文带来的损耗。

# 设置worker数量
worker_processes 4

# work绑定cpu(4work绑定4cpu)
worker_cpu_affinity 0001 0010 0100 1000

# work绑定cpu (4work绑定8cpu中的4个)
worker_cpu_affinity 0000001 00000010 00000100 00001000

连接数 worker_connection

这个值是表示每个worker进程所能建立连接的最大值。

所以,一个nginx 能建立的最大连接数,应该是worker.connections * worker processes

当然,这里说的是最大连接数,对于HTTP 请求本地资源来说,能够支持的最大并发数量是worker.connections * worker processes

如果是支持http1.1的浏览器每次访问要占两个连接,所以普通的静态访问最大并发数是worker.connections * worker.processes / 2

而如果是HTTP作为反向代理来说,最大并发数量应该是worker.connections * worker_proceses/4

因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接。

发送请求,占用了woker的几个连接数?

2 个或者 4 个。

比如请求的是静态资源,一来一回是两个连接数。

如果访问别的资源比如说是 tomcat,则 worker 和 tomcat 也有一来一回两个连接,所以是 4 个连接数。

nginx有一个master,有四个woker,每个woker支持最大的连接数1024,支持的最大并发数是多少?

普通的静态访问最大并发数是: worker connections * worker processes/2

而如果是HTTP作为反向代理来说,最大并发数量应该是worker connections * worker processes/4

EOF