工作这么多年一直用的都是NGINX
,也一直想写总结,不过之前都是在上班,下班后就比较懒了,所以一直搁置着,趁着现在离职了有时间,就想把之前欠下的都补上,也算是对自己近年来工作技能的总结,希望这篇文章能帮助到你。
Nginx(发音同“engine X”)是异步框架的网页服务器,也可以用作反向代理、负载平衡器和HTTP缓存。该软件由伊戈尔·赛索耶夫创建并于2004年首次公开发布。2011年成立同名公司以提供支持。2019年3月11日,Nginx公司被F5 Networks以6.7亿美元收购。
下载nginx_modules
(ps:编译的时候会用到)
链接: https://pan.baidu.com/s/1MjVdVkF4EAjhPfLImRfWMA 密码: wwgb
1#!/usr/bin/env bash
2
3DIR=/Users/shiwenyuan/webserver
4mkdir -p $DIR
5cd $DIR
6mkdir run
7
8tar -zxvf /Users/shiwenyuan/totalXbox/project/phpstorm/xlegal/devops/opbin/nginx_modules.tgz -C $DIR
9
10mkdir tmp
11cd tmp
12
13wget http://nginx.org/download/nginx-1.8.1.tar.gz -O nginx-1.8.1.tar.gz
14
15tar -zxvf nginx-1.8.1.tar.gz
16
17cd nginx-1.8.1
18
19./configure \
20--with-http_realip_module \
21--with-http_stub_status_module \
22--with-http_addition_module \
23--add-module=$DIR/nginx_modules/echo-nginx-module-master \
24--add-module=$DIR/nginx_modules/headers-more-nginx-module-master \
25--add-module=$DIR/nginx_modules/memc-nginx-module-master \
26--add-module=$DIR/nginx_modules/nginx-http-concat-master \
27--add-module=$DIR/nginx_modules/ngx_devel_kit-master \
28--add-module=$DIR/nginx_modules/ngx_http_consistent_hash-master \
29--add-module=$DIR/nginx_modules/ngx_http_enhanced_memcached_module-master \
30--add-module=$DIR/nginx_modules/ngx_http_upstream_ketama_chash-0.6 \
31--add-module=$DIR/nginx_modules/srcache-nginx-module-master \
32--with-pcre=$DIR/nginx_modules/pcre-8.38 \
33--prefix=$DIR
34if [[ $? -ne 0 ]];then
35 echo 'error occured\n'
36 exit 1
37fi
38make && make install
39cd $DIR
40/bin/rm -rf tmp
41/bin/rm -rf node_modules
42
43/sbin/nginx -t
线上应用常常都是一个nginx上面会配置好几个域名,每个域名都会放到一个单独的配置文件里。然后在nginx.conf中引用这些文件,所以可以理解为每次nginx启动的时候都会默认加载nginx.conf,nginx.conf会把相关的server配置都引用进来形成一个大的nginx文件。
20200622144019
Nginx
服务器或与用户的网络连接一个nginx
配置文件的结构就像nginx.conf
显示的那样,配置文件的语法规则:
#
添加注释$
使用变量include
引用多个配置文件 1www.example.com/index.php
2 |
3 |
4 Nginx
5 |
6 |
7php-fpm监听127.0.0.1:9000地址
8 |
9 |
10www.example.com/index.php请求转发到127.0.0.1:9000
11 |
12 |
13nginx的fastcgi模块将http请求映射为fastcgi请求
14 |
15 |
16 php-fpm监听fastcgi请求
17 |
18 |
19php-fpm接收到请求,并通过worker进程处理请求
20 |
21 |
22php-fpm处理完请求,返回给nginx
23 |
24 |
tcp socket通信方式,需要在nginx配置文件中填写php-fpm运行的ip地址和端口号,该方式支持跨服务器,即nginx和php-fpm不再统一机器上时。
1location ~ \.php$ {
2 include fastcgi_params;
3 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;;
4 fastcgi_pass 127.0.0.1:9000;
5 fastcgi_index index.php;
6}
unix socket通信方式,需要在nginx配置文件中填写php-fpm运行的pid文件地址。unix socket又叫IPC(inter process communication进程间通信)socket,用于实现统一主机上进程间通信。
1location ~ \.php$ {
2 include fastcgi_params;
3 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;;
4 fastcgi_pass unix:/var/run/php5-fpm.sock;
5 fastcgi_index index.php;
6}
Unix socket 不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程。所以其效率比 tcp socket 的方式要高,可减少不必要的 tcp 开销。不过,unix socket 高并发时不稳定,连接数爆发时,会产生大量的长时缓存,在没有面向连接协议的支撑下,大数据包可能会直接出错不返回异常。而 tcp 这样的面向连接的协议,可以更好的保证通信的正确性和完整性。
所以,如果面临的是高并发业务,则考虑优先使用更可靠的tcp socket,我们可以通过负载均衡、内核优化等手段来提供效率。
在Web开发中,通常来说,动态资源其实就是指那些后台资源,而静态资源就是指HTML,JavaScript,CSS,img等文件。
在使用前后端分离之后,可以很大程度的提升静态资源的访问速度,同时在开过程中也可以让前后端开发并行可以有效的提高开发时间,也可以有些的减少联调时间 。
1server {
2 location /www/ {
3 root /www/;
4 index index.html index.htm;
5 }
6
7 location /image/ {
8 root /image/;
9 }
10}
反向代理常用与不想把端口暴露出去,直接访问域名处理请求。
1server {
2 listen 80;
3 server_name www.phpblog.com.cn;
4 location /swoole/ {
5 proxy_pass http://127.0.0.1:9501;
6 }
7 location /node/ {
8 proxy_pass http://127.0.0.1:9502;
9 }
10
11}
1upstream phpServer{
2 server 127.0.0.1:9501;
3 server 127.0.0.1:9502;
4 server 127.0.0.1:9503;
5}
6server {
7 listen 80;
8 server_name www.phpblog.com.cn;
9 location / {
10 proxy_pass http://phpServer;
11 proxy_redirect off;
12 proxy_set_header Host $host;
13 proxy_set_header X-Real-IP $remote_addr;
14 proxy_next_upstream error timeout invalid_header;
15 proxy_max_temp_file_size 0;
16 proxy_connect_timeout 90;
17 proxy_send_timeout 90;
18 proxy_read_timeout 90;
19 proxy_buffer_size 4k;
20 proxy_buffers 4 32k;
21 proxy_busy_buffers_size 64k;
22 proxy_temp_file_write_size 64k;
23 }
24}
1upstream phpServer{
2 server 127.0.0.1:9501 weight=3;
3 server 127.0.0.1:9502;
4 server 127.0.0.1:9503;
5}
在这个配置中,每5个新请求将会如下的在应用实例中分派: 3个请求分派去9501,一个去9502,另外一个去9503.
1upstream phpServer{
2 least_conn;
3 server 127.0.0.1:9501;
4 server 127.0.0.1:9502;
5 server 127.0.0.1:9503;
6}
当某些请求需要更长时间来完成时,最少连接可以更公平的控制应用实例上的负载。
1upstream phpServer{
2 ip_hash;
3 server 127.0.0.1:9501;
4 server 127.0.0.1:9502;
5 server 127.0.0.1:9503;
6}
将一个客户端绑定给某个特定的应用服务器;
由于浏览器同源策略的存在使得一个源中加载来自其它源中资源的行为受到了限制。即会出现跨域请求禁止。
所谓同源是指:域名、协议、端口相同。
20200622140049
1server {
2 listen 80;
3 server_name www.phpblog.com.cn;
4 root /Users/shiwenyuan/blog/public;
5 index index.html index.htm index.php;
6 location / {
7 try_files $uri $uri/ /index.php?$query_string;
8 }
9 add_header 'Access-Control-Allow-Origin' "$http_origin";
10 add_header 'Access-Control-Allow-Credentials' 'true';
11 add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, DELETE, PUT, PATCH';
12 add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-XSRF-TOKEN';
13
14 location ~ \.php$ {
15 fastcgi_pass 127.0.0.1:9000;
16 fastcgi_index index.php;
17 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
18 include fastcgi_params;
19 }
20 error_page 404 /404.html;
21 error_page 500 502 503 504 /50x.html;
22 location = /50x.html {
23 root html;
24 }
25}
此处可以参考我之前写的一篇文章
nginx配置https证书认证
1location ^~ /saas {
2 root /home/work/php/saas/public;
3 index index.php;
4 rewrite ^/saas(/[^\?]*)?((\?.*)?)$ /index.php$1$2 last;
5 break;
6}
1#!/bin/bash
2#设置你的日志存放的目录
3log_files_path="/mnt/usr/logs/"
4#日志以年/月的目录形式存放
5log_files_dir=${log_files_path}"backup/"
6#设置需要进行日志分割的日志文件名称,多个以空格隔开
7log_files_name=(access.log error.log)
8#设置nginx的安装路径
9nginx_sbin="/mnt/usr/sbin/nginx -c /mnt/usr/conf/nginx.conf"
10#Set how long you want to save
11save_days=10
12
13############################################
14#Please do not modify the following script #
15############################################
16mkdir -p $log_files_dir
17
18log_files_num=${#log_files_name[@]}
19#cut nginx log files
20for((i=0;i<$log_files_num;i++));do
21 mv ${log_files_path}${log_files_name[i]} ${log_files_dir}${log_files_name[i]}_$(date -d "yesterday" +"%Y%m%d")
22done
23$nginx_sbin -s reload
1server {
2 listen 80;
3 server_name *.phpblog.com.cn;
4
5 # 图片防盗链
6 location ~* \.(gif|jpg|jpeg|png|bmp|swf)$ {
7 valid_referers none blocked server_names ~\.google\. ~\.baidu\. *.qq.com;
8 if ($invalid_referer){
9 return 403;
10 }
11 }
12}
1location ~ \.php$ {
2 allow 127.0.0.1; #只允许127.0.0.1的访问,其他均拒绝
3 deny all;
4 fastcgi_pass 127.0.0.1:9000;
5 fastcgi_index index.php;
6 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
7 include fastcgi_params;
8}
1location ~ \.(js|css|sql)$ {
2 deny all;
3}
创作不易,希望对你有所帮助。
如果本篇博客有任何错误,请批评指教,不胜感激!!!
原创不易,转载请注明处。
文章将持续更新中,可以通过微信搜索[石先生的私房菜
]或者下方二维码关注第一时间阅读和催更,除了博客以外还会定期发送leetcode
的php版题解
。
20200619155130