1. 安装nginx

// 查询有没有nginx
brew search nginx //开始安装nignx
brew install nginx

2. 检查nignx是否安装成功

nginx -V 查看nginx版本及安装的本地位置

ngxin -v 查看nginx版本(此方法依然可以检测是否安装某一软件,如git,hg等)

//同时你也可以在浏览器上输入,来查看运行结果,出现下图应该就可以了
localhost:8080

3. nginx安装在哪?为什么会安装在这里?

--prefix=/usr/local/Cellar/nginx/1.15.5 // 没错就是安装在这里了

那么为什么会安装在这里呢?

/usr用于存放系统应用程序,比较重要的目录/usr/local本地系统管理员软件安装目录(安装系统级的应用)。这是最庞大的目录,要用到的应用程序和文件几乎都在这个目录。

显然,nignx属于系统级应用,所以就安装在了/usr/local下。

不过有一点需要注意:/usr目录下一般安装系统应用,/usr/local目录下安装用户下载的系统应用。然后可能会有人说,你这不是在扯淡吗?这两个有什么差别?别急,真的有差别!

/usr/local目录 安装用户下载的系统应用,比如nginx,mysql,zsh,openssl等系统软件 都放在这些个地方, /usr目录存放安装linux系统时安装的应用,明白了吗?一个是系统安装时安装的应用,一个是用户安装的应用,两者不是一会事儿。

4. nginx启动和暂停指令

nginx关闭很简单,稍微有点复杂的是nginx的开启
//关闭, kill和pkill的区别,kill只能通过进程id杀死进程,pkill可以通过进程名字杀死所有的进程
pkill nginx;

nginx开启,首先你要知道nginx的可以执行文件在哪。那么怎么知道呢?看下面的代码

  -v            : show version and exit // 告诉我们nginx的配置信息
-V : show version and configure options then exit // 不仅告诉我们配置信息,还会告诉我们配置选项,然后停止
-t : test configuration and exit // 检查配置是不是正确
-T : test configuration, dump it and exit // 检查配置,并把这些配置打印出来,然后就停止
-q : suppress non-error messages during configuration testing
-s signal : send signal to a master process: stop, quit, reopen, reload // 给主进程发信息,比如stop, quit, reopen, reload这些指令(Quit 是一个优雅的关闭方式,Nginx在退出前完成已经接受的连接请求;Stop 是快速关闭,不管有没有正在处理的请求)
-p prefix : set prefix path (default: /usr/local/Cellar/nginx/1.15.5/) // -s reopen 重新打开日志(不懂日志)
-c filename : set configuration file (default: /usr/local/etc/nginx/nginx.conf) // nginx到底以哪个配置文件为准
-g directives : set global directives out of configuration file

这个时候我们可以先执行

nginx -V
然后会看到

进入--sbin-path指示的地方,然后执行下面代码就可以了

./nginx -t // 如果配置文件不正确的话,可以使用./nginx -c location 来指定配置文件

5. nginx配置好了,利用nginx来做事情了。先看看nginx主要的配置,及它们的含义

worker_processes  4;  #Nginx运行时使用的CPU核数

