概述

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日。

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是内存利用率高,并发能力强。

工作模式

nginx有两种工作模式:master-worker模式和单进程模式。在master-worker模式下,有一个master进程和至少一个的worker进程,单进程模式顾名思义只有一个进程。这两种模式有各自的特点和适用场景。

master-worker:

该模式下,nginx启动成功后,会有一个master进程和至少一个的worker进程。master进程负责处理系统信号,加载配置,管理worker进程(启动,杀死,监控,发送消息/信号等)。worker进程负责处理具体的业务逻辑,也就是说,对外部来说,真正提供服务的是worker进程。生产环境下一般使用这种模式,因为这种模式有以下优点:

  1. 稳定性高,只要还有worker进程存活,就能够提供服务,并且一个worker进程挂掉master进程会立即启动一个新的worker进程,保证worker进程数量不变,降低服务中断的概率。
  2. 配合linux的cpu亲和性配置,可以充分利用多核cpu的优势,提升性能
  3. 处理信号/配置重新加载/升级时可以做到尽可能少或者不中断服务(热重启)

单进程模式:

单进程模式下,nginx启动后只有一个进程,nginx的所有工作都由这个进程负责。由于只有一个进程,因此可以很方便地利用gdb等工具进行调试。该模式不支持nginx的平滑升级功能,任何的信号处理都可能造成服务中断,并且由于是单进程,进程挂掉后,在没有外部监控的情况下,无法重启服务。因此,该模式一般只在开发阶段和调试时使用,生产环境下不会使用。

Nginx配置文件详解

user  www www;
#程序运行用户和组

worker_processes auto;
#启动进程,指定nginx启动的工作进程数量,建议按照cpu数目来指定,一般等于cpu核心数目

error_log  /home/wwwlogs/nginx_error.log  crit;
#全局错误日志

pid        /usr/local/nginx/logs/nginx.pid;
#主进程PID保存文件

worker_rlimit_nofile 51200;
#文件描述符数量

events 
    {
      use epoll;     
    #使用epoll模型,对于2.6以上的内核,建议使用epoll模型以提高性能
    
    worker_connections 51200;     
    #工作进程的最大连接数量,根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行每个进程允许的最多连接数, 理论上每台nginx服务器的最大连接数为worker_processes*worker_connections,具体还要看服务器的硬件、带宽等。
    }

