记录Nginx的各种使用配置
Nginx环境的搭建
Nginx有两个网站,一个是nginx.com
另一个是nginx.org
,org是免费开源的Nginx
。
首先要下载Nginx
,在Linux
上执行下面命令即可进行下载
wget http://nginx.org/download/nginx-1.16.1.tar.gz
安装前的准备
在安装前需要先确定Linux上是否有gcc
、openssl
、pcre
、zlib
库
执行下面的命令即可安装上面列出的库
yum list installed | grep gcc # 检查GCC是否已经安装
yum install gcc -y # 执行安装
yum list installed | grep openssl # 检查OpenSSL是否已经安装
yum install openssl openssl-devel -y # 安装OpenSSL
yum list installed | grep pcre # 检查是否已经安装pcre
yum install pcre pcre-devel -y # 安装PCRE
yum list installed | grep zlib # 检查是否已经安装了zlib
yum install zlib zlib-devel -y # 安装zlib
如果已经确定了没有安装过这些库,或者想对这些库进行更新,可以执行下面的命令一次性全部安装:
yum install gcc openssl openssl-devel pcre pcre-devel zlib zlib-devel -y
开始安装
- 解压下载的
nginx
文件
tar -zxvf nginx-1.16.1.tar.gz -C /usr/local/software
- 切换至
nginx
解压后的目录
cd /usr/local/software/nginx-1.16.1
- 在
nginx
解压后的目录中执行
./configure --prefix=/usr/local/nginx
其中prefix
为安装的目录
- 执行命令进行编译
make
- 执行命令进行安装
make install
- 查看安装目录中的目录结构
drwxr-xr-x. 2 root root 4096 9月 17 17:43 conf
drwxr-xr-x. 2 root root 40 9月 17 17:43 html
drwxr-xr-x. 2 root root 6 9月 17 17:43 logs
drwxr-xr-x. 2 root root 19 9月 17 17:43 sbin
安装成功后Nginx只有四个目录,目录的作用如下:
conf
:Nginx
的主要配置目录,其中nginx.conf
文件是nginx
的默认主要配置文件
html
: Nginx
的默认静态目录,里面有两个文件index.html
和50x.html
logs
: Nginx
的默认日志目录
sbin
: Nginx
程序的二进制启动程序目录
启动Nginx
普通方式启动,直接使用下面的命令可以启动Nginx
./nginx
通过配置文件启动,根据配置文件中的配置启动Nginx
# 当前目录
./nginx -c /usr/local/nginx/conf/nginx.conf
# 全路径
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
启动后查看nginx
进程
ps -ef | grep nginx
查看结果:
root 15641 1 0 20:49 ? 00:00:00 nginx: master process ./nginx
nobody 15643 15641 0 20:49 ? 00:00:00 nginx: worker process
可以看到nginx
包含了两个进程,master
和worker
进程
master
用来加在配置文件和维护worker
进程
worker
进程用来真正处理用户的请求,注意上面的worker进程使用的是nobody用户
nginx的关闭
方式:
# 优雅的关闭
kill -QUIT master进程的pid
# 快速的关闭
kill -TERM master进程的pid
# 重新加在配置文件(重启)
./nginx -s reload
# 优雅的关闭2
./nginx -s quit
# 快速的关闭2
./nginx -s stop
# 重新打开配置文件
./nginx -s reopen
注意在进行-s
操作的时候默认会操作logs
文件夹中nginx.pid
中记录的那个进程
nginx的其他常用操作
检查修改后的nginx
配置文件的语法是否正确,只需要在上面的命令后面加入-t
即可
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf -t
屏幕上提示下面文字表示检查正常
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
查看nginx
的版本
nginx -v 或 nginx -V
小写的v
可以查看nginx
的版本
nginx version: nginx/1.16.1
大写的V
可以查看nginx
版本和编译使用的gcc
的版本和gcc
的配置参数
nginx version: nginx/1.16.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
configure arguments: --prefix=/usr/local/nginx
Windows下使用nginx
解压压缩包即可使用,解压目录中有一个nginx.exe
文件
启动方式“双击exe文件”或者下面命令
start nginx
关闭方式可以直接在任务管理器中杀死进程,或者使用下面的方式
nginx -s stop
Nginx的配置文件(nginx.conf)
nginx
的配置文件主要由三个部分组成:
基本配置
#user nobody; # 配置worker进程运行用户,默认使用nobody用户
worker_processes 1; # 配置工作进程数目,根据硬件调整,通常等于CPU数量或者2倍于CPU数量
# 配置全局错误日志及类型,【debug | info | notice | warn |error |crit】
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid; # 配置进程pid文件
events配置
# 配置工作模式和连接数
events {
# use epoll; # 优化参数
# 配置每个worker进程连接数上限
# nginx支持的总连接数等于 worker_processes * worker_connections
worker_connections 1024;
}
http配置
# 配置http服务器,利用它的反向代理功能提供负载均衡支持
http {
# 配置nginx支持哪些多媒体类型,可以在conf/mime.types查看支持哪些多媒体类型
include mime.types;
# 默认文件类型,application/octet-stream基本支持所有的文件
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日志及存放路径,并使用上面定义的main日志格式
#access_log logs/access.log main;
sendfile on; # 开启高效文件传输模式
#tcp_nopush on; # 防止网络阻塞
#keepalive_timeout 0;
# 长连接超时时间,单位是秒
keepalive_timeout 65;
# 开启gzip压缩输出
#gzip on;
# 配置虚拟主机
server {
# 配置监听端口
listen 80;
# 配置服务名
server_name localhost;
# 配置字符集
#charset koi8-r;
# 配置本虚拟主机的访问日志
#access_log logs/host.access.log main;
# 默认的斜杠/(比如说www.m.com)的请求,当访问路径中有斜杠/,会被该location匹配到并进行处理
location / {
# root是配置服务器的默认网站根目录位置,默认为nginx安装目录下的html目录
root html;
# 配置首页文件的名称
index index.html index.htm;
}
# 配置404页面
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html; # 配置50x错误页面
location = /50x.html {
root html;
}
# PHP脚本请求全部转发到Apache处理
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# PHP脚本请求全部转发到FastCGI处理
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# 禁止访问 .htaccess 文件
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# 配置另一个虚拟主机
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# 配置HTTPS服务
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
Nginx的主要应用
静态网站(常用)
Nginx
可以将静态资源直接通过Http
协议返回给浏览器客户端
server {
listen 80; # 端口号
location / {
root /opt/html/; # 静态文件路径
index index.html index.htm;
}
}
负载均衡(重要)
实现目标,浏览器输入一个网址,每次访问这个网址,nginx
都要自动分配要访问哪个服务器
upstream www.m.com {
server 127.0.0.1:81 weight=2;
server 127.0.0.1:82 weight=1;
}
其中weight=1
表示权重,用于后端服务器性能不均的情况,访问比率约等于权重之比,权重值越大访问机会越多
upstream
指令要写在http
模块中,更多关于upstream
的信息查看,注意,upstream
指令中的server
属性后面的值不能为无权限访问的IP
或域名
,比如说baidu.com
upstream是配置nginx于后端服务器负载均衡的一个非常重要的模块,并且他还能对后端的服务器的健康状态进行检查,若后端服务器中的一台发生故障,则前端的请求不会转发到该故障的机器
location /me/ {
proxy_pass http://www.m.com/;
}
其中www.m.com
字符串要和upstream
指令后面的字符串相等。
更多介绍:
B站UP主:free-coder
他的视频力求用最简单的语言,最短的时间把一个技术的灵魂介绍给大家
负载均衡的策略
轮询
(默认): 默认配置就是轮询策略,每个请求轮流分配到不同的后端服务器,如果后端服务器宕机,将会自动剔除该服务器
权重
:上面用到的策略就是权重策略
ip_hash
:也叫作IP绑定,每个请求按访问IP
的hash
值分配,这样每个访问客户端会固定访问一个后端服务器,可以解决回话Session丢失的问题
upstream www.m.com {
ip_hash;
server 127.0.0.1:81;
server 127.0.0.1:82;
}
最少连接
:web
请求会转发到连接数最少的服务器
upstream www.m.com {
least_conn;
server 127.0.0.1:81;
server 127.0.0.1:82;
}
负载均衡的其他配置
backup
upstream www.m.com {
server 127.0.0.1:81;
# backup 其他所有的非backup的机器都宕机的时候,才请求backup机器
server 127.0.0.1:82 backup;
}
down
upstream www.m.com {
server 127.0.0.1:81;
# down 表示当前的server是down状态,不参与负载均衡
server 127.0.0.1:82 down;
}
backup
的用途
可以做不用停运全部服务器的部署,分批次的上线更新后的项目
比如说有5台服务器都搭载了老项目,这个时候想要进行项目的更新,可以给1,2,3台服务器设置为backup,这个时候访问的时候不会访问1,2,3服务器,可以将1,2,3服务器更新之后把1,2,3的backup去掉,然后设置4,5为backup,最后全部更新之后将backup全部去掉,这样就做到了分批次的更新项目。
静态代理
所有的静态资源使用nginx
处理,不使用tomcat
处理
方式1:
location ~.*\.(js|css|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ {
root /opt/static;
}
其中:
~表示正则匹配,也就是说后面的内容可以是正则表达式匹配
第一个点. :(正则)表示任意字符
* 表示一个或多个字符
\. 转义字符
| 或者
$ 结尾
上面代码中规定了静态资源的后缀,当前台访问这些后缀的时候都会自动由nginx处理,注意目录的权限问题,权限不足的话会导致403错误,可以使用
chmod 755
来进行修改
方式2:
location ~.*/(css|js|img|images) {
root /opt/static;
}
上面可以匹配:
xxx/css | xxx/js | xxx/img | xxx/images
动静分离
将负载均衡和静态代理结合在一起实现动静分离
一台nginx做负载均衡,后面有两台nginx做静态代理,两台Tomcat做动态服务器
注意:Nginx可以指定配置文件启动,意味着可以使用不同的配置文件启动多个Nginx,而不用安装多个Nginx
静态资源负载均衡配置
upstream static.m.com {
server 127.0.0.1:81;
server 127.0.0.1:82;
}
静态资源转发配置
location ~.*/(css|js|img|images) {
proxy_pass http://static.m.com;
}
虚拟主机(重点)
实现: blogs.m.com
, notes.m.com
分别转发到同一台服务器上的不同端口中...
如果有多台服务器,上面的需求非常好实现,只需要在域名解析中配置一下就可以了,但是如果只有一台服务器,需要实现上面的功能,Nginx就可以派上用场了
如果想要实现上面的功能只需要在配置文件中配置多个server
节点就可以了
虚拟主机可以通过端口来区分
例如:
server {
listen 80;
...
}
server {
listen 81;
...
}
虚拟主机可以通过域名来区分(重点)
例如:
upstream
配置
upstream blogs {
server 127.0.0.1:81;
}
upstream notes {
server 127.0.0.1:82;
}
server
配置
server {
listen 80;
server_name blogs.m.com;
location / {
proxy_pass http://blogs;
}
}
server {
listen 80;
server_name notes.m.com;
location / {
proxy_pass http://notes;
}
}
注意配置hosts
文件
127.0.0.1 blogs.m.com
127.0.0.1 notes.m.com
还可以使用include
来引入虚拟主机配置
比如说现在有一个文件/usr/local/nginx/vhost/vhost.conf
配置了虚拟主机,配置文件里面写了两个server
将上面虚拟主机的配置文件加入到http{}
部分的结尾,与其他server并列,这样就可以导入外部的配置
与 include mime.types
类似
include /usr/local/nginx/vhost/vhost.conf