LNMP架构之环境搭建

Wesley13
• 阅读 859

本文索引:

  • LAMP架构介绍
  • Mysql的安装
  • PHP的安装
  • Nginx介绍
  • Nginx的安装

LNMP架构介绍

LNMP = Linux + Ningx + Mysql + PHP

LNMP架构之环境搭建

由Nginx取代apache,提供web服务;

PHP作为一个独立服务存在而非apache的一个模块,这个服务为php-fpm;

Nginx直接处理静态请求,动态请求会转发给php-fpm。

Nginx在处理静态文件的速率较Apache要快的多,这时两者的底层设计所决定的。同时Nginx可以处理的并发访问量也较Apache要大的多,毕竟Apache创建之初并没有考虑到当今的高并发访问量的规模会如此之大。Apache采用的是多进程的方式,对内存的要求会较高,而且有限制;Nginx采用多线程的方式,在内存消耗方面要比Apache好的多。


Mysql的安装

Mysql安装的方法与LAMP架构中一致

可能缺少的软件包:

[root@localhost src]# yum install -y perl-Data-Dumper libaio-devel

具体操作如下:

  • 解压软件包,重命名并移动至/usr/local

    [root@localhost src]# tar zxf mysql-5.6.36-linux-glibc2.5-x86_64.tar.gz [root@localhost src]# mv mysql-5.6.36-linux-glibc2.5-x86_64 /usr/local/mysql

  • 创建相关目录和用户

    [root@localhost src]# cd /usr/local/mysql/ [root@localhost mysql]# useradd mysql [root@localhost mysql]# mkdir /data

  • 初始化

    [root@localhost mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql

  • 配置my.cnf

    [root@localhost mysql]# cp support-files/my-default.cnf /etc/my.cnf [root@localhost mysql]# vi /etc/my.cnf "修改[mysqld]内的2行即可 basedir = /usr/local/mysql datadir = /data/mysql 保存退出"

  • 配置自启动脚本

    [root@localhost mysql]# cp support-files/mysql.server /etc/init.d/mysqld [root@localhost mysql]# vi /etc/init.d/mysqld "同样要修改一下参数 basedir=/usr/local/mysql datadir=/data/mysql"

  • 配置开启启动并启动服务

    [root@localhost mysql]# chmod 755 /etc/init.d/mysqld [root@localhost mysql]# chkconfig --add mysqld [root@localhost mysql]# service mysqld start


本人安装过程中报的一个错(读安装过程报错十分重要)

...
./bin/mysqld: Can't create/write to file '/tmp/iboFQUc3' (Errcode: 30 - Read-only file system)
...

发现是我之前在tmp下挂载了磁盘镜像,mysql_install_db脚本对/tmp目录又有写权限导致的错误。执行umount /tmp后,脚本运行正常。


PHP的安装

PHP的安装的部分参数较LAMP不同

  1. 解压压缩包

    [root@localhost src]# tar zxvf php-5.6.30.tar.gz [root@localhost src]# cd php-5.6.30

  2. 创建用户php-fpm

    [root@localhost src]# useradd -M -s /sbin/nologin php-fpm

  3. 安装依赖包

    [root@localhost php-5.6.30]# yum install -y epel-release [root@localhost php-5.6.30]# yum install -y gcc gcc-c++ libxml2-devel openssl-devel libcurl-devel libjpeg-devel libpng-devel freetype-devel libmcrypt-devel

  4. 编译安装

    [root@localhost php-5.6.30]# ./configure --prefix=/usr/local/php-fpm --with-config-file-path=/usr/local/php-fpm/etc --enable-fpm --with-fpm-user=php-fpm --with-fpm-group=php-fpm --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-pdo-mysql=/usr/local/mysql --with-mysql-sock=/tmp/mysql.sock --with-libxml-dir --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-iconv-dir --with-zlib-dir --with-mcrypt --enable-soap --enable-gd-native-ttf --enable-ftp --enable-mbstring --enable-exif --with-pear --with-curl --with-openssl [root@localhost php-5.6.30]# make && make install

php7版本已经取消--with-mysql参数,编译安装时该参数不写,写了会报错

  1. 修改配置文件

    [root@localhost php-5.6.30]# cp php.ini-production /usr/local/php-fpm/etc/php.ini [root@localhost php-5.6.30]# cd /usr/local/php-fpm/etc [root@localhost etc]# vi php-fpm.conf [root@localhost etc]# cat php-fpm.conf [global] # 定义全局参数 pid = /usr/local/php-fpm/var/run/php-fpm.pid error_log = /usr/local/php-fpm/var/log/php-fpm.log [www] # 模块名 listen = /tmp/php-fcgi.sock # 监听socket #listen = 127.0.0.1:9000 listen.mode = 666 # 监听是socket才会生效 user = php-fpm # 定义用户 group = php-fpm # 定义组 pm = dynamic pm.max_children = 50 pm.start_servers = 20 pm.min_spare_servers = 5 pm.max_spare_servers = 35 pm.max_requests = 500 rlimit_files = 1024

  2. 设置启动脚本,并设置开机启动

    启动脚本模板文件在/usr/local/src/php-5.6.30/sapi/fpm/init.d.php-fpm

    [root@localhost etc]# cd /usr/local/src/php-5.6.30 [root@localhost php-5.6.30]# cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm [root@localhost php-5.6.30]# chmod 755 /etc/init.d/php-fpm [root@localhost php-5.6.30]# chkconfig --add php-fpm [root@localhost php-5.6.30]# chkconfig --level 345 php-fpm on

  3. 启动php-fpm服务

    [root@localhost php-5.6.30]# service php-fpm start Starting php-fpm done

php-fpm脚本用法

相对于LAMP中php安装目录,LNMP安装的php多了一些文件、目录

[root@localhost php-5.6.30]# ls /usr/local/php-fpm/
bin  etc  include  lib  php  sbin  var
[root@localhost php-5.6.30]# ls /usr/local/php-fpm/var/
log  run

# sbin目录下是php-fpm启动脚本
[root@localhost php-5.6.30]# ls /usr/local/php-fpm/sbin/
php-fpm
  • 查看编译参数

    [root@localhost php-5.6.30]# /usr/local/php-fpm/sbin/php-fpm -i | grep -i configure [19-Dec-2017 22:10:30] NOTICE: PHP message: PHP Warning: Unknown: It is not safe to rely on the system's timezone settings. You are required to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone. in Unknown on line 0 Configure Command => './configure' '--prefix=/usr/local/php-fpm' '--with-config-file-path=/usr/local/php-fpm/etc' '--enable-fpm' '--with-fpm-user=php-fpm' '--with-fpm-group=php-fpm' '--with-mysql=/usr/local/mysql' '--with-mysqli=/usr/local/mysql/bin/mysql_config' '--with-pdo-mysql=/usr/local/mysql/' '--with-mysql-sock=/tmp/mysql.sock' '--with-libxml-dir' '--with-gd' '--with-jpeg-dir' '--with-png-dir' '--with-freetype-dir' '--with-iconv-dir' '--with-zlib-dir' '--with-mcrypt' '--enable-soap' '--enable-gd-native-ttf' '--enable-ftp' '--enable-mbstring' '--enable-exif' '--with-pear' '--with-curl' '--with-openssl'

  • 查看php的模块

    [root@localhost ~]# /usr/local/php-fpm/sbin/php-fpm -m [PHP Modules] cgi-fcgi Core ctype curl date dom ereg exif fileinfo filter ...

  • 检查php-fpm配置文件语法

    [root@localhost ~]# /usr/local/php-fpm/sbin/php-fpm -t [02-Jan-2018 21:43:03] NOTICE: configuration file /usr/local/php-fpm/etc/php-fpm.conf test is successful

安装过程报错提示及解决方法

  • "error: xml2-config not found."

    yum install -y libxml2-devel

  • "error: Cannot find OpenSSL's <evp.h>"

    yum install -y openssl-devel

  • "error: Please reinstall the libcurl distribution"

    yum install -y libcurl-devel

  • "error: jpeglib.h not found"

    yum install -y libjpeg-devel

  • "error: png.h not found"

    yum install -y libpng-devel

  • "error: freetype-config not found"

    yum install -y freetype-devel

  • "error: mcrypt.h not found"

    yum install -y epel-release yum install -y libmcrypt-devel


Nginx介绍

官网 nginx.org,由俄罗斯程序员开发的一种web服务器,小巧而强大。Ningx在处理静态文件方便较apache更好,被更多国内外网站也采用。Ningx可以通过外接模块来扩展功能,这点与apache一样。

Ningx不仅可以应用于web服务,同样可以用于反向代理服务以及负载均衡。

Nginx是一个开源的软件,淘宝基于其开发的Tengine,在使用上与其一致,其内的服务名、配置文件等都一致,不同的是它添加了一些定制化的模块,在安全限速方面的表现很好,另外还支持对js、css合并功能。

openresty:一个由Nginx核心+lua相关组件和模块组成的支持lua的高性能web容器。

Nginx安装

当前最新稳定版:http://nginx.org/download/nginx-1.12.2.tar.gz

  • 下载并解压

    [root@localhost ~]# cd /usr/local/src [root@localhost src]# wget http://nginx.org/download/nginx-1.12.2.tar.gz --2017-12-24 22:22:26-- http://nginx.org/download/nginx-1.12.2.tar.gz 正在解析主机 nginx.org (nginx.org)... 206.251.255.63, 95.211.80.227, 2606:7100:1:69::3f, ... 正在连接 nginx.org (nginx.org)|206.251.255.63|:80... 已连接。 已发出 HTTP 请求,正在等待回应... 200 OK 长度:981687 (959K) [application/octet-stream] 正在保存至: “nginx-1.12.2.tar.gz”

    100%[============================>] 981,687 74.1KB/s 用时 9.3s

    2017-12-24 22:22:36 (103 KB/s) - 已保存 “nginx-1.12.2.tar.gz” [981687/981687])

    [root@localhost src]# tar zxf nginx-1.12.2.tar.gz

  • 编译、安装

    [root@localhost src]# cd nginx-1.12.2 [root@localhost nginx-1.12.2]# ./configure --prefix=/usr/local/nginx [root@localhost src]# make && make install

  • 创建启动脚本

    [root@localhost nginx-1.12.2]# vim /etc/init.d/nginx #!/bin/bash

    chkconfig: - 30 21

    description: http service.

    Source Function Library

    . /etc/init.d/functions

    Nginx Settings

    NGINX_SBIN="/usr/local/nginx/sbin/nginx" NGINX_CONF="/usr/local/nginx/conf/nginx.conf" NGINX_PID="/usr/local/nginx/logs/nginx.pid" RETVAL=0 prog="Nginx" start() { echo -n $"Starting $prog: " mkdir -p /dev/shm/nginx_temp daemon $NGINX_SBIN -c $NGINX_CONF RETVAL=$? echo return $RETVAL } stop() { echo -n $"Stopping $prog: " killproc -p $NGINX_PID $NGINX_SBIN -TERM rm -rf /dev/shm/nginx_temp RETVAL=$? echo return $RETVAL } reload() { echo -n $"Reloading $prog: " killproc -p $NGINX_PID $NGINX_SBIN -HUP RETVAL=$? echo return $RETVAL } restart() { stop start } configtest() { $NGINX_SBIN -c $NGINX_CONF -t return 0 } case "$1" in start) start ;; stop) stop ;; reload) reload ;; restart) restart ;; configtest) configtest ;; *) echo $"Usage: $0 {start|stop|reload|restart|configtest}" RETVAL=1 esac exit $RETVAL

  • 更改配置文件权限并开机启动

    [root@localhost nginx-1.12.2]# chmod 755 /etc/init.d/nginx [root@localhost nginx-1.12.2]# chkconfig --add nginx [root@localhost nginx-1.12.2]# chkconfig nginx on

    如果无法直接使用nginx命令,则表示/etc/init.d不在PATH变量内,可以通过修改/etc/profile来添加

  • 修改配置文件

    [root@localhost nginx-1.12.2]# mv /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak

    [root@localhost nginx-1.12.2]# vim /usr/local/nginx/conf/nginx.conf user nobody nobody; worker_processes 2; error_log /usr/local/nginx/logs/nginx_error.log crit; pid /usr/local/nginx/logs/nginx.pid; worker_rlimit_nofile 51200; events { use epoll; worker_connections 6000; } http { include mime.types; default_type application/octet-stream; server_names_hash_bucket_size 3526; server_names_hash_max_size 4096; log_format combined_realip '$remote_addr $http_x_forwarded_for [$time_local]' ' $host "$request_uri" $status' ' "$http_referer" "$http_user_agent"'; sendfile on; tcp_nopush on; keepalive_timeout 30; client_header_timeout 3m; client_body_timeout 3m; send_timeout 3m; connection_pool_size 256; client_header_buffer_size 1k; large_client_header_buffers 8 4k; request_pool_size 4k; output_buffers 4 32k; postpone_output 1460; client_max_body_size 10m; client_body_buffer_size 256k; client_body_temp_path /usr/local/nginx/client_body_temp; proxy_temp_path /usr/local/nginx/proxy_temp; fastcgi_temp_path /usr/local/nginx/fastcgi_temp; fastcgi_intercept_errors on; tcp_nodelay on; gzip on; gzip_min_length 1k; gzip_buffers 4 8k; gzip_comp_level 5; gzip_http_version 1.1; gzip_types text/plain application/x-javascript text/css text/htm application/xml; server { listen 80; server_name localhost; index index.html index.htm index.php; root /usr/local/nginx/html; location ~ .php$ { include fastcgi_params; fastcgi_pass unix:/tmp/php-fcgi.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name; }
    } }

  • nginx配置文件检测

    [root@localhost nginx-1.12.2]# /usr/local/nginx/sbin/nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

  • 启动服务

    [root@localhost nginx-1.12.2]# /etc/init.d/nginx start

  • 查看是否启动成功

    [root@localhost ~]# /etc/init.d/nginx start Starting nginx (via systemctl): [ 确定 ]

    [root@localhost ~]# ps aux | grep nginx root 1302 0.0 0.0 20500 628 ? Ss 21:40 0:00nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf nobody 1307 0.0 0.2 22944 3464 ? S 21:40 0:00nginx: worker process nobody 1308 0.0 0.2 22944 3212 ? S 21:40 0:00nginx: worker process root 2386 0.0 0.0 112680 976 pts/0 R+ 21:42 0:00 grep --color=auto nginx

可能的错误

在配置自定义启动脚本之前如果使用PREFIX/sbin/nginx启动了脚本,那么可能出现如下错误:

[root@localhost nginx-1.12.2]# nginx start
Starting nginx (via systemctl):  Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details.
                                                           [失败]

解决方法是使用PREFIX/sbin/nginx -s stop先关闭nginx进程,然后使用自定义脚本启动即可。


点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
3年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
Java获得今日零时零分零秒的时间(Date型)
publicDatezeroTime()throwsParseException{    DatetimenewDate();    SimpleDateFormatsimpnewSimpleDateFormat("yyyyMMdd00:00:00");    SimpleDateFormatsimp2newS
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
3年前
Docker 部署SpringBoot项目不香吗?
  公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。  !(http://dingyue.ws.126.net/2020/0920/b00fbfc7j00qgy5xy002kd200qo00hsg00it00cj.jpg)  2
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这