events {
worker_connections 1024; #一个woeker进程的最大连接数
} http { #Nginx用作虚拟主机时使用。每一个server模块生成一个虚拟主机。
include mime.types; #定义MIME类型和后缀名关联的文件的位置
default_type application/octet-stream; #指定mime.types文件中没有记述到的后缀名的处理方法 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' #定义日志的格式。可以选择main或者ltsv,后面定义要输出的内容。
             '$status $body_bytes_sent "$http_referer" '

             '"$http_user_agent" "$http_x_forwarded_for"'; 

 1.$remote_addr 与$http_x_forwarded_for 用以记录客户端的ip地址;
 2.$remote_user :用来记录客户端用户名称;
 3.$time_local :用来记录访问时间与时区;
 4.$request :用来记录请求的url与http协议;
 5.$status :用来记录请求状态; 
 6.$body_bytes_s ent :记录发送给客户端文件主体内容大小;
 7.$http_referer :用来记录从那个页面链接访问过来的;
 8.$http_user_agent :记录客户端浏览器的相关信息;。 access_log /usr/local/var/log/nginx/access.log main; #连接日志的路径,上面指定的日志格式放在最后 sendfile on; #是否使用OS的sendfile函数来传输文件
keepalive_timeout 65; #HTTP连接的持续时间。设的太长会使无用的线程变的太多 server {
listen 80; #监听端口
server_name localhost; #服务地址 charset utf-8; #编码方式 access_log /usr/local/var/log/nginx/localhost.access.log main; #nginx请求日志地址 root /var/www; #你的网站根目录
location / { # 所有的请求都会走的路径
index index.html index.htm index.php;
   try_files $uri /$uri index.php?$args; #从左边开始找指定文件是否存在
} error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
} location ~ \.php$ { # 正则表达式: .php文件走的路径
fastcgi_pass 127.0.0.1:9000; #走fastcgi 路径
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name; #定义的根目录 以及 请求的脚本名
include fastcgi_params; # 请求参数
} location ~ /\.ht { # 当前项目的根路径
deny all;
}
} include sites-enabled/nginx-*.conf; # 添加的文件其他虚拟主机配置
}
6. 看完各种配置之后,可以尝试着自己写一波了。

运行:sudo /usr/sbin/php-fpm,因为usr/sbin目录下放的是可执行文件,所以当你访问/usr/sbin/php-fpm的时候就相当于在启动fpm。但很遗憾,出现了这样的错误:
[22-Oct-2018 21:15:38] ERROR: failed to open configuration file '/private/etc/php-fpm.conf': No such file or directory (2)
[22-Oct-2018 21:15:38] ERROR: failed to load configuration file '/private/etc/php-fpm.conf'
[22-Oct-2018 21:15:38] ERROR: FPM initialization failed

看看这个错误提示的意思是没有 '/private/etc/php-fpm.conf',找不到不要紧,我们再往里面查,发现里面有一个默认的文件

拷贝一份过去不就得了?

sudo cp /private/etc/php-fpm.conf.default /private/etc/php-fpm.conf

拷贝完之后接着执行 :sudo /usr/sbin/php-fpm 发现报错:

[22-Oct-2018 21:16:27] WARNING: Nothing matches the include pattern '/private/etc/php-fpm.d/*.conf' from /privat; Start a new pool named 'www'.
; the variable $pool can be used in any directive and will be replaced by the
e/etc/php-fpm.conf at line 125.
; Start a new pool named 'www'.
[22-Oct-2018 21:16:27] ERROR: failed to open error_log (/usr/var/log/php-fpm.log): No such file or directory (2)
[22-Oct-2018 21:16:27] ERROR: failed to post process the configuration
[22-Oct-2018 21:16:27] ERROR: FPM initialization failed

很简单,找不到file和directory,既然找不到,先创建个文件夹:sudo mkdir -p /usr/var/log,结果发现:

mkdir: /usr/var/log: Operation not permitted

为啥啊?mac EI Captian系统权限收紧了,不让创建了。那好,不让创建就不创建了。我换个地方建行不行?sudo mkdir -p /usr/local/var/log/nginx/ 幺西,可以了。我再执行:sudo /usr/sbin/php-fpm

[22-Oct-2018 21:17:54] WARNING: Nothing matches the include pattern '/private/etc/php-fpm.d/*.conf' from /private/etc/php-fpm.conf at line 125.
[22-Oct-2018 21:17:54] ERROR: failed to open error_log (/usr/var/log/php-fpm.log): No such file or directory (2)
[22-Oct-2018 21:17:54] ERROR: failed to post process the configuration
[22-Oct-2018 21:17:54] ERROR: FPM initialization failed
; Start a new pool named 'www'.

