一文搞清让人头疼的Nginx,值得收藏!
Nginx安装
版本:nginx-1.14.2
▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼
好久没更新文章了,项目得事情太多,总得给自己的懒惰找个借口,哈哈~
话不多说进入正题
Linux前置准备
检查是否安装相关库:gcc openssl openssl-devel pcre pcre-devel zlib zlib-devel
执行命令:yum install gcc openssl openssl-devel pcre pcre-devel zlib zlib-devel -y
正式安装Nginx
□ 解压下载下来的Nginx安装包,执行命令:tar -zxvf nginx-1.14.2.tar.gz
□ 进入到解压后的目录,执行命令:cd nginx-1.14.2
□ 在nginx主目录下执行命令:./configure --prefix=/usr/local/nginx
其中--prefix为指定nginx安装的位置
□ 执行命令进行编译:make
□ 执行命令进行安装:make install
启动Nginx
进入到nginx安装目录,执行命令:
[alisca@spark02 nginx-1.14.2]$ sbin/nginx -c conf/nginx.conf
有两个进程,一个master,一个worker
-----------------------------------------------------------------------------------------------------
root 23849 1 0 00:02 ? 00:00:00 nginx: master process sbin/nginx -c conf/nginx.conf
nobody 23850 23849 0 00:02 ? 00:00:00 nginx: worker process
-----------------------------------------------------------------------------------------------------
注意:以非root用户启动会出错:nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)
原因是非root用户不能使用1024以下的端口,改用root用户启动解决
执行命令:
[alisca@spark02 nginx-1.14.2]$ sudo sbin/nginx -c conf/nginx.conf
停止Nginx
执行命令:
[alisca@spark02 nginx-1.14.2]$ sudo sbin/nginx -s stop
或者jps找到nginx的进程号pid,执行命令:
[alisca@spark02 nginx-1.14.2]$ kill -9 pid(nginx进程号,有两个,master、worker)
或者
[alisca@spark02 nginx-1.14.2]$ kill -QUIT pid(nginx主进程号) #优雅关闭,处理完请求后关闭
或者
[alisca@spark02 nginx-1.14.2]$ kill -TERM pid(nginx主进程号) #强制关闭,直接关闭,同kill -9 命令
重启Nginx
执行命令:
[alisca@spark02 nginx-1.14.2]$ sudo sbin/nginx -s reload
配置检查
进入到nginx安装目录,执行命令:
[alisca@spark02 nginx-1.14.2]$ sbin/nginx -c conf/nginx.conf -t
#-t: 对配置文件进行语法检查 test的意思,有错误会提示错误行号
其他参数
进入到nginx安装目录,执行命令:
[alisca@spark02 nginx-1.14.2]$ sbin/nginx -v
nginx version: nginx/1.14.2
[alisca@spark02 nginx-1.14.2]$ sbin/nginx -V
nginx version: nginx/1.14.2
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
configure arguments: --prefix=/home/alisca/cluster/nginx-1.14.2
#-v:显示版本信息 -V:显示版本信息、编译器版本、配置参数
▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼
Windows下安装nginx
下载安装包解压就完事了
□ 将下载的nginx压缩包解压到指定目录
□ 启动方式1:双击解压目录下的nginx.exe文件即可运行nginx
□ 启动方式2:进入dos窗口,切换到nginx主目录下,在dos窗口执行命令:start nginx
=================================================================
□ 关闭方式1:在资源管理器杀掉nginx进程(注意有两个进程)
□ 关闭方式2:在dos窗口切换到nginx安装目录下执行命令:nginx -s stop
nignx配置文件中文解析
#总体上分成三个部分构成:基本配置、events配置、HTTP配置,以下为配置详情
#------------------------基本配置-------------------------
#user nobody; #配置worker进程运行用户
worker_processes 1; #配置工作进程数目,根据硬件调整,通常等于CPU数量或者2倍于CPU数量
#error_log logs/error.log; #配置全局错误日志及类型,[debug | info | notice | warn | error | crit],默认是error
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid; #配置进程pid文件
#------------------------events配置-------------------------
#配置工作模式和连接数
events {
worker_connections 1024; #配置每个worker进程连接数上限,nginx支持的总连接数就等于worker_processes * worker_connections
}
#------------------------HTTP配置-------------------------
#配置HTTP服务器,利用它的反向代理功能提供负载均衡支持
http {
#------------------------HTTP基本配置-------------------------
include mime.types; #配置nginx支持哪些多媒体类型,可以在conf/mime.types查看支持哪些多媒体类型
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 on; #开启gzip压缩输出
#------------------------HTTP_多server配置-------------------------
server {
listen 80; #监听端口
server_name localhost; #配置服务名
#charset utf-8; #配置字符集
#access_log logs/host.access.log main; #配置本虚拟主机的访问日志
#默认的斜杠/的请求,当访问路径中有斜杠/,会被该location匹配到并进行处理
location / {
root html; #root是配置服务器默认网站根目录位置,默认nginx安装主目录下的html
index index.html index.htm; #配置首页文件的名称
}
#error_page 404 /404.html; #配置404错误页
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html; 配置50x错误页面
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# 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;
#}
# 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 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主要应用场景
静态网站
修改配置文件:
server {
listen 80; #监听端口
server_name localhost; #配置服务名
#charset utf-8; #配置字符集
#access_log logs/host.access.log main; #配置本虚拟主机的访问日志
#默认的斜杠/的请求,当访问路径中有斜杠/,会被该location匹配到并进行处理
location / {
root static_path; #配置静态网页根目录位置,默认nginx安装主目录下的html
index index.html index.htm; #配置首页文件的名称
}
}
负载均衡
访问入口只有一个,针对不同的请求分发到相应的服务器上去做处理
F5/深信服/Array等,缺点是费用昂贵,对于规模较小的网络应用成本太高 :
nginx/LVS/HAProxy等,有点免费开源,成本低廉 :
实现方式:
用户-->nginx负载均衡-->{Tomcat1,Tomcat2}访问动态资源
文件进行配置
在http模块上添加:
upstream www.myweb.com {
server 127.0.0.1:9100 weight=3;
server 127.0.0.1:9200 weight=1;
}
#其中weight表示权重,用于后端服务器性能不均的情况,访问比率约等于权重之比,权重越大访问机会越大
#upstream是配置nginx于后端服务器负载均衡非常重要的一个模块,并且它还能对后端的服务器的健康状态进行检查,若后端服务器中的一台发生故障,则前端的请求不会转发到该故障的机器
(2)在server模块里添加
location /myweb {
proxy_pass http://www.myweb.com
}
#其中www.myweb.com字符串要和upstream后面的字符串相等
(3)负载均衡策略:
轮询(默认):在server后不添加weight参数
在http模块上添加:
upstream www.myweb.com {
server 127.0.0.1:9100;
server 127.0.0.1:9200;
}
权重:在server后添加weight参数,访问几率和weight比接近
在http模块上添加:
upstream www.myweb.com {
server 127.0.0.1:9100 weight=3;
server 127.0.0.1:9200 weight=1;
}
ip_hash:也叫IP绑定,每个请求访问IP的hash值分配,这样每个访问客户端会固定访问一个后端服务器,可以解决会话Session丢失问题
在http模块上添加:
upstream www.myweb.com {
ip_hash;
server 127.0.0.1:9100 weight=3;
server 127.0.0.1:9200 weight=1;
}
最少连接:web请求会被转发到最少连接数的服务器上
upstream www.myweb.com {
least_conn;
server 127.0.0.1:9100 weight=3;
server 127.0.0.1:9200 weight=1;
}
(4)负载均衡其他配置
upstream www.myweb.com {
server 127.0.0.1:9100;
server 127.0.0.1:9200 backup; #其他所有的非backup机器down的时候,才请求backup机器
}
upstream www.myweb.com {
server 127.0.0.1:9100;
server 127.0.0.1:9200 down; #down表示当前的server是down状态,不参与负载均衡
}
静态代理
通过在nginx的nginx.conf文件进行配置
方式一:匹配文件
#当访问静态资源,则从Linux服务器/opt/static目录下获取(举例)
location ~ .*\.(js|css|html|gif|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ {
root /opt/static;
}
#其中:~表示正则匹配,也就是说后面的内容可以是正则表达式匹配
# 第一个点.表示任意字符
# *表示一个或多个字符
# \是转义字符,是后面点的转义字符标志
# |表示或者
# $表示结尾
#整个配置表示以.后面括号里面的这些为后缀结尾的文件都有nginx处理;
#注意:放置静态资源的目录,需要有足够的权限,权限不足会报403错误,建议:chmod 755
方式二:匹配目录
location ~ .*/(css|js|img|images) {
root /opt/static
}
动静分离
|-->{tomcat1,tomcat2}动态资源
用户-->nginx负载均衡--> |
|-->{nginx1,nginx2}静态资源
nginx在一台Linux上安装一份,可以启动多个nginx,每个nginx的配置文件不一样即可
分类别(动态资源,静态资源)多配置
虚拟主机
虚拟主机就是把一台服务器划分成多个“虚拟”的服务器,这样我们的一台物理服务器就可以当做多个服务器来使用,从而可以配置多个网站
nginx提供虚拟主机的功能,就是为了让我们不需要安装多个nginx,就可以运行多个网站
nginx下,一个server标签就是一个虚拟主机
nginx的虚拟主机就是通过nginx.conf中server节点指定的,想要配置多个虚拟主机,配置多个server节点即可
配置虚拟主机通常有一下两种方式:
(1)基于域名的虚拟主机
server{
listen 80;
server_name www.wang.com;
location /wang {
proxy_pass http://www.wang.com; #还应该配置名称为www.wang.com的负载均衡
}
}
server{
listen 80;
server_name www.bin.com;
location /bin {
proxy_pass http://www.bin.com; #还应该配置名称为www.bin.com的负载均衡
}
}
(2)通过include的方式引入虚拟主机配置
include /usr/local/nginx/vhost/vhost.conf;
将虚拟目录的配置文件加入到“http{}”部分的末尾,与其他server并列;
其中vhost.conf中的内容同基于域名的虚拟主机的server配置
vhost.conf_path 即可
写在最后的话
生活不会向你许诺什么,尤其不会向你许诺成功。它只会给你挣扎、痛苦和煎熬的过程。所以要给自己一个梦想,之后朝着那个方向前进。如果没有梦想,生命也就毫无意义。——摩根·弗里曼
我今天才知道,我之所以漂泊就是在向你靠近。
--《廊桥遗梦》