了解nginx
参考文档:http://www.nginx.cn/doc/
nginx是一款高性能的HTTP和反向代理服务器软件,也是一个IMAP/POP3/SMTP代理服务器,可以运行在Unix, GNU/Linux,BSD,MacOS x,以及Windows等操作系统中。
Nginx与Apache的异同
相同点:
都是一个HTTP服务器软件。支持正、反向代理,虚拟主机,url重写,压缩传输,SSL加密传输等。
不同点:
Apache处理速度很慢,且占用很多内存资源,而Nginx却恰恰相反。
nginx安装
下载地址:http://nginx.org/en/download.html
centos6 nginx 安装
https://www.cnblogs.com/yaoximing/p/6068622.html
Mac nginx 安装
参考地址:https://www.cnblogs.com/meng1314-shuai/p/8335140.html
步骤:
1、查询要安装的软件是否存在
brew search nginx
2、查看nginx是否安装
brew info nginx
显示本地已安装nginx,版本1.15.3,未安装执行第三步。
3、安装nginx
brew install nginx
4、查看nginx安装目录(是否如info所说)
open /usr/local/etc/nginx/
open /usr/local/Cellar/nginx //其实这个才是nginx被安装到的目录
5、启动nginx,终端输入如下命令:
nginx
没有报错即为启动成功。
6、打开浏览器访问localhost:8080, 如出现以下界面,说明安装成功
Nginx命令参数
nginx -t:测试配置文件是否正确
nginx -s reload, 作用:加载最新配置
nginx -s stop,作用:立即停止
nginx -s quit,作用:优雅停止 (当前存在访问,直到访问结束才停止)
nginx -s reopen,作用:重新打开日志
nginx 配置
在nginx.conf的注释符号位#
nginx文件结构:
1、全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
2、events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
4、server块:配置虚拟主机的相关参数,一个http中可以有多个server。
5、location块:配置请求的路由,以及各种页面的处理情况。
示例配置文件
########### 每个指令必须有分号结束。#################
#user administrator administrators; #配置使用用户或者组,默认为nobody nobody。
worker_processes 2; #允许生成的进程数,默认为1,CPU数量*核数,通常等于CPU数量或者2倍于CPU
#pid /nginx/pid/nginx.pid; #指定nginx进程运行文件存放地址
error_log log/error.log debug; #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
events {
accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on
multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off
#use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_connections 1024; #最大连接数,默认为512
}
http {
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型,默认为text/plain
#access_log off; #取消服务日志
log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
access_log log/access.log myFormat; #combined为日志格式的默认值
sendfile on; #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
sendfile_max_chunk 100k; #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。
#gzip on; #开启gzip压缩
#charset gb2321; #设置字符编码
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333 backup; #热备
}
error_page 404 https://www.baidu.com; #错误页
server {
keepalive_requests 120; #单连接请求上限次数。
listen 4545; #监听端口
server_name 127.0.0.1; #监听地址
location ~*^.+$ { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
#root path; #根目录
#index vv.txt; #设置默认页
proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
deny 127.0.0.1; #拒绝的ip
allow 172.18.5.54; #允许的ip
}
}
}
日志格式设置。
$remote_addr与$http_x_forwarded_for用以记录客户端的ip地址;
$remote_user:用来记录客户端用户名称;
$time_local: 用来记录访问时间与时区;
$request: 用来记录请求的url与http协议;
$status: 用来记录请求状态;成功是200,
$body_bytes_sent :记录发送给客户端文件主体内容大小;
$http_referer:用来记录从那个页面链接访问过来的;
$http_user_agent:记录客户浏览器的相关信息;
nginx之location配置
语法规则:location [=|~|~*|^~] /uri/ { … }
= 开头表示精确匹配
^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。
~开头表示区分大小写的正则匹配。
~*开头表示不区分大小写的正则匹配。
!~和!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则。
/ 通用匹配,任何请求都会匹配到。
多个location配置的情况下匹配顺序为:
首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。
location = / {
#规则A
}
location = /login {
#规则B
}
location ^~ /static/ {
#规则C
}
location ~ \.(gif|jpg|png|js|css)$ {
#规则D
}
location ~* \.png$ {
#规则E
}
location !~ \.xhtml$ {
#规则F
}
location !~* \.xhtml$ {
#规则G
}
location / {
#规则H
}
那么产生的效果如下:
访问根目录/, 比如http://localhost/ 将匹配规则A
访问 http://localhost/login 将匹配规则B,
http://localhost/register 则匹配规则H
访问 http://localhost/static/a.html 将匹配规则C
访问 http://localhost/a.gif, http://localhost/b.jpg 将匹配规则D和规则E,但是规则D顺序优先,规则E不起作用,而 http://localhost/static/c.png 则优先匹配到 规则C
访问 http://localhost/a.PNG 则匹配规则E, 而不会匹配规则D,因为规则E不区分大小写。
访问 http://localhost/a.xhtml 不会匹配规则F和规则G,http://localhost/a.XHTML不会匹配规则G,因为不区分大小写。规则F,规则G属于排除法,符合匹配规则但是不会匹配到,所以想想看实际应用中哪里会用到。
访问 http://localhost/category/id/1111 则最终匹配到规则H,因为以上规则都不匹配,这个时候应该是nginx转发请求给后端应用服务器,比如FastCGI(php),tomcat(jsp),nginx作为方向代理服务器存在。
location常见配置指令,alias、root、proxy_pass
1、【alias】——别名配置,用于访问文件系统,在匹配到location配置的URL路径后,指向【alias】配置的路径。如:
location /test/
{
alias/first/second/img/;
}
即:请求/test/1.jpg(省略了协议与域名),将会返回文件/first/second/img/1.jpg。
2、【root】——根路径配置,用于访问文件系统,在匹配到location配置的URL路径后,指向【root】配置的路径,并把location配置路径附加到其后。如:
location /test/
{
root /first/second/img/;
}
即:请求/test/1.jpg(省略了协议与域名),将会返回文件/first/second/img/test/1.jpg,相较于alias,使用root会把/test/附加到根目录之后。
3、【proxy_pass】——反向代理配置,用于代理请求,适用于前后端负载分离或多台机器、服务器负载分离的场景,在匹配到location配置的URL路径后,转发请求到【proxy_pass】配置的URL,是否会附加location配置路径与【proxy_pass】配置的路径后是否有"/"有关,有"/"则不附加,如:
location /test/
{
proxy_pass http://127.0.0.1:8080/;
}
即:请求/test/1.jpg(省略了协议与域名),将会被nginx转发请求到http://127.0.0.1:8080/1.jpg(未附加/test/路径)。
location /test/
{
proxy_pass http://127.0.0.1:8080;
}
即:请求/test/1.jpg(省略了协议与域名),将会被nginx转发请求到http://127.0.0.1:8080/test/1.jpg(附加/test/路径)。
location/test/
{
proxy_pass http://127.0.0.1:8080/img;
}
即:请求/test/1.jpg(省略了协议与域名),将会被nginx转发请求到http://127.0.0.1:8080/img1.jpg(未附加/test/路径,但附加了/test/之后的路径)。
解决nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed错误
解决方法:
使用nginx -c的参数指定nginx.conf文件的位置