源码部署nginx-1.19.2

Nginx优点

1、可以针对静态资源高速、高并发访问以及缓存。
2、可以使用反向代理加速,并可以进行数据缓存。
3、具有简单负载均衡、节点健康检查和容错功能。
4、支持远程FastCGI、Uwsgi、and Memcached Servers的加速和缓存。
5、支持SSL、TLS、SNI
6、具有模块化的架构:过滤器包括gzip压缩、ranges支持、chunked响应、XSLT、SSI及图像缩放功能,在SSI过滤器中,一个包含多个SSI的页面,如果由FastCGI或反向代理处理,可被并行处理。

具备其他www服务特性

1、支持基于名字、端口以及IP的多虚拟主机站点。
2、支持Keep-alive和pipelined连接。
3、可进行简单、方便、灵活的配置很管理。
4、支持修改Nginx配置,并且在代码上线时可以平滑重启不中断业务访问。
5、可以自定义访问日志格式,临时缓冲写日志操作,快速日志轮询及通过rsyslog处理日志。
6、可利用信号控制Nginx进程。
7、支持3xx-5xx http状态码重定向。
8、支持rewrite模块,支持URL重写及正则表达式匹配。
9、基于客户端IP地址和HTTP基本认证的访问控制。
10、支持PTU、DELETE、MKCOL、COPY以及MOVE等较特殊的HTTP请求方法。
11、支持FLV流和MP4流技术产品应用。
12、支持http响应速率限制。
13、支持同一个IP地址的并发连接或请求数限制。

Nginx软件特点

1、基于异步网络I/O模型(epoll、kqueue)
2、具备支持高性能、高并发的特性,并发连接可达数万。
3、对小文件(小于1MB的静态文件)高并发支持很好,性能很高。
4、不支持类似Apache的DSO模式,扩展库必须编译进主机程序(缺点)。
5、进程占用系统资源比较低
6、支持web、反向proxy、cache三大重点功能,并且都很优秀
7、市场份额在逐年增长

nginx有很多种部署方式,这里使用源码编译

1、安装nginx所需要的依赖软件

yum -y install gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel

2、创建程序依赖用户

useradd www -u 10000 -s /sbin/nologin -M

3、创建安装目录和软件存放目录

mkdir -p /app/nginx/logs/
mkdir -p /app/tools 

4、下载软件并编译安装

cd /app/tools
wget http://mirrors.sohu.com/nginx/nginx-1.19.2.tar.gz
tar xf nginx-1.19.2.tar.gz -C /app/
cd /app/nginx-1.19.2/
./configure \
--prefix=/app/nginx \
--user=nginx \
--group=nginx \
--http-log-path=/app/nginx/logs/access.log \
--error-log-path=/app/nginx/logs/error.log \
--lock-path=/app/nginx/nginx.lock \
--pid-path=/app/nginx/nginx.pid \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-http_mp4_module \
--with-pcre-jit \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_sub_module \
--with-stream \
--with-stream_ssl_module
 
make && make install

5、添加环境变量

echo "export PATH=$PATH:/app/nginx/sbin/" >>/etc/profile

6、配置网站监听域名等

mkdir -p /app/nginx/conf/extra
mkdir -p /app/nginx/html/www
cat >/app/nginx/conf/extra/www.conf<<EOF 
     server {
        listen       80;
        server_name  www.abc.com;
        location / {
            root   html/www;
            index  index.html index.htm;
        }
    }
EOF
echo "www" >/app/nginx/html/www/index.html

7、配置使用systemd进行管理

cat >/usr/lib/systemd/system/nginx.service <<EOF
[Unit]
Description=nginx - high performance web server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/app/nginx/sbin/nginx -c /app/nginx/conf/nginx.conf
ExecReload=/app/nginx/sbin/nginx -s reload
ExecStop=/app/nginx/sbin/nginx -s stop
EOF

或者:

[Unit]
Description=nginx
After=network.target

[Service]
Type=forking
ExecStart=/app/nginx/sbin/nginx
ExecReload=/app/nginx/sbin/nginx -s reload
ExecStop=/app/nginx/sbin/nginx -s stop
PrivateTmp=true

