Nginx系列(一):nginx安装解析及原理简析

Nginx/Web服务器
16
0
0
2024-10-31
标签   Nginx原理

nginx 安装及常用指令

centos7 安装 nginx

nginx 安装需要的依赖环境

  1. gcc
  2. pcre
  3. openssl
  4. zlib

通过指令安装

yum install gcc-c++
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
yum install -y openssl openssl-devel
下载nginx

方式一:直接下载.tar.gz安装包,地址:nginx.org/en/download…

方式二:wget 下载

更换版本,自行替换下载链接

# 下载nginx
wget -c https://nginx.org/download/nginx-1.19.0.tar.gz
# 解压
tar -zxvf nginx-1.19.0.tar.gz
​
cd nginx-1.19.0

配置nginx

默认配置

一般使用默认配置即可

cd nginx-1.19.0
​
./configure
自定义配置(可选)
./configure \
--prefix=/usr/local/nginx \
--conf-path=/usr/local/nginx/conf/nginx.conf \
--pid-path=/usr/local/nginx/conf/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi

注:将临时文件目录指定为/var/temp/nginx,需要在/var下创建temp及nginx目录

安装nginx

# 编译安装
make && make install
​
cd /usr/local/nginx/sbin/
# 查看版本号
./nginx -v
# 查看安装路径
whereis nginx

启动、停止nginx

cd /usr/local/nginx/sbin/
# 启动
./nginx
# 强暴关闭
./nginx -s stop
# 优雅关闭
./nginx -s quit
# 重启
./nginx -s reopen
# 重载
./nginx -s reload

查看nginx进程

ps aux|grep nginx

dokcer 安装 nginx

  1. 下载镜像,并复制默认配置
  2. 停止删除容器
  3. 生成启动文件 - start.sh
  4. 运行start.sh 启动mynginx
  5. 访问127.0.0.1可以访问到nginx默认页面
  6. 配置反向代理
  7. 下载镜像,并复制默认配置 docker run --name mynginx -d nginx

创建主机挂载配置文件

mkdir -p ~/i/apps/nginx/{conf,conf.d,html,logs}

复制默认配置

docker cp mynginx:/etc/nginx/nginx.conf ~/i/apps/nginx/conf/nginx.conf
docker cp mynginx:/etc/nginx/conf.d/default.conf ~/i/apps/nginx/conf.d/default.conf
docker cp mynginx:/usr/share/nginx/html/index.html ~/i/apps/nginx/html/index.html

要想查询默认配置可以:

docker run -i -t nginx /bin/bash:查看所有文件夹 cat /etc/nginx/nginx.conf:查看nginx.conf文件内容然后拷贝出来 cat /etc/nginx/conf.d/default.conf:查看default.conf文件内容然后拷贝出来 /usr/share/nginx/html:默认首页文件夹html路径 /var/log/nginx:日志文件路径

  1. 停止删除容器 docker rm -f mynginx
  2. 生成启动文件 - start.sh
[root@master ~]# cd ~/i/apps/nginx/
[root@master nginx]# ls
conf  conf.d  html  logs
[root@master nginx]# cat <<EOF > start.sh
#!/bin/bash
NGINX_DIR=`pwd`
docker stop mynginx
docker rm mynginx
docker run -d     --restart always    -p 80:80     --name mynginx     -v ${NGINX_DIR}/html:/usr/share/nginx/html     -v ${NGINX_DIR}/conf/nginx.conf:/etc/nginx/nginx.conf     -v ${NGINX_DIR}/conf.d:/etc/nginx/conf.d     -v ${NGINX_DIR}/logs:/var/log/nginx     nginx
EOF

说明:

-d: 后台运行容器; --name: 指定容器名; -p: 指定服务运行的端口; -v: 映射目录或文件;

  1. 运行start.sh 启动mynginx
[root@master nginx]# sh start.sh 
Error response from daemon: No such container: mynginx
Error: No such container: mynginx
5a23fe9288535c0141afb5b55c7c907e8c0a108dcda8fe486fb02028975ad5bb
  1. 访问http://127.0.0.1/可以访问到nginx默认页面
  2. 配置反向代理
[root@master nginx]# cd conf.d/
[root@master conf.d]# ls
default.conf
[root@master conf.d]# vi test.com.conf
server {
    listen  80;
    server_name  test.com;
    access_log /var/log/nginx/wanfei.access.log main;
    error_log /var/log/nginx/wanfei.error.log error;
    location / {
        proxy_set_header  Host  $http_host;
        proxy_set_header  X-Real-IP  $remote_addr;
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass  http://127.0.0.1:80;
    }
}

常用指令

cd /usr/local/nginx/sbin/
# 启动
./nginx
# 查看nginx版本
./nginx -v
# 强暴关闭
./nginx -s stop
# 优雅关闭
./nginx -s quit
# 重启
./nginx -s reopen
# 重载
./nginx -s reload
# 检测配置文件
./nginx -t

nginx原理

nginx的master和worker关系

master只有一个,是领导,负责管理、监控。worker有很多个,是打工者,负责处理领导分发的任务。

但master不会去分配任务,而是会通知各位worker一声,各位worker再去争夺资源(客户端),已经抢到的不会再去争夺下一个资源,争夺到后worker开始读取请求-解析请求-处理请求,数据彻底返回客户端之后,这个worker争夺事件就算结束,可以继续争夺下一个资源。

思考

1、一个master和多个woker的好处 对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。其次,采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快启动新的worker进程。当然,worker进程的异常退出,肯定是程序有bug了,异常退出,会导致当前worker上的所有请求失败,不过不会影响到所有请求,所以降低了风险。

2、设置多少个woker合适 Nginx同redis类似都采用了io多路复用机制,每个worker都是一个独立的进程, 但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求,即使是千上万个请求也不在话下。每个worker的线程可以把一个cpu的性能发挥到极致。所以worker数和服务器的cpu数相等是最为适宜的(一般设置work数与cpu数一致)。设少了会浪费cpu,设多了会造成cpu频繁切换上下文带来的损耗。

3、连接数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. 因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接 worker_connections :连接数 worker_processes:worker数