nginx安装、维护和升级

Nginx安装部署

一、环境介绍

系统及软件版本

Linux:CentOS 7

Nginx:1.16.1

二、nginx部署

方案一:Yum安装

1、配置yum软件仓库

​ ①检查yum源是否有nginx安装包

[root@web01 ~]# yum list | grep nginx-1.16.1

​ ②配置阿里云yum源(实现步骤①的前提下,可跳过步骤②)

[root@web01 ~]# cd /etc/yum.repos.d/ 
[root@web01 ~]# mkdir repo
[root@web01 ~]# mv *.repo local.repo repo/
[root@web01 ~]# wget -O CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@web01 ~]# yum clean all  
[root@web01 ~]# yum repolist   
[root@web01 ~]# yum list|grep nginx-1.16  

​ ③yum安装nginx-1.16

[root@web01 ~]# yum -y install nginx #yum安装nginx

​ ④规划分区

[root@web01 ~]# lsblk #检查系统磁盘信息,发现可用磁盘
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda    253:0    0  30G  0 disk 
└─vda1 253:1    0  30G  0 part /
vdb    253:16   0  50G  0 disk 
[root@web01 ~]# fdisk /dev/vdb #对可用磁盘进行分区
[root@web01 ~]# lsblk #检查分区是否成功
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda    253:0    0  30G  0 disk 
└─vda1 253:1    0  30G  0 part /
vdb    253:16   0  50G  0 disk 
└─vdb1 253:17   0  50G  0 part 
[root@web01 ~]# pvcreate /dev/vdb1   #创建物理卷
root@web01 ~]# pvs # 检查物理卷
[root@web01 ~]# vgcreate vg_vdb1 /dev/vdb1 #创建卷组vg_vdb1
[root@web01 ~]# vgs #检查卷组
[root@web01 ~]# lvcreate -n lv_vg_vdb1 -L 49G vg_vdb1 #创建逻辑卷
[root@web01 ~]# lvs #检查逻辑卷
[root@web01 ~]# mkfs.ext4 /dev/vg_vdb1/lv_vg_vdb1 # 对逻辑卷进行格式化
[root@web01 ~]# mount /dev/vg_vdb1/lv_vg_vdb1 /data/ #将/data挂载到逻辑卷上
[root@web01 ~]# df -h #检查是否挂载成功
文件系统                        容量  已用  可用 已用% 挂载点
/dev/vda1                        30G  1.3G   29G    5% /
devtmpfs                        697M     0  697M    0% /dev
tmpfs                           707M     0  707M    0% /dev/shm
tmpfs                           707M  8.4M  699M    2% /run
tmpfs                           707M     0  707M    0% /sys/fs/cgroup
tmpfs                           142M     0  142M    0% /run/user/0
/dev/mapper/vg_vdb1-lv_vg_vdb1   49G   53M   46G    1% /data
[root@web01 ~]# echo "/dev/vg_vdb1/lv_vg_vdb1 /data/ ext4 defaults 0 0" >> /etc/fstab  # 写进配置文件,使其永久生效

​ ⑤ 建立文件目录和修改配置文件

[root@web01 ~]# mkdir /data/www #建立网页家目录
[root@web01 ~]# mkdir -p /data/log/nginx #建立日志文件目录
[root@web01 ~]# vim /etc/nginx/nginx.conf #yum安装的nginx主配置文件一般在/etc/nginx/nginx.conf
user nginx;
worker_processes  2;  # nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 (2个双核的cpu为4)。
worker_cpu_affinity 01 10;  # 为每个进程分配cpu,

events {
        worker_connections  65533;   # 每个进程允许的最多连接数,理论上每台nginx 服务器的最大连接数为worker_processes*worker_connections
        use epoll;  # 使用epoll 的I/O 模型
        accept_mutex on; #优化同一时刻只有一个请求而避免多个睡眠进程被唤醒的设置,on为防止被同时唤醒,默认为off,因此nginx刚安装完以后要进行适当的优化。

}

