Linux:CentOS 7
Nginx:1.16.1
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/
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
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 ;
}
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;
}
}