一、搭建环境
-
搭建系统版本
cat /etc/redhat-release CentOS release 6.8 (Final)
二、安装nginx
2.1安装依赖包
-
安装yum源
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo yum clean all yum makecache
-
安装PCRE库
yum install pcre pcre-devel -y 查看安装: #rpm -qa pcre pcre-devel pcre-7.8-7.el6.x86_64 pcre-devel-7.8-7.el6.x86_64
-
安装openssl库
ssl加密模块需要openssl 库支持yum install openssl-devel -y 查看一下: #rpm -qa openssl-devel openssl openssl-1.0.1e-57.el6.x86_64 openssl-devel-1.0.1e-57.el6.x86_64
-
安装gcc
因为需要make编译源码,需要安装gcc,gcc-c++,glibc(glibc是GNU发布的libc库,即c运行库)yum install -y gcc glibc gcc-c++ 查看: # rpm -qa gcc glibc gcc-c++ glibc-2.12-1.209.el6_9.2.x86_64 glibc-2.12-1.209.el6_9.2.i686 gcc-4.4.7-18.el6_9.2.x86_64 gcc-c++-4.4.7-18.el6_9.2.x86_64
2.2开始安装nginx
这里选择编译安装nginx
mkdir -p /home/tools
cd /home/tools/
wget http://nginx.org/download/nginx-1.10.3.tar.gz #下载源码
tar -xvz -f nginx-1.10.3.tar.gz #解压缩
groupadd www #添加用户组
useradd -s /sbin/nologin -M www -g www #添加虚拟用户www来管理nginx,并让 它属于www用户组
查看:
id www
uid=500(www) gid=500(www) groups=500(www)
cd nginx-1.10.3
./configure --prefix=/home/application/nginx-1.10.1 --user=www --group=www --with-http_ssl_module --with-http_stub_status_module
make && make install
ln -s /home/application/nginx-1.10.1/ /home/application/nginx
启动nginx
/home/application/nginx/sbin/nginx -t #检查语法
/home/application/nginx/sbin/nginx #启动nginx
查看:
lsof -i:80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 31362 root 6u IPv4 40342 0t0 TCP *:http (LISTEN)
nginx 31363 www 6u IPv4 40342 0t0 TCP *:http (LISTEN)
curl 127.0.0.1 #检查是否启动成功
三、安装mysql
这里选择编译安装:版本为mysql-5.5.62
安装相关软件包
编译安装中需要注意的是 5.5之前的编译方式是:./configure make && make install 而5.5之后则使用:cmake。安装cmake可以yum安装也可以编译安装。
yum -y install cmake
yum install -y ncurses-devel libaio-devel #安装相关软件包
创建用户mysql管理MySQL
groupadd mysql
useradd mysql -s /sbin/nologin -M -g mysql
查看:
# id mysql
uid=501(mysql) gid=501(mysql) groups=501(mysql)
安装MYSQL
cd /home/tools/
tar -xzv -f mysql-5.5.62.tar.gz
cd mysql-5.5.62
cmake -DCMAKE_INSTALL_PREFIX=/home/application/mysql-5.5.62 \
-DMYSQL_DATADIR=/home/application/mysql-5.5.62/data - DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_ZLIB=bundled -DWITH_ZLIB=bundled -DENABLED_LOCAL_INFILE=1 -DWITH_EMBEDDED_SERVER=1 -DENABLE_DOWNLOADS=1 -DWITH_DEBUG=0
make && make install
ln -s /home/application/mysql-5.5.62/ /home/application/mysql #创建软连接去版本号
cp /home/application/mysql/support-files/my-small.cnf /etc/my.cnf #复制配置文件
初始化及配置数据库:
/home/application/mysql/scripts/mysql_install_db --basedir=/home/application/mysql/ --datadir=/home/application/mysql/data --user=mysq #--basedir指定安装目录,datadir指定数据存放目录 --user 指定用户
设置mysql目录权限:
chown -R mysql.mysql /home/application/mysql
chmod -R 1777 /tmp/
启动mysql
/home/application/mysql/bin/mysqld_safe &
设置环境变量
echo 'PATH=/home/application/mysql/bin/:$PATH' >>/etc/profile
source /etc/profile
mysql #这样就可以直接登陆了
设置开机启动
cp /home/application/mysql/support-files/mysql.server /etc/init.d/mysqld
chmod u+x /etc/init.d/mysqld
chkconfig --add mysqld
chkconfig mysqld on
设置及更改密码
mysqladmin -u root password "123456" #刚开始安装完mysql是没有密码的,这里设置登录密码为123456
mysql -u root -p123456 #用密码登录mysql
mysqladmin -uroot -p123456 password "mysql" #更改密码,将原密码123456改为mysql
三、安装php
一般php与nginx安装在一台服务器。用户的请求到达nginx服务器,nginx再把请求传递给php,php去请求后端mysql库。(nginx不支持对外程序的直接调用或者解析,所有的对外程序必须通过FastCGI接口调用)。
nginx后面有php-fpm服务,这个php-fpm服务作为独立的服务存在,可以监听ip:port 也可以监听socket,真正处理php脚本的工作是由php-fpm来完成的,而nginx仅仅是把用户的请求发给php-fpm,然后再把php-fpm的处理结果发给用户
具体过程如下图。
安装php所需要的库:
yum install -y zlib-devel libxml2-devel libjpeg-devel libiconv-devel
yum install -y freetype-devel libpng-devel gd-devel curl-devel libxslt-devel libmcrypt-devel mhash mhash-devel mcrypt
下载php源码
cd /home/tools/
tar -xf php-5.6.35.tar.bz2
cd php-5.6.35
开始安装:
./configure --prefix=/home/application/php-5.6.35 \
--with-mysql=/home/application/mysql --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 --disable-rpath --enable-xml --enable-safe-mode --enable-bcmath \
--enable-fpm --enable-sockets --enable-zip --enable-short-tags \
--enable-zend-multibyte --enable-static --with-xsl --with-fpm-user=nginx \
--with-fpm-group=nginx
出现错误:
configure: error: Don’t know how to define struct flock on this system, set --enable-opcache=no
解决办法:
ln -s /home/application/mysql/lib/libmysqlclient.so.18 /usr/lib64/
touch ext/phar/phar.phar
出现警告:
configure: WARNING: unrecognized options: --enable-safe-mode, --enable-zend-multibyte
这是因为之前 php-5.3.x 编译时加了 --enable-safe-mode --enable-discard-path --enable-fastcgi --enable-force-cgi-redirect选项,但是这个选项没必要,且会带来许多的麻烦,详解可以 google 一下,php-5.5.x 已经去掉了该选项,编译时可以 #./configure --help | grep “safe-mode” 查看一下,没有信息输出,表示已经不支持!
编译:
make && make install
出现如下信息表示安装成功:
/home/tools/php-5.6.35/build/shtool install -c ext/phar/phar.phar /home/application/php-5.6.35/bin
ln -s -f phar.phar /home/application/php-5.6.35/bin/phar
Installing PDO headers: /home/application/php-5.6.35/include/php/ext/pdo/
做一个软连接:
ln -s /home/application/php-5.6.35/ /home/application/php
复制配置文件
ls /home/tools/php-5.6.35/php.ini*
/home/tools/php-5.6.35/php.ini-development #测试环境
/home/tools/php-5.6.35/php.ini-production #生产环境
这里复制生产环境的配置(php解析配置文件):
cp /home/tools/php-5.6.35/php.ini-production /home/application/php/lib/php.ini
#复制到php安装目录lib下并命名为php.ini
php进程的配置文件(php-fpm.conf):
#cd /home/application/php/etc/
#ll
total 28
-rw-r--r-- 1 root root 1387 Jul 25 06:26 pear.conf
-rw-r--r-- 1 root root 23152 Jul 25 06:25 php-fpm.conf.default
#cp php-fpm.conf.default php-fpm.conf
#ls
pear.conf php-fpm.conf php-fpm.conf.default
启动php(php-fpm):
/home/application/php/sbin/php-fpm
报错
ERROR: [pool www] cannot get uid for user 'nginx'
ERROR: FPM initialization failed
解决:
groupadd nginx
useradd -s /sbin/nologin nginx -g nginx
#id nginx #查看
uid=502(nginx) gid=502(nginx) groups=502(nginx)
/home/application/php/sbin/php-fpm #再次启动
查看:
ps -ef |grep php-fpm
root 76358 1 0 07:04 ? 00:00:00 php-fpm: master process (/home/application/php-5.6.35/etc/php-fpm.conf)
nginx 76359 76358 0 07:04 ? 00:00:00 php-fpm: pool www
nginx 76360 76358 0 07:04 ? 00:00:00 php-fpm: pool www
root 76362 1865 0 07:06 pts/0 00:00:00 grep php-fpm
四、LNMP整合配置
调整nginx.conf配置文件
#vim nginx.conf
worker_processes 1;
error_log logs/error.log error;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#nginx vhosts config
include extra/www.conf;
include extra/bbs.conf;
include extra/blog.conf;
include extra/status.conf;
}
mkdir -p /home/application/nginx/conf/extra
touch /home/application/nginx/conf/extra/{blog.conf,bbs.conf,www.conf,status.conf}
vim blog.conf
server {
listen 80;
server_name blog.ceishi.com;
root html/blog; #放在最外面
location ~ .*\.(php|php5)?$ {
fastcgi_pass 127.0.0.1:9000; #请求抛给php
fastcgi_index index.php;
include fastcgi.conf;
}
location / {
# root html/blog;
index index.php index.html index.htm;
}
access_log logs/access_blog.log main;
}
cd /home/application/nginx/html/
mkdir -p {www,bbs,blog}
echo "blog.ceshi.com" > ./blog/index.html
cd /home/application/nginx/html/blog
测试php:
vim /home/application/nginx/html/blog/phpinfo.php
<?php
phpinfo();
?>
访问:
浏览器打开http://blog.ceishi.com/phpinfo.php
下载blog:
cd /home/application/nginx/html/blog/
wget chown -R nginx.nginx blog/wordpress-4.9.4-zh_CN.tar.gz
cd wordpress
授权nginx服务的nginx用户对WordPress有读写权限
chown -R nginx.nginx blog/
# ll
total 188
-rw-r--r-- 1 nginx nginx 418 Sep 25 2013 index.php
-rw-r--r-- 1 nginx nginx 19935 Jan 7 2018 license.txt
-rw-r--r-- 1 nginx nginx 7001 Feb 8 2018 readme.html
-rw-r--r-- 1 nginx nginx 5434 Sep 23 2017 wp-activate.php
drwxr-xr-x 9 nginx nginx 4096 Feb 8 2018 wp-admin
-rw-r--r-- 1 nginx nginx 364 Dec 19 2015 wp-blog-header.php
-rw-r--r-- 1 nginx nginx 1627 Aug 29 2016 wp-comments-post.php
-rw-r--r-- 1 nginx nginx 2930 Feb 8 2018 wp-config-sample.php
drwxr-xr-x 5 nginx nginx 4096 Feb 8 2018 wp-content
-rw-r--r-- 1 nginx nginx 3669 Aug 20 2017 wp-cron.php
drwxr-xr-x 18 nginx nginx 12288 Feb 8 2018 wp-includes
-rw-r--r-- 1 nginx nginx 2422 Nov 21 2016 wp-links-opml.php
-rw-r--r-- 1 nginx nginx 3306 Aug 22 2017 wp-load.php
-rw-r--r-- 1 nginx nginx 36583 Oct 13 2017 wp-login.php
-rw-r--r-- 1 nginx nginx 8048 Jan 11 2017 wp-mail.php
-rw-r--r-- 1 nginx nginx 16246 Oct 4 2017 wp-settings.php
-rw-r--r-- 1 nginx nginx 30071 Oct 19 2017 wp-signup.php
-rw-r--r-- 1 nginx nginx 4620 Oct 24 2017 wp-trackback.php
-rw-r--r-- 1 nginx nginx 3065 Sep 1 2016 xmlrpc.php
上面的意思是nginx服务的nginx用户对WordPress所有文件都有可执行权限不安全,解决办法是把.php文件授权收回。
find /home/application/nginx/html/blog/wordpress/ -type f -name "*.php"|xargs chown -R root.root
find /home/application/nginx/html/blog/wordpress/ -type f |xargs chmod 644 #文件644
find /home/application/nginx/html/blog/wordpress/ -type d |xargs chmod 755 #目录755
ll
total 188
-rw-r--r-- 1 root root 418 Sep 25 2013 index.php
-rw-r--r-- 1 nginx nginx 19935 Jan 7 2018 license.txt
-rw-r--r-- 1 nginx nginx 7001 Feb 8 2018 readme.html
-rw-r--r-- 1 root root 5434 Sep 23 2017 wp-activate.php
drwxr-xr-x 9 nginx nginx 4096 Feb 8 2018 wp-admin
-rw-r--r-- 1 root root 364 Dec 19 2015 wp-blog-header.php
-rw-r--r-- 1 root root 1627 Aug 29 2016 wp-comments-post.php
-rw-r--r-- 1 root root 2930 Feb 8 2018 wp-config-sample.php
drwxr-xr-x 5 nginx nginx 4096 Feb 8 2018 wp-content
-rw-r--r-- 1 root root 3669 Aug 20 2017 wp-cron.php
drwxr-xr-x 18 nginx nginx 12288 Feb 8 2018 wp-includes
-rw-r--r-- 1 root root 2422 Nov 21 2016 wp-links-opml.php
-rw-r--r-- 1 root root 3306 Aug 22 2017 wp-load.php
-rw-r--r-- 1 root root 36583 Oct 13 2017 wp-login.php
-rw-r--r-- 1 root root 8048 Jan 11 2017 wp-mail.php
-rw-r--r-- 1 root root 16246 Oct 4 2017 wp-settings.php
-rw-r--r-- 1 root root 30071 Oct 19 2017 wp-signup.php
-rw-r--r-- 1 root root 4620 Oct 24 2017 wp-trackback.php
-rw-r--r-- 1 root root 3065 Sep 1 2016 xmlrpc.php
总结:最好的授权方法
chown -R root.root /home/application/nginx/html/blog/wordpress/
find /home/application/nginx/html/blog/wordpress/ -type f|xargs chmod 644
find /home/application/nginx/html/blog/wordpress/ -type d|xargs chmod 755
mkdir /home/application/nginx/html/blog/wordpress/wp-content/uploads #创建上传目录
chown -R nginx.nginx /home/application/nginx/html/blog/wordpress/wp-content/uploads/ #授予nginx权限
访问wordpress:
浏览器输入http://blog.ceishi.com/wordpress/wp-admin/setup-config.php
出现:
登录mysql :
创建wordpress用户管理wordpress库。
mysql -uroot -p123456
mysql> create database wordpress;
Query OK, 1 row affected (0.01 sec)
mysql> show databases like 'wordpress';
+----------------------+
| Database (wordpress) |
+----------------------+
| wordpress |
+----------------------+
mysql> grant all on wordpress.* to wordpress@'localhost' identified by '123456';
#创建wordpress用户并授权其管理wordpress库
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
让blog程序连接数据库:
vim /home/application/nginx/html/blog/phpinfo.php
<?php
$link_id=mysql_connect('localhost','wordpress','123456') or mysql_error();
if($link_id){
echo "mysql successful by ceishi";
}else{
echo mysql_error();
}
?>
测试数据库连接:
浏览器输入http://blog.ceishi.com/test_mysql.php
出现mysql successful by ceishi则成功
wordpress连接mysql数据库设置
这里出现因为没有权限创建不了wp-config.php文件。
复制wp-config.php。
cd /home/application/nginx/html/blog/wordpress
rz -y
mv wp-config.php.txt wp-config.php
在数据库中查看wordpress库,这时是空的
mysql> use wordpress;
Database changed
mysql> show tables;
Empty set (0.00 sec)
然后继续,这是在wordpress库中创建表。
这时就把你在浏览器上填创建成wordpress库中的表了。
mysql> show tables;
+-----------------------+
| Tables_in_wordpress |
+-----------------------+
| ls_commentmeta |
| ls_comments |
| ls_links |
| ls_options |
| ls_postmeta |
| ls_posts |
| ls_term_relationships |
| ls_term_taxonomy |
| ls_termmeta |
| ls_terms |
| ls_usermeta |
| ls_users |
+-----------------------+
12 rows in set (0.00 sec)
这时安装完成
这是上传一个照片就会存放在 /uploads/下,因为这个目录对nginx来说可写。
ll /home/application/nginx/html/blog/wordpress/wp-content/uploads/2019/07/
total 40
-rw-r--r-- 1 nginx nginx 2789 Jul 25 11:54 inotify安装步骤-100x100.jpg
-rw-r--r-- 1 nginx nginx 4402 Jul 25 11:54 inotify安装步骤-150x150.jpg
-rw-r--r-- 1 nginx nginx 6009 Jul 25 11:54 inotify安装步骤-300x73.jpg
-rw-r--r-- 1 nginx nginx 19946 Jul 25 11:54 inotify安装步骤.jpg
五、nginx地址重新
nginx地址重写是通过在nginx.conf配置文件server标签中使用rewrite规则来实现的。
rewrite语法:
rewrite 旧的地址 新地址 [选项]
rewrite 放在server标签里location外。
例如:
rewrite ^/(.*) http://www.ceishi.com/$1;
#意思是只要访问根目录下的内容就跳转到www.ceishi.com下的内容,其中$1
#表示前面括号里的内容,括号就是复制的意思
例如:访问www.com就跳转到www.ceishi.com
cat /home/application/nginx/conf/extra/www.conf
server {
listen 80;
server_name www.com;
rewrite ^/(.*) http://www.ceishi.com/$1 permanent ; #permanent代表永久跳转
}
server {
listen 80;
server_name www.ceishi.com;
location / {
root html/www;
index index.html index.htm;
}
access_log logs/access_www.log main;
}
rewrite flag说明:
301跳转结果
# curl -I www.com
HTTP/1.1 301 Moved Permanently #301标志
Server: nginx/1.10.3
Content-Type: text/html
Content-Length: 185
Connection: keep-alive
Location: http://www.ceishi.com/
例如:实现访问http://bbs.ceishi.com/bbs/index.html跳转到http://www.ceishi.com。其中http://www.ceishi.com要有内容。
配置如下:
vim bbs.conf
server {
listen 80;
server_name bbs.ceishi.com;
location / {
root html/bbs;
index index.html index.htm;
}
rewrite ^(.*) http://www.ceishi.com break;#跳到www.ceishi.com下
access_log logs/access_bbs.log main;
}
# curl bbs.ceishi.com #验证
<html>
<head><title>302 Found</title></head>
curl -L bbs.ceishi.com
www.ceishi.com
六,使用php连接mysql
使用php连接mysql
在php编译安装时的参数如下
‘./configure’ ‘–prefix=/usr/local/php’ ‘–with-apxs2=/usr/local/httpd/bin/apxs’ ‘–with-config-file-path=/usr/local/php/etc/’ ‘–with-mysql=/usr/local/mysql’ ‘–with-xmlrpc’ ‘–with-openssl’ ‘–with-zlib’ ‘–with-freetype-dir’ ‘–with-gd’ ‘–with-pdo-mysql’ ‘–enable-soap’ ‘–enable-mbstring=all’ ‘–enable-sockets’ ‘–with-mysqli=/usr/local/mysql/bin/mysql_config’
其中–with-mysqli一定要写上,不然不能使用mysqli连接数据库
例如
<?php
$dbhost = 'localhost'; // mysql服务器主机地址
$dbuser = 'root'; // mysql用户名
$dbpass = '123456'; // mysql用户名密码
$conn = mysqli_connect($dbhost, $dbuser, $dbpass);
if(! $conn )
{
die('连接错误: ' . mysqli_error($conn));
}
echo '连接成功<br />';
$sql = 'CREATE DATABASE RUNOOB';
$retval = mysqli_query($conn,$sql );
if(! $retval )
{
die('创建数据库失败: ' . mysqli_error($conn));
}
echo "数据库 RUNOOB 创建成功\n";
mysqli_close($conn);
?>