http {
    include       mime.types;
    default_type  application/octet-stream;

    server_names_hash_bucket_size 64;  # 配置多个虚拟主机时必须添加
    client_header_buffer_size 32k;   #  如果你的请求中的header都很大,那么应该使用	 	 	client_header_buffer_size,这样能减少一次内存分配。
    large_client_header_buffers 4 32k;  # 如果你的请求中只有少量请求header很大,那么应该使用large_client_header_buffers,可以减少无谓的内存空间浪费。
    #client_max_body_size   20m;  # 控制全局nginx所有请求报文大小

    sendfile        on;
    keepalive_timeout  60;
    server_tokens off; # 隐藏版本号

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #client_max_body_size   20m;  # 控制该serverd请求报文大小
        location / {
            root   /data/www;
            index  index.php index.html index.htm;
            #client_max_body_size   20m;  #控制满足该路由规则的请求报文大小
        }

        location /nginx_status {
                        stub_status on;
 						access_log off;
                        allow 127.0.0.1;
                		deny all;
        }

        # location ~ \.php$ {
                       #root          /data/www;
                       #fastcgi_pass   127.0.0.1:9000;
                       #fastcgi_index  index.php;
                       #fastcgi_param SCRIPT_FILENAME  /data/www$fastcgi_script_name;
                       #include        fastcgi.conf;
        }


        error_page   500 502 503 504  /50x.html;

        location = /50x.html {
                    root   html;
        }

        }
access_log /data/log/nginx/access.log;
error_log /data/log/nginx/error_log ;

}
[root@web01 ~]# nginx -t #测试配置文件是否正确
[root@web01 ~]# systemctl start nginx #启动nginx服务
[root@web01 ~]# systemctl enable nginx #设置服务开机自启
[root@web01 ~]# systemctl status nginx #查看服务状态
方案二:源码包安装

1、准备好nginx-1.16.1源码包

[root@web01 ~]# ls .
nginx-1.16.1.tar.gz

2、解压源码包

[root@web01 ~]# tar -xvf nginx-1.16.1.tar.gz 
[root@web01 ~]# ls ~
nginx-1.16.1  nginx-1.16.1.tar.gz

3、编译安装nginx

​ ①安装gcc、make、pcre-devel、openssl-devel等编译工具和依赖包

[root@web02 ~]# yum -y install gcc make pcre-devel openssl-devel

​ ②nginx编译安装

[root@web02 nginx-1.16.1]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module #可以根据需求安装相应模块
[root@web02 nginx-1.16.1]# make && make install  #编译安装
[root@web02 ~]# ln -s /usr/local/nginx/sbin/nginx /sbin/nginx #建立nginx命令软链接

​ ③规划分区(同yum安装步骤④)

​ ④建立文件目录和修改配置文件(同yum安装步骤⑤)

[root@web02 ~]# nginx -t #检查配置文件是否配置正确
[root@web02 ~]# nginx #启动nginx
[root@web02 ~]# echo '/usr/local/nginx/sbin/nginx' >> /etc/rc.local #设置nginx服务开机自启 

​ # 源码安装的nginx的主配置文件一般在指定–prefix后跟的目录,例如上文步骤②,主配置文件在/usr/local/nginx/conf/nginx.conf

4、nginx常用模块介绍

①查看nginx的模块

[root@web01 ~]# nginx -V #查看已安装nginx模块
[root@web02 ~]# cd nginx-1.16.1/ #进入源码包解压目录
[root@web02 nginx-1.16.1]# ./configure --help #查看nginx的所有模块

②常用模块介绍

Nginx模块名称 模块作用
ngx_http_access_module 四层基于IP的访问控制,可以通过匹配客户端源IP地址进行限制
ngx_http_auth_basic_module 状态页,使用basic机制进行用户认证,在编译安装nginx的时候需要添加编译参数–withhttp_stub_status_module,否则配置完成之后监测会是提示语法错误
ngx_http_stub_status_module 状态统计模块
ngx_http_gzip_module 文件的压缩功能
ngx_http_gzip_static_module 静态压缩模块
ngx_http_ssl_module nginx 的https 功能
ngx_http_rewrite_module 重定向模块,解析和处理rewrite请求
ngx_http_referer_module 防盗链功能,基于访问安全考虑
ngx_http_proxy_module 将客户端的请求以http协议转发至指定服务器进行处理
ngx_stream_proxy_module tcp负载,将客户端的请求以tcp协议转发至指定服务器处理
ngx_http_fastcgi_module 将客户端对php的请求以fastcgi协议转发至指定服务器助理
ngx_http_uwsgi_module 将客户端对Python的请求以uwsgi协议转发至指定服务器处理
ngx_http_headers_module 可以实现对头部报文添加指定的key与值
ngx_http_upstream_module 负载均衡模块,提供服务器分组转发、权重分配、状态监测、调度算法等高级功能
ngx_stream_upstream_module 后端服务器分组转发、权重分配、状态监测、调度算法等高级功能
ngx_http_fastcgi_module 实现通过fastcgi协议将指定的客户端请求转发至php-fpm处理
ngx_http_flv_module 为flv伪流媒体服务端提供支持