what?这是个什么叼!老子配个环境,跟唐僧去西天取经一样。我忍。不就是错误吗,查!

Mac OSX 10.9的系统自带了PHP、php-fpm,省去了安装php-fpm的麻烦。 这里需要简单地修改下php-fpm的配置,否则运行php-fpm会报错。

<!-- lang: shell -->
sudo cp /private/etc/php-fpm.conf.default /private/etc/php-fpm.conf
vim /private/etc/php-fpm.conf

修改php-fpm.conf文件中的error_log项,默认该项被注释掉,这里需要去注释并且修改为error_log = /usr/local/var/log/php-fpm.log。如果不修改该值,运行php-fpm的时候会提示log文件输出路径不存在的错误。

这个问题解决了,我接着再运行:sudo /usr/sbin/php-fpm 服了,改了,够了。又出现了这样的错误。

[22-Oct-2018 21:22:04] WARNING: Nothing matches the include pattern '/private/etc/php-fpm.d/*.conf' from /private/etc/php-fpm.conf at line 125.
[22-Oct-2018 21:22:04] ERROR: No pool defined. at least one pool section must be specified in config file
[22-Oct-2018 21:22:04] ERROR: failed to post process the configuration
[22-Oct-2018 21:22:04] ERROR: FPM initialization failed

查!!!!!!!!!!

