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/

mac 安装nginx,并配置nginx的运行环境的更多相关文章

  1. virtualBox安装centos7并配置nginx php mysql运行环境

    virtualBox安装centos7并配置nginx php mysql运行环境 一:virtualBox安装centos7并进行基础设置 1.下载dvd.iso安装文件,下载地址:https:// ...

  2. LNMP安装Let’s Encrypt 免费SSL证书方法:自动安装与手动配置Nginx

    前几天介绍了最新StartSSL免费SSL申请与配置,很多人看到部落介绍SSL证书安装时总是推荐了OneinStack,因为OneinStack提供了一键添加和配置Let's Encrypt 免费SS ...

  3. 配置perl-cgi的运行环境,由于Active Perl安装在d:\perl

    Apache 1.3.22 for Win32+PHP 4.0.6+Active Perl 5.006001+Zend Optimizer v1.1.0+mod_gzip 1.3.19.1a+MySQ ...

  4. Mac上利用VScode配置c/c++开发环境

    Mac上利用VScode配置c/c++开发环境 哭辽,Typora里面最好不要插入表情,不然保存会闪退 首先你要有一个vscode 在扩展里面下载c/c++ 第一步 ⬆+com+p 打开命令模式:选择 ...

  5. Centos7安装Docker 基于Dockerfile 搭建httpd运行环境

    Centos7安装Docker 基于Dockerfile 搭建httpd运行环境 docker docker搭建 docker build 本文档完成目标内容如下 使用Docker搭建http服务器一 ...

  6. vsCode怎么为一个前端项目配置ts的运行环境

    vsCode为一个前端项目配置ts的运行环境,ts文件保存的时候自动编译成js文件: 假设此前端项目名称为Web:文件结构如图 1. 在根目录中新建一个“.vscode”文件夹,里面建一个“tasks ...

  7. VScode配置CMD本地运行环境(2.0)

    VScode配置CMD本地运行环境(2.0) 官方Task.json说明 完整的Task.json配置信息 Task.json预定义变量 看了很多网上的教程都说需要下载VScode的python插件, ...

  8. Mac os x下配置nginx + php

    一直都没使用过PHP的,最近leader推荐使用他在维护的一个移动端的js框架,在本地合并压缩使用的是php环境处理的,so,只能是搭一个PHP的环境了.一直使用的本地代理服务器都是nginx,虽然P ...

  9. centos6.8服务器配置之编译安装PHP、配置nginx

    php version 5.6.31.nginx version: nginx/1.10.2 1.下载: wget http://cn2.php.net/distributions/php-5.6.3 ...

随机推荐

  1. 由浅入深之Tensorflow(3)----数据读取之TFRecords

    转载自http://blog.csdn.net/u012759136/article/details/52232266 原文作者github地址 概述 关于Tensorflow读取数据,官网给出了三种 ...

  2. CentOS随笔 - 4.CentOS7安装MySql 5.5.60(下载 tar 方式安装)

    前言 转帖请注明出处: http://www.cnblogs.com/Troy-Lv5/ 由于公司也有php+mysql的项目, 所以今天也把Mysql装了一遍. 为了与以前的程序和数据库兼容, 这次 ...

  3. c++编程和c在思想上最大的差别

    从正规的血统上来说,c++跟java一样是面向对象编程语言,而c是面向结构的编程语言.但是,在现实中,有大量的系统虽然用cpp编写,但是100%跟java一样,使用面向对象的几乎没有,绝大部分都是结合 ...

  4. 03: itchat发送微信消息

    1.1 微信机器人自动回复消息 1.运行程序,会弹出二维码,扫描授权后即可实现自动回复信息 参考01  参考02 #coding=utf8 import itchat, time from itcha ...

  5. 20145318《网络对抗》MSF基础应用

    20145318 <网络对抗> MSF基础应用 实验内容 掌握metasploit的基本应用方式,掌握常用的三种攻击方式的思路.具体需要完成(1)一个主动攻击,如ms08_067;(2)一 ...

  6. bootstrap的 附加导航Affix导航 (侧边窄条式 滚动监控式导航) 附加导航使用3.

    affix: 意思是粘附, 附着, 沾上. 因此, 附加导航就是 bootstrap的 Affix.js组件. bootstrap的 附加导航, 不是说导航分成主导航, 或者什么 副导航的 而是指, ...

  7. Docker 下安装 Spark

    1. 安装Docker, 见上篇. 2. 安装ubuntu:    docker run --name dcSpark ubuntu 3. 运行 Bash:     docker exec -ti d ...

  8. mysql链接 显示 error: 'Access denied for user 'root'@'localhost' (using password: NO)'

    解决方案 https://stackoverflow.com/questions/2995054/access-denied-for-user-rootlocalhost-using-password ...

  9. 筛选出sql 查询结果中 不包含某个字符

    select * from table1 where patindex('%关键字%' , aa) = 0 select * from table1 where charindex('关键字' , a ...

  10. php跨域

    <?php header('Content-type:text/html; charset="utf-8"'); $url = 'http://10.32.41.194:80 ...