官方文档里的内容最全:包括说明、指令、作用域等等。

官方文档 http://nginx.org/en/docs
中文文档 http://tengine.taobao.org/nginx_docs/cn/docs/

三、nginx增加模块和平滑升级

1、nginx增加新模块,这里以"–with-http_ssl_module"为例)

​ ①检查nginx版本

[root@web02 ~]# nginx -V #查看nginx服务版本以及已安装模块
nginx version: nginx/1.16.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) 
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module  

​ ②下载版本对应软件包

[root@web02 ~]# wget http://nginx.org/download/nginx-1.16.1.tar.gz -O /opt/nginx-1.16.1.tar.gz  #下载相应软件包
[root@web02 ~]# tar -xf /opt/nginx-1.16.1.tar.gz -C /opt/

​ ③编译安装

[root@web02 ~]# cd /opt/nginx-1.16.1/
[root@web02 nginx-1.16.1]# ./configure --prefix=/usr/local/nginx  --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module #添上增加模块
[root@web02 nginx-1.16.1]# make #编译

​ ④复制二进制文件

[root@web02 nginx-1.16.1]# mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old #备份已安装nginx二进制文件
[root@web02 nginx-1.16.1]# cp objs/nginx /usr/local/nginx/sbin/nginx #将objs里的nginx二进制文件复制到安装目录

​ ⑤检查模块是否成功安装

[root@web02 nginx-1.16.1]# /usr/local/nginx/sbin/nginx -V #查看nginx服务版本查看是否增加了新模块
nginx version: nginx/1.16.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) 
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments:--prefix=/usr/local/nginx  --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module
[root@web02 nginx-1.16.1]# rm -rf /usr/local/nginx/sbin/nginx.bak #删除备份二进制文件

2、平滑升级,这里以升到 nginx-1.17.10为例

​ ①下载新版本软件包

[root@web02 nginx-1.16.1]# nginx -V #查看nginx服务版本
nginx version: nginx/1.16.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) 
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments:--prefix=/usr/local/nginx  --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module
[root@web02 ~]# wget http://nginx.org/download/nginx-1.17.10.tar.gz

​ ②编译新版本nginx,安装路径需与旧版一致,注意:不要执行make install

[root@web02 ~]# tar -xf nginx-1.17.10.tar.gz
[root@web02 ~]# cd nginx-1.17.10
[root@web02 nginx-1.17.10]# ./configure  --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module
[root@web02 nginx-1.17.10]# make

​ ③备份二进制文件,用新版本的替换

[root@web02 nginx-1.17.10]# mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
[root@web02 nginx-1.17.10]# cp objs/nginx /usr/local/nginx/sbin/nginx
[root@web02 nginx-1.17.10]# /usr/local/nginx/sbin/nginx -t #测试配置文件没问题

​ ④发送USR2信号

[root@web02 nginx-1.17.10]# ps aux|grep nginx #查看nginx进程号
root       675  0.0  0.0  20564   664 ?        Ss   10:04   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx      678  0.0  1.9  47700 27872 ?        S    10:04   0:00 nginx: worker process
nginx      679  0.0  1.9  47700 28124 ?        S    10:04   0:00 nginx: worker process
root      8755  0.0  0.0 112824   980 pts/0    S+   11:15   0:00 grep --color=auto nginx
[root@web02 nginx-1.17.10]# kill -USR2 675 向主进程(master)发送USR2信号
[root@web02 nginx-1.17.10]# ps aux|grep nginx #Nginx会启动一个新版本的master进程和对应工作进程,和旧版一起处理请求
root       675  0.0  0.0  20564   824 ?        Ss   10:04   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx      678  0.0  1.9  47700 27872 ?        S    10:04   0:00 nginx: worker process
nginx      679  0.0  1.9  47700 28124 ?        S    10:04   0:00 nginx: worker process
root      8756  0.0  0.2  45976  3412 ?        S    11:15   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx     8757  3.8  1.9  72600 28168 ?        S    11:15   0:00 nginx: worker process
nginx     8758  3.8  1.9  72600 28168 ?        S    11:15   0:00 nginx: worker process
root      8760  0.0  0.0 112824   980 pts/0    S+   11:16   0:00 grep --color=auto nginx

