nginx有两个进程,一个master主进程,由主进程派生出多个工作进程
pstree #进程树
nginx和php有两种结合方式:
第一种是nginx接收交给fpm,fpm调用php,php有可能调用mysql。
第二种是nginx收到请求后将请求交给lamp。
#装nginx前必须安装的软件包
[root@localhost ~] yum -y install pcre-devel zlib-devel openssl-dever gcc gcc-c++ make
#创建一个程序用户
[root@localhost ~] useradd -M -s /sbin/nologin nginx
#解压软件包-C指定安装路径
[root@localhost ~] tar xf nginx-1.15.9.tar.gz -C /usr/src/
#进入解压的目录中
[root@localhost ~] cd /usr/src/nginx-1.15.9/
#指定配置参数并编译安装nginx
[root@localhost ~] ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-file-aio --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-http_ssl_module --with-pcre && make && make install
#为命令创建软连接
[root@localhost ~] ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/
#启动nginx服务
[root@localhost ~] nginx
#查看nginx是否启动成功也可以nginx -t
[root@localhost ~] netstat -lntp | grep 80
#访问测试一下,看是否成功
[root@localhost ~] elinks --dump http://192.168.1.6
Welcome to nginx!
#访问成功
–prefix=/usr/local/nginx :指定安装路径
–user=nginx --group=nginx:指定用户和组
–with-file-aio:支持aio模块
–with-http_stub_status_module:支持静态统计模块
–with-http_gzip_static_module:支持gzip压缩的模块
–with-http_flv_module:支持flv模块
–with-http_ssl_module:支持ssl模块
–with-pcre:支持pcre
小知识:
我们./configure后加的配置项在执行完的时候会在当前目录下生成一个叫Makefile的文件。
make就会参考Makefile这个文件进行编译,编译会在ojbs目录下生成许多的文件,其实我们在执行完make的时候软件就已经装完了。
而make install就是把objs下的文件放到你所指定的目录下,我们会发现在make install的时候都是cp或者是mv命令开头。
在生产环境中,需要隐藏nginx等服务的版本信息,以避免安全风险。
[root@localhost ~] curl -I http://192.168.1.6 #查看报头信息就能看到版本号。
HTTP/1.1 200 OK
Server: nginx/1.15.9
Date: Mon, 21 Oct 2019 20:41:28 GMT
Content-Type: text/html
Content-Length: 639
Last-Modified: Mon, 21 Oct 2019 10:35:09 GMT
Connection: keep-alive
ETag: “5dad89dd-27f”
Accept-Ranges: bytes
还是之前的操作
[root@localhost ~] yum -y install pcre-devel zlib-devel openssl-dever gcc gcc-c++ make
[root@localhost ~] useradd -M -s /sbin/nologin nginx
[root@localhost ~] tar xf nginx-1.15.9.tar.gz -C /usr/src/
[root@localhost ~] cd /usr/src/nginx-1.15.9/
[root@localhost ~] vim src/core/nginx.h
13 #define NGINX_VERSION "7.0.0"
14 #define NGINX_VER "IIS/" NGINX_VERSION
注意不用去掉 # 号直接修改后面的版本号和名字就行记得wq保存之后再编译安装
[root@localhost ~] ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-file-aio --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-http_ssl_module --with-pcre && make && make install
[root@localhost ~] ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/
[root@localhost ~] nginx
[root@localhost ~] netstat -lnpt | grep 80
当我们再去查看的时候版本号就被我们修改了
[root@localhost ~] curl -I http://192.168.1.6
HTTP/1.1 200 OK
Server: IIS/7.0.0
Date: Mon, 21 Oct 2019 20:41:28 GMT
Content-Type: text/html
Content-Length: 639
Last-Modified: Mon, 21 Oct 2019 10:35:09 GMT
Connection: keep-alive
ETag: “5dad89dd-27f”
Accept-Ranges: bytes
[root@localhost ~] vim /usr/local/nginx/conf/nginx.conf
28 server_tokens off; #只要是http{}中就行了
[root@localhost ~] killall -HUP nginx #重新加载nginx配置文件
如果php配置文件中配置了fastcgi_param SERVER_SOFTWARE选项,则编辑php-fpm配置文件,将fastcgi_param SERVER_SOFTWARE对应值修改为fastcgi_param SERVER_SOFTWARE nginx;
nginx运行时进程需要有用户与组身份的支持,以实现对网站文件读取进行访问控制。nginx默认使用nobody用户账号与组账号,一般也需要进行修改。
[root@localhost ~] useradd -M -s /sbin/nologin nginx
[root@localhost ~] ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
&& make && make install
[root@localhost ~] vim /usr/local/nginx/conf/nginx.conf
2 user nginx nginx;
[root@localhost ~] killall -HUP nginx
当nginx将网页数据返回给客户端后,可设置资源在客户端缓存的时间,一番便客户端在日后进行相同内容的请求时直接返回,避免重复请求们加快了访问速度,一般针对静态网页进行设置,对动态网页不用设置缓存时间,可在Windows客户端中使用fidder查看网页缓存时间。
设置方法:可修改配置文件,在http段或者location段加入对特定内容的过滤参数。
[root@localhost ~] vim /usr/local/nginx/conf/nginx.conf
local ~ \.(jpg|jpeg|png|bmp|ico|gif)${
expires 1d;
} #图片缓存一天
location ~ .*\.{js|css)${
expires 1h;
} #其他这些类型缓存一个小时
[root@localhost ~] killall -HUP nginx
Ctrl +F5 强制刷新网页
[root@localhost ~] vim /opt/cut_nginx_log.sh
#!/bin/bash
#cut_nginx_log.sh日志切割脚本
datetime=${date -d "-1 day" "+%Y%m%d"}
log_path="/usr/local/nginx/logs"
pid_path="/usr/local/nginx/logs/nginx.pid"
[-d $log_path/bakeup] || mkdir -p $log_path/backup
if [-f $pid_path]
then
mv $log_path/access.log $log_path/backup/access.log-$datetime
kill -USR1 $(cat $pid_path)
find $log_path/backup -mtime +30 | xargs rm -f
else
echo "Error,Nginx is not working!" | tee -a /var/log/messages
fi
[root@localhost ~] chmod +x /opt/cut_nginx_log.sh
[root@localhost ~] crontab -e
0 0 * * * /opt/cut_nginx_log.sh
/opt/cut_nginx_log.sh
[root@localhost ~] ls /usr/local/nginx/logs/backup/
access.log-20191021
[root@localhost ~] killall -9 nginx
[root@localhost ~] /opt/cut_nginx_log.sh
Error,Nginx is not working!
[root@localhost ~] tail -1 /var/log/messages
Error,Nginx is not working!
##脚本看不懂的私聊我
在企业网站中,为了避免同一个客户长时间占用连接,造成服务器资源浪费,可以设置相应的连接超时参数,实现控制访问时间。
keepalived_timeout:设置连接保持超时时间,一般可只设置改参数,默认为65秒,可根据网站的情况设置,或者关闭,可在http段、server段或者location段设置。
client_header_timeout:指定等待客户端发送请求头的超时时间。
client_body_timeout:设置请求体读取超时时间。
注意:若出现超时,会返回408状态码。
[root@localhost ~] vim /usr/local/nginx/conf/nginx.conf
34 keepalive_timeout 65;
35 client_header_timeout 60;
36 clien_body_timeout 60;
[root@localhost ~] killall -HUP nginx
在高并发场景,需要启动更多的nginx进程以保证快速影响,已处理用户的请求,避免造成阻塞。
修改配合文件的worker_processes参数,一般设置为CPU的个数或者核数的2倍。
[root@localhost ~] grep 'core id' /proc/cpuinfo | uniq | wc -l
1
[root@localhost ~] vim /usr/local/nginx/conf/nginx.conf
3 worker_processes 2;
[root@localhost ~] /usr/local/nginx/sbin/nginx
[root@localhost ~] ps aux | grep nginx | grep -v grep
root 4331 0.0 0.2 45040 1160 ? Ss 00:50 00:00 nginx:master
process /usr/local/nginx/sbin/nginx
......
默认nginx的多个进程可能更多的跑在一颗CPU上,可以分配不同的进程给不同的CPU处理,充分利用硬件多核多CPU。在一台4核物理服务器,可以进行下面的配置,将进程进行分配。
worker_cpu_affinity 0001 0010 0100 1000
nginx的ngx_http_gzip_module压缩模块提供了对文件内容压缩的功能,允许nginx服务器将输出内容发送到客户端之前进行压缩,以节约网站带宽,提升用户的访问体验,模块默认已经安装。
[root@localhost ~] vim /usr/local/nginx/conf/nginx.conf
nginx防盗链功能非常强大,在默认情况下只需要进行简单的配置,即可实现防盗处理。
[root@localhost ~] vim /usr/local/nginx/html/index.html
<html>
<head>
<title>source page</title>
</head>
<body>
<h1>www.source.com</h1>
<img src="linux.png" />
</body>
</html>
[root@localhost ~] ls /usr/local/nginx/html/
50x.html error.log index.html linux.png
<html>
<head>
<title>source page</title>
</head>
<body>
<h1>www.steal.com</h1>
<img src="http://www.source.com/linux.png"/>
</body>
</html>
配置说明:
valid_referers 设置信任网站
none 浏览器中referer(Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是哪个页面链接过来的,服务器基此可以获得一些信息用于处理)为空的情况,就直接在浏览器访问图片。
blocked referer不为空的情况,但是值被代理或防火墙删除了,这些值不以http://或https://开头。
[root@localhost ~] vim /usr/local/nginx/conf/nginx.conf
48 location ~* \.(wma|wmv|asf|mps|mmf|zip|rar|jpg|png|gif|swf|flv)$ {
49 valid_referers none blocked *.source.com source.com;
50 if ($invalid_referer){
51 rewrite ^/ http://www.source.com/error.jpg;
52 #reyurn 403;
53 }
第一行: wma|wmv|asf |mp3|mnf|zip|rar|jpg |gif|png|swf|flv表示对这些后缀的文件实行防盗链。
第二行: none blocked *. source. com source. com; //不区分大小写。
表示referers信息中匹配none blocked *. source. com source. com. (xing代表任何,任何的二级域名)。
if{}里面内容的意思是,如果链接不是来自第二行指定的就强制跳转到403错误页面,当然直接返回404也是可以的,也可以是图片。
注意:设置客户机的hosts文件。
nginx的php解析功能实现如果是交由FPM(fastcgi 进程管理器) 处理的,为了提高PHP的处理速度,可对FPM模块进行参数跳转。
FPM优化参数:
pm :使用哪种方式启动fpm进程,可以说static和dynamic,前者将产生固定数量的fpm进程,后者将以动态的方式产生fpm进程。
pm.max_children :stati方式下开启的fpm进程数。
pm.start_servers : 动态方式下初始的fpm进程数量。
pm.min_spare_servers :动态方式下最小的fpm空闲进程数。
pm.max_spare_servers :动态方式下最大的fpm空闲进程数。
注:意向条数要根据服务器的内存与服务器负载进行调整。
服务器为云服务器,运行了个人论坛,内存为1.5G,fpm进程数为20,内存消耗近1G 处理比较慢
优化参数调整:
[root@localhost ~] vim /usr/local/php5/etc/php-fpm.conf
pm=dynamic
pm=start_servers= 5
pm.min_spare_servers= 2
pm.max_spare_servers= 8
[root@localhost ~] vim /usr/local/nginx/conf/nginx.conf
56 error_page 403 404 /404.html;
57 location = /404.html {
58 root html;
59 }
[root@localhost html]# echo "Sorry,not Found" > /usr/local/nginx/html/404.html
[root@localhost html]#killall -HUP nginx
浏览器访问 http://192.168.1.6/abc
返回结果: Sorry,not Found
[root@localhost ~] vim /usr/local/nginx/conf/nginx.conf
44 location /abc {
45 autoindex on;
46 }
[root@localhost ~] cd /usr/local/nginx/html/
[root@localhost html] mkdir abc/dir{1,2} -p
[root@localhost html] touch abc/1.txt
[root@localhost html] touch abc/2.txt
[root@localhost html] killall -HUP nginx
浏览器访问 http://192.168.1.6/abc