美文网首页全栈工程师修炼首页投稿(暂停使用,暂停投稿)编程学习
小白从零开始用SSH在Linux服务器上构建Wordpress网

小白从零开始用SSH在Linux服务器上构建Wordpress网

作者: Solomon_Xie | 来源:发表于2016-02-24 06:14 被阅读3786次

    最近对网络开发的性质大发,由最简单的东西开始一步一步入门,不知不觉一个月间就学到了我难以想象多的知识. 虽然Wordpress会被一些高端开发者鄙视, 尤其是它是基于PHP的(其实我也不适应,因为我是主要学习Python研发的), 但是作为一个领你入门的师父,Wordpress毫无疑问是把你你领从零基础领到高端的好师父! 下文就是我这几天以Wordpress为契机,研究在各种网络服务器的成果. 内置一些常见的坑及跳坑的方法.

    先给自己配个服务器(VPS)吧

    其实前些天免费在AWS的EC2上面构建服务器,感觉还是很爽很好玩的.
    可是昨天,一想到1年以后就要说白白了,就心有余悸.
    因为正式收费貌似很贵不打算续费,所以又看了看国内一些既稳定又靠谱的VPS商,阿里云之类.
    感觉他们都还是贵,一年要上千.
    各种搜索后,终于决定试一试国内国外都大名鼎鼎的DigitalOcean.

    插曲:DigitalOcean官网被"半墙"

    DigitalOcean官网首页能打开,说明没有被墙.
    但是正式注册的页面,以及登录后的页面,都完全没有样式好难看啊!
    必应了下,发现原来Gov没有屏这个网站,而是屏了它的css站 -_-!
    解决方法好简单:

    1. 在出错页面上F12打开Console控制台,发现红色出错文件,把地址复制下来.
      就是这个:cloud-cdn-digitalocean-com.global.ssl.fastly.net
    2. 搜个"在线DNS检测"的网站, 把刚才的地址复制进去,
      开始检查DNS,得到一大堆响应IP, 记住几个个TTL值最小的.
    3. 然后找到本机的hosts文件, Windows在C:\Windows\System32\drivers\etc\这个地方,有个叫hosts的文件.
    4. 用文本编辑器打开它, 在最下面按照185.31.18.249 cloud-cdn-digitalocean-com.global.ssl.fastly.net这种格式,
      把刚才找到的访问良好的IP地址填进去,每个一行.
    5. 保存. 这时在打开DigitalOcean的后台页面,就已经正常了:)

    购买DigitalOcean服务器

    然后是购买环节啦,因为在视频里看到才5美元一个月,还不是国内那种廉价空间,
    算一个VPS, 还能通过SSH把它当自己电脑一样任意操控, 性价比太高了! 于是我毫不犹豫的打开选购页面.
    以前以为国外服务器都好高端,我又没有国外银行卡有没有paypal怎么办? 实际上一点问题都没有!
    我试了下,把国内的500块钱工行驾照配的牡丹信用卡注册上,成功!
    不过当时竟然没有扣费环节,比较纳闷. 必应了下发现, 他们是每个月1号扣费的.
    接下来就是创建服务器实例了.
    花了不到几十秒钟就创建了一个叫"Droplet"小水滴的服务器(在AWS和阿里云中叫做实例),选择安装了Ubuntu 15.
    第一步当然是创建一个Image镜像,省得玩坏了没法初始化.
    顺便还给配了一个"Floating IP",所谓的浮动静态IP.
    其实就是相当于AWS的"Elastic IP",原理一样:
    给你一个固定的IP, 你可以不用服务器本身的公网IP, 而把它绑定上去.
    如果你注销这个服务器, 你的IP还是不会变,可以再绑定到另一个服务器上.
    这样一来你也不用再到自己的域名解析处改一遍对应IP了.

    用SSH连接服务器

    因为之前在AWS上混了几天, 又在阿里云上给客户部署网站, 用SSH控制远程主机已经很熟练了.
    所以DigitalOcean这里也没费功夫.
    过程很简单,如果是Linux/Mac电脑,直接在终端用SSH命令就可以了.
    如果像我一样用Windows, 那就下载个绿色/单文件软件--大名鼎鼎的Putty.exe.用它就就ok.
    打开软件后,在HostName处输入服务器给的公网IP, 选择SSH连接,然后点击Open, 连接上了哈哈!
    输入用户名密码就可以开始随意操作了,像linux本机一样.
    这里略过了很多细节,是因为不想重复网上各种教程.

    在Linux上安装Wordpress环境

    我真是个小白,但是是个爱学习爱尝试的小白. 所以借着各种不同的机会尝试了不同的环境搭建方法.

    第一种尝试 - XAMPP

    我是真的小白,因为之前在电脑本机装wordpress,图个简单,用的是一键安装XAMPP,很方便.

    第二种尝试 - AWS上的LAMP

    然后在AWS上面,用的是LAMP, 不算一键安装但是也照着各种教程复制粘贴出来了环境.

    第三种尝试 - 阿里云一键安装环境

    再然后到阿里云上,试了试阿里云推荐的阿里云linux一键安装web环境的安装包.
    还真的是一键安装,好快, 但是! 但是:

    1. 所有所有所有文件都默认安装的/aliyundata/这个目录,有点个性.还得重新去研究它的目录结构.
    2. 运行老出错,出了错,还不容易百度出问题答案--因为用的人太少了.
    3. 最让人烦的是--默认安装phpwind,一个比较丑的论坛搭建平台.
      而且这个phpwind是作为网站根目录的,连phpmyadmin都部署在其下.卸载是个非常困难的事.
      因为这个一键安装,好多东西全都乱了.不得已要重启服务器.
      因为重启需要短信验证,我给客户打了个电话, 告诉我验证码-_-
      重启后,重装系统,恢复初始设置. 吸取教训,做了个镜像备份.

    第四种尝试 - Lamp

    然后又学者用另一个一键安装LAMP环境的著名方法:tasksel
    语法极其简单:直接输入tasksel回车,就出现一个相对好看的有颜色的页面.
    选择lamp, 按回车,就开始一键安装了.
    过程中出现几个输密码的环节.然后等十来分钟,就全好了.
    可是问题仍然存在: 老是报mysql的错误.
    所以针对mysql搜索了好几个地方,浏览了数十篇文章. 终于找到靠谱方案了:

    找到/etc/mysql/文件夹,发现里面没有my.cnf这个必要文件,
    还好有一个叫my.cnf.bak的备份,复制出一份.再次运行安装mysql-server就正常了.

    然后apt-get install phpmyadmin,过程中选apache2, 输入密码后,等一会就完成了.

    第五种尝试 - Nginx

    回到当前的DigitalOcean服务器上, 我厌倦了之前那些尝试, 再试试新方法看看会不会方便点:
    最后按照youtube非常多的教学视频指示,一句命令安装好了所有依赖软件:

    root@username:~# sudo apt-get install php5-fpm nginx mysql-server php5-mysql
    

    虽然不知道这几个依赖包的顺序有什么讲究(看起来好像有一点点逻辑性?).
    但是一句话之后,除了mysql弹出界面输入密码外,其他不用管就全部搞定了.
    这时候service nginx start,就启动了nginx服务器.
    打开自己的网址, 赫然地显示着Welcome to nginx!好方便!!
    话说回来, 这林林总总的各种一键安装, 最后证明最靠谱的还是手动地指明地按照那些依赖包.

    它们虽然看似是一键装好, 可是真正装好了,后面费劲的事还多着呢. 缺点都可以堆积成山了.

    Wordpress安装 Install Wordpress

    这里实际上非常简单,因为新一代nginx的网站根目录是默认设置在和apache一样的地方/var/www/html,所以很好找.

    • 切换到网站根目录,输入wget http://wordpress.org/latest.zip.
      下载好了wp的安装包,unzip解压(提示没有unzip程序,则apt-get install unzip).
      然后为了方便,可以到ftp中修改解压后的wordpress名字为自己想要的.
      或者把所有文件拷贝到根目录,作为主站,都可以.
    • 然后就是重要的权限问题了:
      wordpress因为包含各种上传文件,下载文件,安装插件,重写url等功能,所以需要一些必要的磁盘读写权限.
      这里最方便的就是给wordpress整个目录赋权: chmod 777 -R /var/www/html/wpblog, 777代表最高权限.
      -R代表连文件夹带文件夹里所有的子文件子文件夹都执行.
      知道有的人喜欢用chown,虽然我不懂区别,但也没发现有什么问题.
      如果不是打开网址开始配置wordpress时,出现了"写入权限不够"类似错误的话, 我也不可能会学到Linux 777权限这东西.
      实际上,如果为了安全着想,没必要给整个wordpress目录授予最高权限.
      只要给wp-content文件夹授权即可.但是初次安装,wp需要读写wp-config.php文件,否则只能自己在服务器上手动创建它.
      这个权限给谁我还没想明白.
      所以如果不那么重要,直接整个目录赋予权限,就没半点问题啦.
      更高级的以后再考虑.
    • 下一步,就是需要在MySQL中为wordpress创建一个数据库了.这一步也非常简单,没遇到过错误.
      mysql -u root -p登进mysql,然后输入密码,进入后create database 数据库名;,就OK了.
      剩下所有的wordpress配置就不用手动修改wp-config.php文件了.
      那些都可以等到网站可以访问php后(配置Nginx),在网页界面上进行配置了.
    • 到了这一步是什么情景呢?
      比如我的wordpress文件夹叫wpblog, 放在/var/www/html下.
      所以当在网址中输入http://abc.com/wpblog/后,会出现403 Forbidden字样.
      那就证明,Nginx正在健康监听, 只是配置文件没有配置好罢了!

    Nginx的配置文件 Nginx Configuaration

    Linux小白的我,在之前弄乱了几个服务器后终于小心翼翼的知道,改任何配置文件都需要备份一个原始出来.
    没成想,这竟然成了我配置Nginx第一步的大错误!

    刚一开始配置Nginx就出错了 Error occured before setting up the nginx config file

    具体说来是这样的:
    教学中说,先要找到nginx的配置文件,也就是/etc/nginx/sites-available/下的default文件.
    我理所当然地在改之前复制出了一个default-backup文件.
    然后为了方便,离开终端,直接FTP中用我喜欢的编辑器打开了default文件,遵照nginx语法改了几行.
    然后重启nginx服务器.借着噩梦就开始了, 各种报错:

    root@username:~# sudo service nginx restart
    Job for nginx.service failed because the control process exited with error code. See "systemctl stat                          us nginx.service" and "journalctl -xe" for details.
    

    然后不管是start还是restart都是这句话.纳闷了.就按照出错指示,输入了systemctl status nginx.service:

    root@username:~# systemctl status nginx.service
    ● nginx.service - A high performance web server and a reverse proxy server
       Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
       Active: failed (Result: exit-code) since Tue 2016-02-23 08:27:51 EST; 22s ago
      Process: 8508 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.                          pid (code=exited, status=0/SUCCESS)
      Process: 8609 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, st                          atus=1/FAILURE)
     Main PID: 7194 (code=exited, status=0/SUCCESS)
    

    完全看不懂...当然后来也证明,这个对我排除错误完全没作用.于是又照着指示输入了第二个命令:

    root@username:~#  journalctl -xe
    -- Subject: Session 12 has been terminated
    -- Defined-By: systemd
    -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
    -- Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
    --
    -- A session with the ID 12 has been terminated.
    Feb 23 08:33:44 username sshd[8792]: Connection closed by 180.151.30.102 [preauth]
    Feb 23 08:33:45 username sshd[8770]: pam_unix(sshd:session): session closed for user root
    Feb 23 08:33:45 username systemd-logind[551]: Removed session 13.
    -- Subject: Session 13 has been terminated
    -- Defined-By: systemd
    -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
    -- Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
    --
    -- A session with the ID 13 has been terminated.
    Feb 23 08:34:06 username sshd[8795]: Connection closed by 180.151.30.102 [preauth]
    Feb 23 08:34:54 username sshd[8797]: Connection closed by 106.187.100.177 [preauth]
    Feb 23 08:35:16 username sshd[8799]: Connection closed by 180.151.30.102 [preauth]
    Feb 23 08:35:35 username sshd[8801]: Connection closed by 180.151.30.102 [preauth]
    Feb 23 08:36:33 username sudo[8806]:     root : TTY=pts/1 ; PWD=/etc/nginx/sites-available ; USER=
    Feb 23 08:36:33 username sudo[8806]: pam_unix(sudo:session): session opened for user root by root(
    Feb 23 08:36:33 username sudo[8806]: pam_unix(sudo:session): session closed for user root
    Feb 23 08:36:48 username sudo[8829]:     root : TTY=pts/1 ; PWD=/etc/nginx/sites-available ; USER=
    Feb 23 08:36:48 username sudo[8829]: pam_unix(sudo:session): session opened for user root by root(
    Feb 23 08:36:48 username sudo[8829]: pam_unix(sudo:session): session closed for user root
    Feb 23 08:36:50 username sshd[8852]: Connection closed by 180.151.30.102 [preauth]
    Feb 23 08:37:25 username sshd[8854]: Connection closed by 180.151.30.102 [preauth]
    Feb 23 08:37:57 username sshd[8856]: Connection closed by 101.200.80.28 [preauth]
    Feb 23 08:38:03 username sshd[8858]: Connection closed by 180.151.30.102 [preauth]
    

    完全不懂.事实证明这段话也对我没什么用. 然后我就开始了谷歌之旅(国内这个问题的回答极少).
    最简短的回答就是,如果同时安装了apache服务器,那么把apache2或者httpd服务关掉就ok了.
    但是我没装apache啊,所以问题不算解决.
    还有其他谷歌到的回答,也都很少有直接解决的.试了一些命令,也都没用.
    这时开始急躁了.
    然后就试着卸载nginx,发现为什么卸载了后nginx的配置文件夹还在呢?
    也许要加purge参数?可是我不会用,而且怕删错其他东西.所以先不管.
    再安装一遍nginx,问题仍然没变.
    我又换个方法,到Stackoverflow上面去搜.
    换着关键词关键句搜了好几种,才搜出来一种答案比较多的.
    看了十来篇答案吧,有一个回答中说了依据输入nginx -t查看什么,忘了.
    我看命令很简单,也不像会破坏环境什么的,就试着输了一下,返回以下结果:

    root@username:~# nginx -t
    nginx: [emerg] a duplicate default server for 0.0.0.0:80 in /etc/nginx/sites-enabled/default-backup:                          17
    nginx: configuration file /etc/nginx/nginx.conf test failed
    

    就两句话,然后都了一下,眼睛瞪大--恍然大悟!
    原来问题出在这里: 我为了备份,而创建了一个叫default-backup的文件,
    没想到这小子与default文件冲突: nginx会读取sites-availabesites-enabled文件夹中的每一份文件,如果一个文件夹下有两个这文件,nginx就会全部读取.
    那文件中第17行是对80端口的监听,声明两遍,当然会显示一个a duplicate default server for 0.0.0.0:80了!
    所以....我迅速的....没直接删掉备份文件,而是先下载到了本地桌面,再删掉.
    此时再输入nginx -t,大功告成!返回:

    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    
    

    简单两句,看着真给力.
    这下大概能猜到了,nginx -t大概是测试nginx配置文件语法的, 也就是debug用的.
    如果哪里配置语法或逻辑写错了,这里会显示出来.
    service nginx start,紧接着打开浏览器自己的网址, Welcome to nginx!看着激动人心啊哈哈!

    也许这就是程序世界的乐趣吧. 这个世界汇集的都是一些喜欢玩解谜游戏的小孩子.

    Real configuration for Nginx

    教程里都是Linux老油条们在SSH里直接ViNano来编辑这些配置文件的,虽然改动不多看起来不难.
    但是我个性还是有点特别,在我正式学ViNano之前, 一点都不想碰.
    所以还是用简单好理解的方法不给自己添堵, 直接在Filezilla这个多数人都在用的FTP,
    右键点击/etc/nginx/sites-available/default这个文件,点击view,
    用我默认的sublime编辑器打开,设好nginx语法高亮.
    简单浏览了下. 除去注释后,基本就这么几句话,结构很简单:

    server {
        listen 80 default_server;
        listen [::]:80 default_server;
        root /var/www/html;
        index index.html index.htm index.nginx-debian.html;
        server_name _;
        location / {
            try_files $uri $uri/ =404;
        }
    }
    

    之前看过两三集的nginx教程, 有那么一点点印象而已.
    反正好像是一个server{...},代表一个站点.
    你并排多写几个server{...}块,就能同时拥有好几个站点,比如一个基于php的wordpress站点,一个基于python的django站点.
    我猜的哈. 反正对现在阶段来说 ,这是真的无所谓的.
    我的经验是,

    新手学东西不能怕错,但是不能少了猜.

    如果有人看到这里,也请不要嫌我业余.
    我反倒觉得这代表着一种非常实际的心理历程,更容易帮助和我一样的新人体会这个过程.

    继续猜上面的语法.

    • listen 80 default_server;好像是说默认服务器会监听80端口.
      listen [::]:80 default_server;就不知道了,看下一句.
    • root /var/www/html;这个好理解,那就是网站(也叫站点, 应用, app等)的根目录位置.
      看到一些老视频,好像过去nginx的默认根目录在/usr/share/html这里.
      新nginx改到这里更好,和apache一样,省得去记别的了.
    • server_name _;这个,估计是站点名字或者网址吧?
    • location / {...}这可能定义根目录的一些url地址问题?
    • try_files $url $url/ =404,这个还真有点不好猜,只知道估计是和404文件未找到有关.

    然后就可以开始正式学习nginx语法了.
    老样子,到youtube上面找各种好看好玩好懂的教学视频.
    插一句关于youtube上学习这事, 自从考过雅思后, 词汇量和听力都上了一个高度, youtube观看英语视频几乎没有障碍.
    且实际上,IT技术方面的视频, 即使它是德语法语的,也能看懂.
    但是不懂英语的话, 连搜什么关键词都不知道-_-!

    通过这个事我才透彻地意识到,学好外语, 翻过那堵墙, 真真正正的像进入了一个新世界, 一切都很新鲜很方便.

    切实体会到了我们与他们之间的差距在哪.
    看了几个视频后,有点体会就是:
    怎么好像每个人的配置都不太一样?不是指的目录地址和站点名称不一样, 怎么好像逻辑都不一样?

    见招拆招, 于是我回到了默认的/etc/nginx/sites-available/default文件,用带语法高亮的sublime编辑器读了一下.发现最上头的说明好像说得很地道很实在:

      ##
      # You should look at the following URL's in order to grasp a solid understanding
      # of Nginx configuration files in order to fully unleash the power of Nginx.
      # 你应该看看下面这些地址来加强理解Nginx的配置文件, 并最终能够释放Nginx的真正实力
      # http://wiki.nginx.org/Pitfalls
      # http://wiki.nginx.org/QuickStart
      # http://wiki.nginx.org/Configuration
      #
      # Generally, you will want to move this file somewhere, and start with a clean
      # file but keep this around for reference. Or just disable in sites-enabled.
      # Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.
      ##
    

    然后我看到了QuickStart快速入门的字样, 就打开了这个网址,翻了下看到竟然有wordpress,
    喜出望外--因为已经掌握了wordpress, 用已知的东西来理解nginx是最好不过了.
    然后翻到wordpress处,发现官网早已经给好了"配方". 且每句都有注释来解释,非常友好.

    # Upstream 用来抽象化php的后端连接
    upstream php {
            server unix:/tmp/php-cgi.socket;
            server 127.0.0.1:9000;
    }
    
    server {
            ## 把你的网址放在这里,如baidu.com
            server_name baidu.com;
            ## 只此一处的站点根目录地址的声明
            root /var/www/wordpress;
            ## 这句应该写在http区块(类似http {...}这样的)里,
            ## 如果你写了http区块,就没必要放在这.
            index index.php;
    
            ## (设置网站favicon.ico图标的访问逻辑,)
            location = /favicon.ico {
                    # (如果没找到这个文件,则不适用规则)
                    log_not_found off;
                    access_log off;
            }
    
            ## (设置robots.txt的访问逻辑)
            ## (允许所有对它的访问(因为每个访问者都应该遵守嘛))
            location = /robots.txt {
                    allow all;
                    # (如果没找到这个文件,则不适用规则)
                    log_not_found off;
                    access_log off;
            }
    
            ## (根目录的访问逻辑. 注:"/"代表根目录)
            location / {
                    # 这句话巨酷, 因为没有php会被当成静态文件访问
                    # 加入"?$args"这部分后, 非默认的固定链接在使用url查询字串时就不会中断
                    try_files $uri $uri/ /index.php?$args;
            }
    
            ## (目录中所有.php文件的访问逻辑)
            location ~ \.php$ {
                    #注意: 你应该在php.ini中写了"cgi.fix_pathinfo = 0;" 这句话.
                    # (引入fastcgi.conf这个文件)
                    include fastcgi.conf;
                    # (fastcgi相关的报错:开) 
                    fastcgi_intercept_errors on;
                    fastcgi_pass php;
            }
    
            ## (目录中所有的js|css|png|jpg|jpeg|gif|ico文件访问逻辑)
            location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
                    ## 最大过期期限
                    expires max;
                    ## 如果没有找到这个文件 则不适用规则
                    log_not_found off;
            }
    }
    

    上面的中文是我自己翻译的, 带括号的注释中是我根据字面意思猜测的.
    简单的翻译官网注释后,好像有点了解怎么回事了. 页面中往下翻,还有一段可选的代码配置:

    location /wordpress {
            try_files $uri $uri/ /wordpress/index.php?$args;
    }
    
    location ~ \.php$ {
            fastcgi_split_path_info ^(/wordpress)(/.*)$;
    }
    

    上面说是,如果你想把wordpress作为一个子目录(而不是网站的根目录)使用,那你应该在上面总配置中相应位置加上这几句代码.
    根据字面意思理解, 应该是加入了一个/wordpress子目录的访问逻辑, 并为所有php文件的访问逻辑中加入了/wordpress子目录专门的地址解析规则.
    往下翻, 有一段Rewrite相关配置. 玩过Wordpress的都知道Rewrite重写规则的重要性.
    在Apache服务器中, 如果.htaccess文件和apache的rewrite模块文件没有写对的话,wordpress就无法使用固定链接或称伪链接这种好玩意了.
    官网对于重写的完整配置(包括刚才的主配置)如下:

    
    map $uri $blogname{
        ~^(?P<blogpath>/[^/]+/)files/(.*)       $blogpath ;
    }
    
    map $blogname $blogid{
        default -999;
    
        #Ref: http://wordpress.org/extend/plugins/nginx-helper/
        #include /var/www/wordpress/wp-content/plugins/nginx-helper/map.conf ;
    }
    
    server {
        server_name example.com ;
    
        root /var/www/example.com/htdocs;
        index index.php;
    
        location ~ ^(/[^/]+/)?files/(.+) {
            try_files /wp-content/blogs.dir/$blogid/files/$2 /wp-includes/ms-files.php?file=$2 ;
            access_log off;     log_not_found off; expires max;
        }
    
        #avoid php readfile()
        location ^~ /blogs.dir {
            internal;
            alias /var/www/example.com/htdocs/wp-content/blogs.dir ;
            access_log off;     log_not_found off; expires max;
        }
    
        if (!-e $request_filename) {
            rewrite /wp-admin$ $scheme://$host$uri/ permanent;
            rewrite ^(/[^/]+)?(/wp-.*) $2 last;
            rewrite ^(/[^/]+)?(/.*\.php) $2 last;
        }
    
        location / {
            try_files $uri $uri/ /index.php?$args ;
        }
    
        location ~ \.php$ {
            try_files $uri =404;
            include fastcgi_params;
            fastcgi_pass php;
        }
    
        #add some rules for static content expiry-headers here
    }
    

    这里官网的注释解释不多,而且很难字面上理解了, 所以先跳过.
    到这里, 就不是我能简单猜出来的了.
    而且看起来也不像是复制粘贴能行的?
    所以还是带着问题回到youtube, 看看别人都是怎么配置的.
    现在,感觉自己离"真相"已经不太远了.
    其实youtube上专门为了wordpress配置nginx的视频并不多,这点令我好奇.
    之前国内翻阅文章时看到恩多次在ngingx上配置wordpress的文章,可是国外并不流行?
    总之,看了几个靠谱的视频后发现,他们的配置到我这里都用不了.
    于是修改关键词搜索, 搜php与nginx, 学到了几个最简单方法的配置.
    当然还是不管用,不过当我再回头看官网的这段专为wordpress的配置, 就明白了需要修改哪里了.
    简单修改后,终于成功! 默认的最简单最靠谱的配置如下(这里面你哪句话都不用改就可以用):

    # Upstream to abstract backend connection(s) for php
    upstream up_php {
            server unix:/var/run/php5-fpm.sock;
            server 127.0.0.1:9000;
    }
    
    server {
            server_name _;
            root /var/www/html;
            index index.php;
    
            location = /favicon.ico {
                    log_not_found off;
                    access_log off;
            }
    
            location = /robots.txt {
                    allow all;
                    log_not_found off;
                    access_log off;
            }
    
            location / {
                    try_files $uri $uri/ /index.php?$args;
            }
    
            location ~ \.php$ {
                    include fastcgi.conf;
                    fastcgi_pass up_php;
            }
    
            location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
                    expires max;
                    log_not_found off;
            }
    }
    

    然后重启nginx.哒哒哒!经典的wordpress配置页面出现啦!剩余步骤30秒内全部完成!哈哈,太高兴了.

    现在再回头写写从这部分学到的经验,感觉真的很宝贵:

    Nginx配置时的一些经验 Experiences for Nginx configuaration

    配置文件的目录 Config file position: sites-enabled & sites-availabe

    在配置文件夹中,/etc/nginx/sites-enabled/文件夹非常重要.
    它里面只有1个链接文件,链接指向同级目录sites-available/中的default文件.
    主要配置都是在这里写,同样的这个目录中只能有1个文件.
    即1个主轴文件,可以写其他任意个被主轴引用的分支文件.
    就像官网提醒的,如果不想随便改default应当把它挪走,然后自己另写一个.
    我试过成功的做法是:

    1. 把default挪到外面随便什么地方.
    2. 然后在sites-available/中建一个随便名字的文件,比如nginx-test.
    3. 然后再到sites-available/中创建一个它的快捷方式:
      ln -s /etc/nginx/sites-available/nginx-test nginx-test.
      这样一来nginx就会先读取'sites-enabled/',然后跳转到sites-available/的对应配置了.

    调试配置文件 Debug Configs

    • 之前说到的nginx -t,还真的是极其好用的调试命令.
      用法是:每次修改完配置文件,然后输入nginx -t,就会告诉你,语法对不对,文件引用逻辑对不对, cgi对不对等等.如果不对的话会告诉你再哪行出错. 多方便~
      最后如果这一步通过了,那么就可以重启nginx正确运行了.
    • 如果上一个命令不够,那么还有一个方法:
      就是到/var/log/nginx/中,查看accesses.logerrors.log.
      这两个文件一个告诉你每次都有谁访问了网站,另一个告诉你服务器都出现了哪些异常状态.
      两个文件都写得很简单,很容易从字面上理解.
      尤其是errors.log,一眼就能看出来是哪个地方配置出错了.

    Nginx对PHP的配置 Nginx Config for PHP

    为了Wordpress正确运行, 那肯定是要配置PHP了.
    当然如果只要普通的php文件,那不用写上边那么多.
    站点必须要处理多媒体文件之类,所以才多写了那些句子.
    真正为了解析php的,是其中的:

    upstream up_php {
            server unix:/var/run/php5-fpm.sock;
            server 127.0.0.1:9000;
    }
    

    location ~ \.php$ {
            include fastcgi.conf;
            fastcgi_pass up_php;
    }
    

    从youtube视频上学到的是,php解析的确要用到upstream上流这个模块了.
    其中需要指定解析的方式是unix的php5-fpm.sock这个东西.
    而location对于所有php文件的解析模块中, fastcgi_pass up_php是指,将所有php文件都传到刚才定义的upstream模块中(即php5-fpm.sock文件)进行处理.
    剩下的include fastcgi.conf,就是引用外部一个文件了.
    这个文件中只有一些简单的默认配置,无需我们修改也能正常运行网站.
    根据视频教学中,很多人还会修改php5-fpm的配置,那就又是另一种语法了,对新手一点都不友好.
    而且像nginx配置一样也会常写错,要debug调试.
    顺带一提的是,调试方法几乎一样:先php5-fpm -t,不行的话就再打开/var/log/php5-fpm.log查看错误信息.
    修改通过后,用service php5-fpm restart重启就OK了.
    不过我的测试中,偷懒不修改它,就这样保持默认也能正常运行Wordpress :)

    好啦,到此为止,从零开始的整个LNMP+Wordpress笔记就已经完成了.欢迎来评论区聊天.

    相关文章

      网友评论

      • 葵尐能:thanks for your information help to with me resolved the issues . thanks .
        Solomon_Xie:@葵尐能 No worries it's always been my pleasure to help others getting things done :)
      • ce2fc3556c61:关于你解释的Nginx的配置文件说得真好。我折腾了两天,总感觉Nginx与WordPress的php文件冲突,现在有点明白怎么回事了
      • 4294c97d1140:很详细正打算自己搭一个博客,受教了
        Solomon_Xie:@缘与你 那我们的进度差不了多少~

      本文标题:小白从零开始用SSH在Linux服务器上构建Wordpress网

      本文链接:https://www.haomeiwen.com/subject/qofikttx.html