http 
#整体环境配置--网站配置
    {
               include       mime.types;
               default_type  application/octet-stream;
             #设定mime类型,文件传送类型由mime.type文件定义
             server_names_hash_bucket_size 128;        
             #保存服务器名字的hash表大小
             client_header_buffer_size 32k;            
             #客户端请求头部缓冲区大小
             large_client_header_buffers 4 32k;            
             #最大客户端头缓冲大小
             client_max_body_size 50m;                
             #客户端最大上传文件大小(M)

             sendfile on;
             #sendfile 指令指定 nginx 是否调用 sendfile 函数来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
             tcp_nopush     on;
             #这个是默认的,结果就是数据包不会马上传送出去,等到数据包最大时,一次性的传输出去,这样有助于解决网络堵塞。(只在sendfile on时有效)

             keepalive_timeout 60;
             #连接超时时间

             tcp_nodelay on;
             #禁用nagle算法,也即不缓存数据。有效解决网络阻塞

                fastcgi_connect_timeout 300;
                fastcgi_send_timeout 300;
                fastcgi_read_timeout 300;
                fastcgi_buffer_size 64k;
                fastcgi_buffers 4 64k;
                fastcgi_busy_buffers_size 128k;
                fastcgi_temp_file_write_size 256k;
                #fastcgi设置

                   gzip on;
                gzip_min_length  1k;
                   gzip_buffers     4 16k;
                gzip_http_version 1.1;
                gzip_comp_level 2;
                gzip_types     text/plain application/javascript application/x-javascript text/javascript text/css application/xml application xml+rss;
                gzip_vary on;
                gzip_proxied   expired no-cache no-store private auth;
                gzip_disable   "MSIE [1-6]\.";

                #limit_conn_zone $binary_remote_addr zone=perip:10m;
                ##If enable limit_conn_zone,add "limit_conn perip 10;" to server section.
                server_tokens off;
                #隐藏nginx版本号(curl -I 192.168.4.154可以查看,更加安全)

                   #log format
                log_format  access  '$remote_addr - $remote_user [$time_local] "$request"'
                 '$status $body_bytes_sent "$http_referer" '
                 '"$http_user_agent" $http_x_forwarded_for';
                 #定义日志格式

    server
            {
                listen 80 default_server;
                #listen [::]:80 default_server ipv6only=on;
                #监听80端口,WEB服务的监听设置,可以采用"IP地址:端口"形式
                server_name www.lnmp.org lnmp.org;
                #服务器名,可以写多个域名,用空格分隔
                index index.html index.htm index.php;
                #默认网页文件
                root  /home/wwwroot/default;
                #网页主目录


                #error_page   404   /404.html;
                include enable-php.conf;
                
                location /nginx_status
                        {
                            stub_status  on;    
                            access_log   off;
                        }
                #开启status状态监测
                location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
                        {
                            expires      30d;
                        }
                #静态文件处理,保存期30天
                location ~ .*\.(js|css)?$
                        {
                            expires      12h;
                        }
                #js和css文件处理,保存期12小时
                location ~ /\.
                        {
                            deny all;
                        }

                 access_log  /home/wwwlogs/access.log  access;
                #正确访问日志
             }
include vhost/*.conf;
#vhost/下子配置文件生效
}

nginx安装

安装包可以在Nginx的官网的下载页面中(http://nginx.org/en/download.html)根据自己的需求下载对应的版本。
我这里下载的是1.22.1版本

wget https://nginx.org/download/nginx-1.22.1.tar.gz

linux运维之nginx_服务器


由于nginx是基于c语言开发的,所以安装nginx之前需要安装c语言的编译环境,及正则表达式库等第三方依赖库。

yum -y install gcc pcre-devel zlib-devel openssl openssl-devel

安装nginx

#解压之前下载的nginx安装包
tar -zxvf nginx-1.22.1.tar.gz
cd nginx-1.22.1
#初始化Nginx
./configure --prefix=/usr/local/nginx
#编译和安装
make & make install

查看对应的ip和端口

linux运维之nginx_服务器_02


访问nginx页面

linux运维之nginx_nginx_03


nginx安装成功

Nginx相关用法

用法1. Nginx的状态统计

安装nginx时将 --with-http_stub_status_module 模块开启

#创建系统用户
useradd -r -s /usr/sbin/nologin nginx
#进入到nginx安装包解压目录
cd nginx-1.22.1
#之前安装过一次nginx,因此需要make clean
make clean
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
make && make install

修改nginx配置文件(写入要访问的server标签中)

location /status {
    stub_status on;
    access_log  off;
    }

linux运维之nginx_nginx_04


linux运维之nginx_服务器_05


注:修改配置文件后需要重启nginx才能生效

linux运维之nginx_服务器_06


linux运维之nginx_Nginx_07

"Active connections"表示当前的活动连接数;
"server accepts handled requests"表示已经处理的连接信息
三个数字依次表示已处理的连接数、成功的TCP握手次数、已处理的请求数

用法2. 目录保护

#在状态统计的location中添加
auth_basic "Welcome to nginx_status!";
auth_basic_user_file
#使用Apache的命令htpasswd进行用户密码文件的创建(生成在上面指定的位置)
htpasswd -c /usr/local/nginx/html/htpasswd.nginx user
#重启nginx并再次访问统计页面

linux运维之nginx_服务器_08


linux运维之nginx_nginx_09


因为是使用Apache的命令htpasswd,如果报错“未找到命令”,请先yum -y install httpd安装apache

linux运维之nginx_nginx_10


现在访问页面需要输入用户和密码

用法3. 基于IP的身份验证(访问控制)

#在状态统计的location中添加
allow 192.168.136.1;
deny 192.168.136.0/24;
#仅允许192.168.136.1访问服务器

linux运维之nginx_nginx_11


192.168.136.1可以正常访问

linux运维之nginx_Nginx_12


现在其他ip访问则是这种现象

用法4. nginx的虚拟主机

目前有基于域名和基于端口的方法,这里演示基于域名的方法
1.提前准备好两个网站的域名,并且规划好两个网站网页存放目录

cd /usr/local/nginx/html/
mkdir aaa
mkdir bbb

2.然后分别在这两个目录下面写 index.html 这两个文件并写入测试内容

echo "I am aaa!!!!!!" > aaa/index.html
echo "I am bbb!!!!!!!" > aaa/index.html

3.在Nginx主配置文件中并列编写两个server标签,并分别写好各自信息

linux运维之nginx_服务器_13


4.测试

linux运维之nginx_服务器_14


linux运维之nginx_Nginx_15

用法5. nginx的反向代理

Nginx反向代理是一种服务器架构模式,其中Nginx服务器充当反向代理服务器,接收客户端的请求并将其转发到后端服务器。

nginx反向代理搭建

1.在另外一台机器上(192.168.136.4)安装nginx,启动并填写测试页面

linux运维之nginx_服务器_16


在nginx反向服务器(192.168.136.3)的配置文件中添加(写在要访问的server标签内)

location / {

proxy_pass http://192.168.136.4:80;            #此处填写后端nginx服务器的IP地址

}

linux运维之nginx_Nginx_17


现在访问这台反向代理服务器(192.168.136.3)

linux运维之nginx_Nginx_18


反向代理成功。

用法6. 负载均衡

代理服务器可以将用户访问请求,根据多种负载算法分发到后端目标服务器上处理,减轻单台服务器过载,同时消除单点故障。反向代理还可以将传入的请求同时定向到多台服务器,每台服务器执行特定优化功能,反向代理收集所有服务器响应以后汇总传递给用户。
负载均衡有多种算法(轮询、加权轮询、最小连接数...),这里演示轮询算法
1.再部署两台nginx服务器
2.修改反向代理服务器配置文件

upstream aaa {                #此标签在server标签前添加
    server 192.168.136.4:80;
    server 192.168.136.5:80;
}
server {
    ........;
    #修改自带的location / 的标签,将原内容删除,添加下列两项
    location / {
        proxy_pass http://bbs;    #添加反向代理,代理地址填写upstream声明的名字
        proxy_set_header Host $host;        #重写请求头部,保证网站所有页面都可访问成功
    }
}

linux运维之nginx_nginx_19


页面访问代理服务器(192.168.136.3)

linux运维之nginx_Nginx_20


linux运维之nginx_nginx_21


点击刷新,流量会不断的在nginx2(192.168.136.4)和nginx3(192.168.136.5)轮询。负载均衡搭建成功。

用法7. nginx实现https{证书+rewrite}

1.安装nginx时,需要将--with-http_ssl_module 模块开启

2.在对应要进行加密的server标签中添加以下内容开启SSL

linux运维之nginx_nginx_22


3.新增以下server标签(利用虚拟主机+rewrite的功能)

linux运维之nginx_服务器_23


4.生成证书和秘钥文件

# openssl genrsa -out kernel.key 1024 
建立服务器私钥,生成RSA密钥
# openssl req -new -key kernel.key -out kernel.csr 
需要依次输入国家,地区,组织,email。最重要的是有一个common name,可以写你的名字或者域名。如果为了https申请,这个必须和域名吻合,否则会引发浏览器警报。生成的csr文件交给CA签名后形成服务端自己的证书
# openssl x509 -req -days 365 -sha256 -in kernel.csr -signkey kernel.key -out kernel.crt 
生成签字证书
# cp kernel.crt /usr/local/nginx/conf/ssl/kernel.crt
# cp kernel.key /usr/local/nginx/conf/ssl/kernel.key

将私钥和证书复制到指定位置

5.重启nginx后访问nginx服务器的域名(ccc.lyw.com)

linux运维之nginx_nginx_24


会自动跳转到https://ccc.lyw.com

用法8. 关键字屏蔽页面

1.在server标签下新增location模块

2.这里配置的是,只要请求带有status关键字的都会被屏蔽,并返回403。这里用到了location的匹配规则,就不详细说了,大家自行去了解。

linux运维之nginx_服务器_25


网页测试,屏蔽成功

linux运维之nginx_服务器_26


关键字屏蔽在各种项目都会经常用到,如屏蔽特定浏览器访问,屏蔽某些服务器访问,屏蔽所有网页端访问、只允许小程序端访问等等。感兴趣的朋友可以自己去深入了解。

用法9. 其他用法

nginx的用法广泛,以上只是演示了常用的8种用法。除了以上8种,还有跟多用法,网上资源比较多,大家自行去了解。