大概意思就是说找不到/private/etc/php-fpm.d/*.conf目录下的配置文件。 进入里面的目录,会有一个www.conf.default文件。执行下面命名复制一份

root@ubuntu:/opt/php7/etc/php-fpm.d/# cp www.conf.default www.conf
复制好之后,编辑该文件
定位到里面文件的 user = nobody 和 group = nobody ,调整为 www-data。这一步和5版编译安装一样。最后启动PHP-FPM

改好之后,再次执行:sudo /usr/sbin/php-fpm

done!!!成功了。走了,下班了,哈哈哈,真开心。
 
早上上班再启动一下试试:
nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)
nginx: configuration file /usr/local/etc/nginx/nginx.conf test failed

苹果对1024一下的端口都做了限制,要有root权限才能执行,所以用sudo命令或者将端口改为1024以上就可以解决这个问题了。 我采用的方法是把端口号改成了8088。

然后访问localhost:8080,结果出现了这个问题:

Bad GateWay什么鬼?没关系我们看一下错误日志:

2018/10/23 11:25:17 [crit] 28716#0: *26 stat() "/Users/qudian/Documents/project/quxuexi/3.0/quxuexi.service.merchant/public/" failed (13: Permission denied), client: 127.0.0.1, server: quxuexi.merchant, request: "GET / HTTP/1.1", host: "localhost:8088"
2018/10/23 11:25:17 [crit] 28716#0: *26 stat() "/Users/qudian/Documents/project/quxuexi/3.0/quxuexi.service.merchant/public/" failed (13: Permission denied), client: 127.0.0.1, server: quxuexi.merchant, request: "GET / HTTP/1.1", host: "localhost:8088"
2018/10/23 11:25:17 [crit] 28716#0: *26 connect() to unix:/var/run/php/php7.2-fpm.sock failed (2: No such file or directory) while connecting to upstream, client: 127.0.0.1, server: quxuexi.merchant, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/var/run/php/php7.2-fpm.sock:", host: "localhost:8088"
2018/10/23 11:25:17 [crit] 28716#0: *26 stat() "/Users/qudian/Documents/project/quxuexi/3.0/quxuexi.service.merchant/public/favicon.ico" failed (13: Permission denied), client: 127.0.0.1, server: quxuexi.merchant, request: "GET /favicon.ico HTTP/1.1", host: "localhost:8088", referrer: "http://localhost:8088/"
2018/10/23 11:25:17 [crit] 28716#0: *26 stat() "/Users/qudian/Documents/project/quxuexi/3.0/quxuexi.service.merchant/public/favicon.ico" failed (13: Permission denied), client: 127.0.0.1, server: quxuexi.merchant, request: "GET /favicon.ico HTTP/1.1", host: "localhost:8088", referrer: "http://localhost:8088/"
2018/10/23 11:25:17 [crit] 28716#0: *26 connect() to unix:/var/run/php/php7.2-fpm.sock failed (2: No such file or directory) while connecting to upstream, client: 127.0.0.1, server: quxuexi.merchant, request: "GET /favicon.ico HTTP/1.1", upstream: "fastcgi://unix:/var/run/php/php7.2-fpm.sock:", host: "localhost:8088", referrer: "http://localhost:8088/"

总的来说错误日志给出了三种错误提示:

(1)访问/Users/qudian/Documents/project/quxuexi/3.0/quxuexi.service.merchant/public/" failed 失败了

(2)connect() to unix:/var/run/php/php7.2-fpm.sock failed (2: No such file or directory) 失败了,没有这样的文件和文件夹,也就是说可能文件和文件夹的位置不对劲吧

(3)stat() "/Users/qudian/Documents/project/quxuexi/3.0/quxuexi.service.merchant/public/favicon.ico" failed (13: Permission denied)访问 public目录下的favicon.ico失败。错误和(1)差不多,但是不清楚为什么访问public目录下的favicon.ico文件。

既然找到了问题出在哪,就可以尝试着去解决问题了,首先查询第一个问题。结果发现第一个问题的解决方法解决不了。

既然如此就先解决第二个问题吧,查查查。脑子懵了,没查到。后来问了问同事,找到了解决问题的解决方法了。

这个时候问题就出现了,你nginx服务器监听的是8088端口,然后nginx将接收到的信息也转发到8088端口,这样怎么可以呢?暂且不说fastcgi监听的是哪个端口,正常的逻辑应该是这样,我nginx监听从8088来的信息,然后根据这些信息的类型把这些信息转发到php-fpm监听的端口,这本身就是两个进程,监听的端口也不一样。有人会问,为什么不一样?举个例子,如果两个人都监听8088端口,那fastcgi能不能收到和有没有权利收到信息是一回事儿,更严重的问题是nginx自己监听自己发送的信息,这样不符合逻辑啊。可以理解为,自己给自己写信。那好,可能又会有人说,那我让两个进程监听一个端口,然后ngnix不做转发不可以吗?我还真不知道可不可以,所以去查了一下:其实是可以的,这就能理解成是信箱,我们把信息千里迢迢的发送到信箱,然后有人去信箱取信,那到底是谁来取,几个人可以取,一个人取几个都是由人规定的。

出于好奇,我又产生了一个疑问,为什么要有端口这样的东西呢?两台计算机进程之间直接通信不可以吗?其实是不可以的,这就好比两个陌生人之间的通信。彼此之间互相不认识,怎么通信。最好的选择就是给彼此个地址,然后你发信息,我取信息,这样就是进程间通信的过程。通过广播的方式在全世界寻找一个ip中的一个进程号,这显然是不现实的。因为你在发信息的时候根本就不知道这个进程号是多少。当然你也可以在通信之前就发送某个进程号过去,告诉它我们之间用这个进程号通信,但是这样的限制太死了。为什么呢?你这个进程号怎么发送过去?尴尬了吧!而且,进程号是系统动态分配的,不同的系统会使用不同的进程标识符,应用程序在运行之前不知道自己的进程号,如果需要运行后再广播进程号则很难保证通信的顺利进行。

好了,终于把这些问题搞懂了,然后就开始改配置,解决问题了。

看下php-fpm的监听的端口号

问题来了你怎么找到这个配置在哪里呢?

php-fpm -t // 检测配置

打开显示的php-fpm配置文件,然后发现:

打开这个文件,你会发现php-fpm监听的是哪个端口,以及使用的是什么来监听的。

那这个php-fpm.d/*.conf文件是干什么的呢?

我在这个地方找到了答案:http://ask.apelearn.com/question/5299

从php-5.3版本以后,php-fpm.conf 的格式不再是xml格式,而是和php.ini所使用的格式一样。新版本的php-fpm.conf 从宏观上看共分为两大块:一个是全局配置[global],一个是Pool Definitions, [www]
其中global部分就是配置一些全局的参数,比如错误日志、pid、日志级别等,第二部分的pool可以定义多个,而且[]的name可以自定义:例如配置文件可以这样写
[global]
...
...
...
[www.domain1.com]
...
...
...
[www.domain2.com]
...
...
...
当然每一个[www]部分都可以单独写一个配置文件,就像nginx的vhosts一样。这就需在php-fpm.conf中首先加一句
include=etc/fpm.d/*.conf
然后,需要在etc目录下创建一个fpm.d目录,把每一个pool配置文件放到fpm.d下。 为了安全起见,需要定义每个pool所启用的账户,还需要定义open_basedir,如下
  1. [www.domain.com]
  2. user = user0
  3. group = users
  4. listen = /tmp/php-fcgi-www.default.com.sock
  5. listen.owner = user0
  6. listen.group = users
  7. pm = dynamic
  8. pm.max_children = 20
  9. pm.start_servers = 5
  10. pm.min_spare_servers = 4
  11. pm.max_spare_servers = 10
  12. pm.max_requests = 500
  13. slowlog = log/www.default.com.slow
  14. request_slowlog_timeout = 1
  15. php_admin_value[open_basedir]=/data/release/www.domain.com/:/tmp/
  16. [www.domain2.com]
  17. user = user1
  18. group = users
  19. listen = /tmp/php-fcgi-www.default2.com.sock
  20. listen.owner = user1
  21. listen.group = users
  22. pm = dynamic
  23. pm.max_children = 20
  24. pm.start_servers = 5
  25. pm.min_spare_servers = 4
  26. pm.max_spare_servers = 10
  27. pm.max_requests = 500
  28. slowlog = log/www.default2.com.slow
  29. request_slowlog_timeout = 1
  30. php_admin_value[open_basedir]=/data/release/www.domain.com/:/tmp/

最新文章

  1. C#~异步编程再续~await与async引起的w3wp.exe崩溃
  2. Ubuntu 下配置Ganglia监控
  3. windows环境下局域网内无法访问apache站点
  4. MySQL数据库服务器 主从配置
  5. centos postfix 邮箱安装记录
  6. IOS 笔试
  7. Android实用代码块
  8. UGUI 下拉滚动框
  9. 2.java.lang.NullPointerException(空指针异常)
  10. 测试驱动 ASP.NET MVC Type Aliase
  11. SqlBulkCopy实现大容量数据快速插入数据库中
  12. iOS友盟三方登陆
  13. 详解变量声明加 var 和不加 var 的区别
  14. WiFi天线分集
  15. Linux快捷键总结
  16. AI matplotlib
  17. LOJ #2718. 「NOI2018」归程(Dijkstra + Kruskal重构树 + 倍增)
  18. Redhat7.4 vim编辑无颜色解决
  19. Python3 tkinter基础 Entry get 点击按钮 将输入框中文字输出到控制台
  20. Codeforces 238 div2 A. Gravity Flip

热门文章

  1. MD5验签同一字符串得到不同的MD5签名值可能问题之一
  2. js valueOf()函数用于返回指定对象的原始值
  3. linux基础命令---touch
  4. HTTP从入门到入土(5)——HTTP报文格式
  5. 优化 MySQL: 3 个简单的小调整
  6. http协议/获得请求/中文参数处理/访问数据库
  7. Jsoup简介
  8. 根据wsdl,apache cxf的wsdl2java工具生成客户端、服务端代码
  9. 函数对象与仿函数(function object and functor)
  10. 基础知识 - Golang 中的格式化输入输出