[Install]
WantedBy=multi-user.target

 

注册到系统服务

systemctl disable nginx
systemctl daemon-reload
systemctl stop nginx
systemctl start nginx
systemctl restart nginx
systemctl enable nginx

添加了环境变量也可以使用便捷方式去使用检查配置文件是否正确和重载配置文件

nginx                   #启动
nginx -t                #检查配置文件是否正确
nginx -s  reload        #重载配置文件、优雅重启
nginx -s  stop          #停止服务

配置nginx显示状态信息

cat >/app/nginx/conf/nginx.conf <<EOF
user  www;
worker_processes  auto;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    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;
        }
        #添加的5行内容
        location ~ /nginx_status {
            stub_status on;
            access_log off;
            allow all;
        }
    }
}
EOF

 

包含文件的方式

cat >/app/nginx/conf/nginx.conf <<EOF
user  www;
worker_processes  auto;
access_log  /app/nginx/logs/access.log  main;
error_log  /app/nginx/logs/error.log warn;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    gzip  on;
    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  /var/log/nginx/access.log  main;
    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;
        }
        #添加的5行内容
        location ~ /nginx_status {
            stub_status on;
            access_log off;
            allow all;
        }
    }
}
stream {
    log_format proxy '$remote_addr [$time_local] '
                 '$protocol $status $bytes_sent $bytes_received '
                 '$session_time "$upstream_addr" '
                 '"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';
    include /app/nginx/game/entry.conf;
}
EOF

 

重启服务

systemctl restart nginx.service

浏览器测试访问结果:http://xxx.xxx.xxx.xxx/nginx_status

Active connections: 2 
server accepts handled requests
 2 2 1 
Reading: 0 Writing: 1 Waiting: 1 

说明:
Active connections: 2 表示Nginx正在处理的活动连接数2个。
server 2 表示Nginx启动到现在共处理了9个连接
accepts 2 表示Nginx启动到现在共成功创建9次握手
handled requests 1 表示总共处理了10次请求
Reading:0 读取到客户端的 Header 信息数
Writing:1 返回给客户端 Header 信息数
Waiting:1 已经处理完正在等候下一次请求指令的驻留链接(开启keep-alive的情况下,这个值等于Active-(Reading+Writing))

nginx-ngxtop监控nginx状态

安装相关的软件

yum -y install epel-release && yum -y install python-pip
pip install --upgrade pip
pip install ngxtop

ngxtop使用参数

ngxtop 参数 print|top|avg|sum
ngxtop info 显示日志格式信息

-l <file>或--access-log <file> 设置日志路径
-f <format>或--log-format <format> 设置日志格式,默认格式combined,另外一种较常用格式为common
--no-follow 处理以前的日志,实时日志不做处理
-t <seconds> 或 --interval <seconds> 刷新频率,默认2秒
-g <var>或 --group-by <var> 按变量分组,默认显示 request_path
-w <var>或 --having <expr> 筛选 [default: 1]
-o <var>或 --order-by <var> 输出的排序方式,默认: 访问数
-n <number>或 --limit <number> 显示top多条,默认前top 10条
-a <exp> ...或 --a <exp> ... 对输出字段做处理,可选 sum, avg, min, max
-v或 --verbose 详细输出
-d或 --debug debug模式,输出每行及记录
-h或 --help 显示帮助详细
--version 显示版本信息

高级参数

-c <file>或 --config <file> 指定nginx配置文件,自动分析日志格式
-i <filter-expression>或 --filter <filter-expression> 满足表达式的过滤将被处理
-p <filter-expression>或 --pre-filter <filter-expression> in-filter expression to check in pre-parsing phase.
另外一些变量可以在分析时用到,名字含义同日志格式里的设置:remote_addr、remote_user、time_local、request、request_path、status、body_bytes_sent、http_referer、http_user_agent。
按rquest_path且是404的前10请求:
ngxtop -l /usr/local/nginx/logs/access.log --no-follow top request_path --filter 'status == 404'