​ ⑤发送WINCH信号

[root@web02 nginx-1.17.10]# kill -WINCH 675 #向旧的Nginx主进程(master)发送WINCH信号
[root@web02 nginx-1.17.10]# ps aux|grep nginx #逐步关闭旧的工作进程(主进程不退出),这时所有请求都会由新版Nginx处理
root      8756  0.0  0.2  45976  3412 ?        S    11:15   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx     8757  0.1  1.9  72600 28168 ?        S    11:15   0:00 nginx: worker process
nginx     8758  0.1  1.9  72600 28168 ?        S    11:15   0:00 nginx: worker process
root      8765  0.0  0.0 112824   980 pts/0    S+   11:18   0:00 grep --color=auto nginx

四、nginx做web服务器的相关配置文件

1、主配置文件nginx.conf

[root@web01 ~]# vim /etc/nginx/nginx.conf
user nginx nginx;
worker_processes  2;  # nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 (2个双核的cpu为4)。
worker_cpu_affinity 01 10;  # 为每个进程分配cpu,

events {
        worker_connections  65533;   # 每个进程允许的最多连接数,理论上每台nginx 服务器的最大连接数为worker_processes*worker_connections
        use epoll;  # 使用epoll 的I/O 模型
        accept_mutex on; #优化同一时刻只有一个请求而避免多个睡眠进程被唤醒的设置,on为防止被同时唤醒,默认为off,因此nginx刚安装完以后要进行适当的优化。

}

http {
    include       mime.types;
    default_type  application/octet-stream;

    server_names_hash_bucket_size 64;  # 配置多个虚拟主机时必须添加
    client_header_buffer_size 32k;   #  如果你的请求中的header都很大,那么应该使用	 	 	client_header_buffer_size,这样能减少一次内存分配。
    large_client_header_buffers 4 32k;  # 如果你的请求中只有少量请求header很大,那么应该使用large_client_header_buffers,可以减少无谓的内存空间浪费。
    client_max_body_size   20m;  # 控制全局nginx所有请求报文大小

    sendfile        on;
    keepalive_timeout  60;
    server_tokens off; # 隐藏版本号
    
	fastcgi_connect_timeout 300; #指定连接到后端FastCGI的超时时间
    fastcgi_send_timeout 300; # 指定向FastCGI传送请求的超时时间,这个值是已经完成两次握手后向FastCGI传送请求的超时时间 
    fastcgi_read_timeout 300; # 指定接收FastCGI应答的超时时间,这个值是已经完成两次握手后接收FastCGI应答的超时时间
    fastcgi_buffer_size 64k;# 用于指定读取FastCGI应答第一部分需要用多大的缓冲区
    fastcgi_buffers 4 64k; # 指定本地需要用多少和多大的缓冲区来缓冲FastCGI的应答请求 当PHP文件大于缓冲区的大小时会写入fastcgi_temp指定的路径中
    fastcgi_busy_buffers_size 128k; # 默认值fastcgi_buffers的两倍
    fastcgi_temp_file_write_size 256k; # 默认值fastcgi_buffers的两倍

    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]\.";
    log_format  access  '$remote_addr - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for" '
                        'upstream_response_time $upstream_response_time request_time $request_time';
