书接上回nginx系列教程之一,本技术文档将对nginx的默认配置文件进行分析,然后针对配置文件中默认的内容进行基本的站点搭建演示,视为对自己的一个技术排盲。
笨蛋,笨蛋,你要加油啊!!!
1.nginx配置文件分析
下面是nginx搭建好之后,默认的配置文件/usr/local/nginx/conf/nginx.conf的内容:
#user nobody; //该选项设置nginx以那个用户身份来启动nginx的work进程,nginx启动时,会启动两种类型的进程,一种是master进程,nginx的主进程,负责监控管理work进程,一种就是work进程,这是nginx的工作进程,用来处理用户的连接请求。默认情况下,没设置的话work进程是以nobody的用户身份来启动。为什么要说这一点,这跟linux系统中进程与进程,进程与用户身份直接权限的关系直接挂钩,有机会单独整理。
worker_processes 1; //该选项设置nginx的工作进程数,通常是设置为cpu核心数的1倍或者1.5倍,这个要看系统的使用环境,分为cpu密集型和IO密集型,通常nginx使用在反向代理的场景中,建议设置成和cpu的核心数一样
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
以上几个选项都是设置nginx的错误日志存放位置以及记录日志的级别,关于日志的级别,这里不做细谈。一般用info即可
#pid logs/nginx.pid; //该选项设置nginx的pid文件的位置,默认是放在nginx安装目录下的logs目录下面,命名为nginx.pid文件
events {
worker_connections 1024;
}
//上面这一段是设置nginx的事件处理机制类型,默认使用的是epoll机制,也可以手动声明。worker_connections设置nginx一个工作进程可以处理多少个并发请求。通常情况下nginx能够处理的最大并发请求数为worker_processes*worker_connections 这是理论上的,实际环境中根据系统的环境肯定会比这个少一点,至于能大道多少在于自己测试。其次最大并发数还受系统最大打开文件数的限制,有待注意。
//接下来的这段内容,是nginx的主要内容,用来设置nginx的虚拟站点。所有内容都包括在http{}段中,在http段中可以划分很多个server{}段,每一个server段就是一个虚拟主机的设置,该server{}段中的设置只对该虚拟主机有效,而除server{}段之外的所有http段中的内容,对所有的虚拟主机都生效,也即是默认的配置
http {
include mime.types; //该选项设置互联网传送文本的类型,不用动,但必须有,默认放在nginx的安装目录下的conf目录中
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"';
//上面这段内容设置nginx的日志记录格式:
//log_format :标志日志格式内容的开始
//main:日志名,随便起,默认是main,不管什么日志名,定义了之后,在下面定义日志文件的时候要使用该处定义的日志名来调用对应的日志格式
//后面的内容,都是nginx核心模块中常见的内置变量,通过不同的变量获取不同的值,从而组合成记录的日志内容,对于所有常用的变量后续将会介绍,这里只解释当前涉及到的内容
//$remote_addr:获取远程客户端的ip地址,但是如果客户端使用了代理,则此处获取的将是代理的ip地址,因此此时若想获取客户端的真实ip地址,就会使用$http_x_forwarded_for.这也是在使用nginx反向代理的时候,后端web如果想记录真实的客户端ip地址,就会使用{X-Forwarded-for}i的原因
//$remote_user:记录客户端访问时需要认证的认证用户名信息
//$time_local:记录客户端访问时当前的时间
//$request :记录客户端发起的请求信息,通常有请求方法和请求内容
//$status:记录访问的状态信息,即http的状态码
//$body_bytes_sent:记录连接直接发送的主体内容的大小,单位是字节
//$http_referer:记录一次请求是从那个连接网址发过来的,通常在nginx中利用此功能来进行防盗链的设置
//$http_user_agent:记录客户端的访问代理信息,即浏览器的信息,通过这个变量可以判断客户端是使用pc还是手机等,从而做相应的分流
//$http_x_forwarded_for:当前端有代理时,可以通过这个变量获取客户端的真实地址,如果没有代理,则为空
//两个例子:一个是无认证,无链接的日志记录,一个是有认证有链接的日志记录
//10.0.10.254 - - [22/Aug/2014:14:37:25 +0800] "GET / HTTP/1.1" 401 194 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0"
//10.0.10.254 - tom [22/Aug/2014:14:37:28 +0800] "GET /link/index1.html HTTP/1.1" 200 31 "http://10.0.10.11/" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0)
// Gecko/20100101 Firefox/27.0"
#access_log logs/access.log main; 设置虚拟机主机默认的日志格式类型和记录的位置
sendfile on; //该选项开启内核传送文件的机制,这个涉及到一个完整的请求所经历的过程,涉及到用户空间buffer和内核空间的buffer机制。开启该功能,可以由内核空间直接传递数据到network 协议栈,然后传送给客户端,不在需要经过用户空间在转为内核空间,提供了效率。这个过程以后有机会在聊
#tcp_nopush on; //该选项的设置跟网络的效率有关,开该功能,可以使nginx在等待一定量的数据包大小时在传送数据给客户端,而不是收到数据就立即发送
#keepalive_timeout 0;
keepalive_timeout 65;
//keepalive_timeout 该选项用来设置持久连接,持久连接可以降低系统的压力。使得在一定的时间内,后续的请求可以利用当前建立的链接通道进行数据交互,而不再频繁的进行三次握手。但是持久链接的时间也不宜过长,通常保持默认65秒,有人说最好不要超过70秒
#gzip on; //该选项用来开启gizp的压缩功能,为了加快内容的传输和提供带宽的利用,对一些图片,css,html等静态文件进行压缩传送
//下面的内容就是server{}段,一个server段就是一个虚拟主机
server {
listen 80; //该选项用来设置虚拟主机监听的地址端口,默认只有端口没有地址,表示监听在所有地址上
server_name localhost; //设置虚拟主机的域名,可以写多个,相当于别名
#charset koi8-r; //设置编码,只能单向用在服务器端传送到客户端的时候对内容进行编码,在响应头中会在content-type上标识编码
#access_log logs/host.access.log main; //该选项同http段的设置一样,如果想要不同的server记录不同格式的日志和使用不同的日志记录文件,就可以分别设置
location / { //location用来设置url的相关内容,即针对不同的url设置不同的属性
root html; //root选项用来指定站点的根目录,通常如果不是绝对路径,都是相对于nginx的安装目录而言,即相对路径
index index.html index.htm; //index用来指定索引文件,当客户端访问时,会从此处的设置中依次超找相关的文件来显示给客户端
}
#error_page 404 /404.html; // error_page用来设置错误页面,针对不同的状态码可以设置不同的错误页面提示,相当有用
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
//上面这段内容就是设置了将500 502 503 504的错误状态码都重定向到/50.html这个页面,而location 用来设置这个页面所在的url位置 ,location的匹配规则有好几种,在附加内容中进行叙述
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
//上面这段内容用来设置将php的请求通过proxy代理的方式,发给指定的后端服务器进行处理,不常用
# 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;
#}
//上面这段也是处理php的请求,但是使用的是fastcgi的方式,在实际环境中是常用的,通常用在nginx做web站点时和php进行整合
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
//上面这段内容设置.ht文件的访问权限,默认是决绝所有访问,这个跟apache的.htaccess是一样的。其次在nginx权限的设置还可以使用allow,deny进行设置,这个也在附加内容中进行叙述
//下面这段内容是另一个虚拟主机,显示的效果是基于不同的端口进行访问的设置
# 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; //设置ssl的监听端口,443端口
# server_name localhost;
# ssl_certificate cert.pem; //设置证书
# ssl_certificate_key cert.key; //设置证书私钥
# ssl_session_cache shared:SSL:1m; //设置ssl的session缓存
# ssl_session_timeout 5m; //设置session的过期时间
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
//以上两个选项设置ssl的预认证密钥
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
ok,到此位置,nginx的配置文件分析就结束了。。。。。
2.nginx基本站点以及多虚拟主机的搭建
1)简单的单虚拟主机
编辑nginx.conf文件,去掉注释内容以后,剩余内容如下:
#service nginx configtest //测试nginx的配置文件是否有语法错误
#service nginx restart //重新启动ninx服务
如果一切正常,则可以正常访问网站的内容,需要注意的是,上面两个域名访问的内容一样,在server_name字段选项后面指定多个域名,其中第一个被认为是主域名,其他的都将被认为是域名的别名
注意:本地测试时,要先绑定host文件
2)多虚拟主机
编辑nginx.conf文件,除注释内容如下:
为了实现多虚拟主机,在默认的配置文件中,添加了一个简单的server{}段,域名为c.lxm.com,在该域名下,日志文件和根目录的位置都指定了非默认位置,值得注意一下。
#mkdir -pv /data/logs
#echo "<h1>welcome to c.lxm.com website<h1>" > /data/index.html
#service nginx configtest
#service nginx restart
如果正常,则会显示站点的内容
3.nginx搭建ssl站点
所谓ssl站点,就是使用证书加密的机制,来保证网站内容传输的安全性。要想使用ssl机制,就必须申请证书。由于是测试环境,这里使用自签名的证书来实现。
1)搭建CA证书机构
要想制作自签名的证书,则必须有自己的CA机构,为了通过本教程能够实现自签名证书,这里我先创建自己的CA机构,至于CA的详细内容在CA技术文档中在详细聊聊
CA证书机构:
#yum -y install openssl openssl-devel //如果软件没安装的请安装一下,默认情况下都是安装的
#cd /etc/pki
#mkdir crl newcerts certs //注意:在centos6.5中,这几个目录已经存在,如果在你的系统中,不存在这几个目录则需要创建
#touch index.txt;echo "01" > serial
#(umask 077;openssl genrsa -out private/cakey.pem 2048)
#openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650
此时会要求输入一系列的信息,根据提示填入即可,我的如下:
到此CA证书机构搭建完成。
2)搭建站点测试
a.申请证书
生成nginx的证书私钥:
生成nginx的证书请求文件:
此时会要求填入一系列的信息,跟CA证书创建时差不多,但是这里有一个要注意就是域名,必须填写网站的准备域名,否则ssl认证会失败。我的如下:
上传证书请求文件到CA服务器,签署证书:
证书签发完成,下载证书到自己的nginx服务器上,放在指定的位置,这里都是放在/usr/local/nginx/ssl目录下
b.nginx配置文件修改
关于ssl站点的配置:
检查配置文件语法并重启nginx服务:
[root@test1 conf]# echo "<h1>welcome to d.lxm.com website</h1>" > /usr/local/nginx/html/index.html
访问测试:
先绑定hosts文件:
10.0.10.11 d.lxm.com
浏览器访问测试:
https://d.lxm.com
如上图所示,提示安全证书有问题,点击继续浏览此网站:
如果一切正常,则可以访问站点的内容,但是会提示不信任的证书,此时点击继续或者添加列外即可。这里的不信任是因为自签名CA证书,本地浏览器不信任的原因。需要将CA证书机构的证书导入到本地浏览器中才可以,关于CA证书机构的内容,在专门的课题中再聊一聊
附:
1.nginx中的location匹配规则
无论是在apache中,还是在nginx中,location字段的设置都是用来匹配特定的url,只是对应的配置有点区别。下面聊一聊nginx中的location对url的匹配规则
格式:
location [=|~|~*|^~] uri {...}
location URI {...}:
对当前路径及子路径下的所有对象都生消
location = URI {...}:
精确匹配指定的路径,不包括子路径,只对当前路径生效;
location ~ URI {...}:
区分字符大小写的模式匹配
location ~* URI {...}:
不区分字符大小写的模式匹配
location ^~ URI {}:
不实用正则表达式匹配,意思是关闭正则表达式功能,即使有元字符,也当作普通字符逐字符匹配。
location {} @ name {...}: 该种用法不是很多,用来定义一个命名的location,通常不是用来为了一个处理一个正则的请求,而是用来为了请求重定向
当设置多个location设置时,进行匹配时是有优先级次序的:
1.精确匹配:=
2.非正则表达式 :^~
3.正则表达式:~or~*
4.未使用任何符号的时候 :location URI {}
如果优先级相同,则选择最精确匹配的匹配项
注意:location URL 和root URL两种的URL是合并的,将location后面的URL合并到root后面的URL后面形成一个完整的URL。
关于location的各种用法案例,将在下次专门的课题聊一聊。。。
2.nginx的访问权限控制:allow,deny
在nginx的配置文件中,可以对特定的文件和url使用allow,deny来对明确的客户端ip地址进行访问权限的限制,allow,deny的匹配次序是依次匹配,直到第一次匹配到位置。
官网的一个example:
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all;
}
到此为止,nginx系列教程之二:nginx配置文件分析及基本站点搭建 就聊到这里。。。。。更多技术请看下回分解。。。
结束!!!!
笨蛋的技术------不怕你不会!!!!
转载于:https://blog.51cto.com/mingyang/1544417