按总bytes sent最高的前10:
ngxtop -l /usr/local/nginx/logs/access.log --no-follow --order-by 'avg(bytes_sent) * count'

按remote address进行排序前10:
ngxtop -l /usr/local/nginx/logs/access.log --no-follow --group-by remote_addr

显示400或更高返回状态码的且只显示request、status、http_referer这三列信息:
ngxtop -l /usr/local/nginx/logs/access.log --no-follow -i 'status >= 400' print request status http_referer

显示bytes_sent平均值且状态码为200且request_path以www开始的前10:
ngxtop -l /usr/local/nginx/logs/access.log --no-follow avg bytes_sent --filter 'status == 200 and request_path.startswith("www")'

关于 ngxtop 的更多用法,可通过 ngxtop -h 查询。

执行命令分析日志显示访问状态

[root@node-1 ~]#  ngxtop -l /app/nginx/access.log
running for 12 seconds, 0 records processed: 0.00 req/sec
Summary:
|   count | avg_bytes_sent   |   2xx |   3xx |   4xx |   5xx |
|---------+------------------+-------+-------+-------+-------|
|	0 |                  |     0 |     0 |     0 |     0 |
Detailed:
| request_path   | count   | avg_bytes_sent   | 2xx   | 3xx   | 4xx   | 5xx   |

[root@node-1 ~]# ngxtop -l /app/nginx/access.log --no-follow
running for 0 seconds, 0 records processed: 0.00 req/sec

Summary:
|   count | avg_bytes_sent   |   2xx |   3xx |   4xx |   5xx |
|---------+------------------+-------+-------+-------+-------|
|       0 |                  |     0 |     0 |     0 |     0 |
Detailed:
| request_path   | count   | avg_bytes_sent   | 2xx   | 3xx   | 4xx   | 5xx   |
|----------------+---------+------------------+-------+-------+-------+-------|
[root@node-1 ~]# 

nginx-搭建交互式登录访问网站

创建目录和生成账号和密码

yum -y install httpd-tools
mkdir /app/nginx/auth
htpasswd -c /app/nginx/auth/passwd admin 

htpasswd命令选项参数说明

-c     创建一个加密文件;
-n     不更新加密文件,只将htpasswd命令加密后的用户名密码显示在屏幕上;
-m     默认htpassswd命令采用MD5算法对密码进行加密;
-d     htpassswd命令采用CRYPT算法对密码进行加密;
-p     htpassswd命令不对密码进行进行加密,即明文密码;
-s     htpassswd命令采用SHA算法对密码进行加密;
-b     htpassswd命令行中一并输入用户名和密码而不是根据提示输入密码;
-D     删除指定的用户。

部分参数使用演示

1、新增用户
用法:htpasswd -b [passwdfile] [username] [passwd]
htpasswd -b /usr/local/nginx/auth/passwd test 123456

2、删除用户
用法:htpasswd -D [passwdfile] [username]
htpasswd -D /usr/local/nginx/auth/passwd test

3、创建文件,添加用户(注意密码文件,否则已存在文件会覆盖原内容)
用法:htpasswd -bc [passedfile] [username]
htpasswd -bc /usr/local/nginx/auth/passwd Test 123
cat /usr/local/nginx/auth/passwd

修改配置文件  

vim /etc/nginx/nginx.conf
    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        #下面增加两行,加密用户及文件存放路径
        auth_basic "Please input password";
        auth_basic_user_file /app/nginx/auth/passwd;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

验证配置文件和重启服务器

nginx -t
systemctl restart nginx.service

反向代理

worker_processes  auto;
events {
    use  epoll;
    worker_connections  65535;
}
http {
    upstream backend{
        server 172.16.0.10:8080;
        server 172.16.0.20:8080;
        server 172.16.0.30:8080;
    }
    server {
        listen       80;
        server_name www.abc.com;
        location / {
            client_max_body_size 100M;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://backend;
            }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}

目前就整理了这么多

posted @ 2020-10-16 13:33  缺个好听的昵称  阅读(702)  评论(0编辑  收藏  举报