#log_format                     是日志格式设置,main是通用格式设置
#$remote_addr                   访问IP
#$remote_user                   客服端用户名
#$time_local                    访问时区和时间
#$request                       客户端发起的请求
#$status                        HTTP请求状态            例如:200\404\503 ...
#$body_bytes_sent               发送到客户端文件大小的请求
#$http_referer                  URL跳转来源
#$http_user_agent               客户终端浏览器信息
#$http_x_forwarded_for          请求地址列表第一个IP地址(即客户端的真实地址)
#$request_time                  客户端请求时间
access_log off;
    include vhost/*.conf;

	
    server {
        listen       80 ;#backlog = 8192;
        server_name  www.test.com;

        #client_max_body_size   20m;  # 控制该serverd请求报文大小
        location / {
            root   /data/www;
            index  index.php index.html index.htm;
            #client_max_body_size   20m;  #控制满足该路由规则的请求报文大小
        }

        location /nginx_status {
                        stub_status on;
 						access_log off;
                        allow 127.0.0.1;
                		deny all;
        }

        location ~ \.php$ {
                        root          /data/www;
                        fastcgi_pass   127.0.0.1:9000;
                        fastcgi_index  index.php;
                        fastcgi_param SCRIPT_FILENAME  /data/www$fastcgi_script_name;
                        include        fastcgi.conf;
        }


        error_page   500 502 503 504  /50x.html;

        location = /50x.html {
                    root   html;
        }

        }
access_log /data/log/nginx/access.log;
error_log /data/log/nginx/error_log ;

}

五、nginx做代理服务器的配置文件

1、配置文件nginx.conf

user nginx nginx;
worker_processes  2;  # nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 (2个双核的cpu为4)。
worker_cpu_affinity 01 10;  # 为每个进程分配cpu,
worker_rlimit_nofile 204800; #  更改worker进程的最大打开文件数限制。如果没设置的话,这个值为操作系统的限制。设置后你的操作系统和Nginx可以处理比“ulimit -a”更多的文件,所以把这个值设高,这样nginx就不会有“too many open files”问题


events {
        worker_connections  204800;   # 每个进程允许的最多连接数,理论上每台nginx 服务器的最大连接数为worker_processes*worker_connections
        use epoll;  # 使用epoll 的I/O 模型
        accept_mutex on; #优化同一时刻只有一个请求而避免多个睡眠进程被唤醒的设置,on为防止被同时唤醒,默认为off,因此nginx刚安装完以后要进行适当的优化。

}
http {
    client_max_body_size 50m; #client_header_buffer_size 申请请求头缓冲区大小large_client_header_buffers  对于大型客户端请求头的缓冲区个数和大小client_max_body_size   NGINX能处理的最大请求主体大小
    sendfile            on; #sendfile 设置为on表示启动高效传输文件的模式,如果这个参数不开启,会先在用户空间(Nginx进程空间)申请一个buffer,用read函数把数据从磁盘读到cache,再从cache读取到用户空间的buffer,再用write函数把数据从用户空间的buffer写入到内核的buffer,最后到

    keepalive_timeout   60; #定义客户端连接超时时间(建议对不同应用进行不同配置)
    types_hash_max_size 2048;
    proxy_send_timeout 300; # 指定设置了发送请求给upstream服务器的超时时间
    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
    include /etc/nginx/conf.d/*.conf;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" $request_time ';
}
#log_format                     是日志格式设置,main是通用格式设置
#$remote_addr                   访问IP
#$remote_user                   客服端用户名
#$time_local                    访问时区和时间
#$request                       客户端发起的请求
#$status                        HTTP请求状态            例如:200\404\503 ...
#$body_bytes_sent               发送到客户端文件大小的请求
#$http_referer                  URL跳转来源
#$http_user_agent               客户终端浏览器信息
#$http_x_forwarded_for          请求地址列表第一个IP地址(即客户端的真实地址)
#$request_time                  客户端请求时间

upstream www.test.com {
    server 192.168.11.1:80;
    server 192.168.11.2:80;
    }
# upstream 配置上游(转发)服务器,可以配置多个服务器地址,每行一个,可以配置权重重新定义或者添加发往后端服务器的请求头,不配置权重的情况下按哈希转发。

server {
    listen      80 default_server; #backlog = 8192;  
    server_name www.test.com;
    tcp_nodelay         on;

    location / {
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,token';
       # add_header  在response中添加自定义头,格式 key value;Access-Control-Allow...添加跨域访问
        proxy_pass http://www.test.com;
        proxy_redirect off;               #对发送给客户端的URL进行修改,设置为off,不使用这个功能
        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_set_header Cookie            $http_cookie;
    }

    location /nginx_status
    {
 	    stub_status on;
        access_log   off;
        allow 127.0.0.1;
        deny all;
    }
   access_log  /var/log/nginx/www.test.com_access.log  main;
   error_log  /var/log/nginx/www.test.com_error.log;
   }
}

你可能感兴趣的:(安装部署维护升级)